Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2009, 14:44   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию Access violation at address при использовании DLL

Есть ДЛЛ:
Код:
library Project1;

uses
  SysUtils,
  Classes,
  StrUtils,
  IdCookieManager,
  IdHTTP;

{$R *.res}

procedure GetCookie(Head : PChar; HTTP : TIdHTTP);
var
  i, j : Integer;
  Cookie : PChar;
begin
Cookie := '';

for i := 1 to Length(Head) do
if Copy(Head, i, 10) = 'Set-Cookie' then
  begin
    for j := i+11 to length(Head) do
      if Head[j] = ';' then
        begin
          Cookie := PChar(Cookie + Copy(Head, i+11, j-i-10));
          break;
        end;
  end;

if Length(Cookie) > 50 then
  begin
    Cookie := PChar('Connection: Keep-Alive'+#13+'Cache-Control: no-cache'+#13+'Cookie: remixchk=5'+'Cookie: ' + Cookie);
    HTTP.Request.CustomHeaders.Clear;
    HTTP.Request.CustomHeaders.Add(Cookie);
  end;
end;

function Autoriz(mail, pass : PChar; HTTP : TIdHTTP ; CookieMan : TIdCookieManager) : Integer; stdcall;
var
  S, ResultStr : PChar;
  Logged : Boolean;
  DT : TStringList;
  i, j, k : Integer;
begin
S := '';
HTTP.HandleRedirects := True;
HTTP.CookieManager := CookieMan;
HTTP.AllowCookies := True;

DT := TStringList.Create;
DT.Add('op=a_login_attempt');
DT.add('email=' + mail);
DT.Add('pass=' + pass);
DT.Add('expire=0');

S := PChar(HTTP.Post('http://www.vkontakte.ru/login.php', DT));

if Pos('good', S) <> 0 then Logged := True;
if S = 'failed' then Logged := False;

if Logged then
  begin
    GetCookie(PChar(HTTP.Response.RawHeaders.Text), HTTP);
    S := PChar(HTTP.Get('http://www.vkontakte.ru/feed2.php'));
    if S <> '{"user": {"id": -1}}' then
      begin
        i := PosEx('id', s, 10);
        j := PosEx(':', s, i);
        k := PosEx('}', s, j);

        i := PosEx('friends', s, k);
        j := PosEx(':', s, i+10);
        k := PosEx('}', s, j);

        i := PosEx('messages', s, k);
        j := PosEx(':', s, i+10);
        k := PosEx('}', s, j);
        ResultStr := PChar(Copy(s, j+1, k-j-1));
        Result :=StrToInt(ResultStr);
      end;
  end
else
  Result := -1;
DT.Free;
end;


exports
    Autoriz;

begin
end.
Если использовать код из длл просто в модуле ,то все работает.

Вызываю длл так:
Код:
function Autoriz(mail, pass : PChar ; HTTP : TIdHTTP ; CookieMan : TIdCookieManager) : Integer; stdcall; external 'Project1.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:= IntToStr(Autoriz(PChar(Edit1.Text), PChar(Edit2.Text), HTTP1, CookieManager1));
end;

end.
При нажатии на кнопку вылетает ошибка
http://s45.radikal.ru/i108/0908/4e/ceb2983da4f3.jpg

Вместо String я везде стал использовать PChar, что бы модуль ShareMem не использовать, т.к. тоже вылетает потом ошибка только другого типа.

Кто знает как избавиться от Access violation at address ?

З.Ы. Пробовал длл вызывать динамически, все равно вылетает Access violation at address.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 27.08.2009, 17:48   #2
lexaltd
Форумчанин
 
Регистрация: 21.07.2008
Сообщений: 192
По умолчанию

Используй Run-time packages , иначе не получится передать объекты ; HTTP : TIdHTTP и CookieMan : TIdCookieManager
Или переноси все объекты в .exe или .dll

Последний раз редактировалось lexaltd; 27.08.2009 в 17:53.
lexaltd вне форума Ответить с цитированием
Старый 27.08.2009, 17:55   #3
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

spamer
Выполни код пошагово, чтобы определить точнее место возникновения исключения.
Так сказать что-то сложно, может выложи пример.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 27.08.2009, 18:05   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

У меня всё работает, возвращает 0 если ввести верные логин/пароль и -1 если нет (indy 10)
пыщь

Последний раз редактировалось JTG; 27.08.2009 в 18:08.
JTG вне форума Ответить с цитированием
Старый 27.08.2009, 22:19   #5
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Парни спасибо всем.
Действительно, перекинул это все чудо я в Делфи 9, вроде заработало. Но так как lexaltd сказал ,что объекты лучше не передавать, в качестве параметров функции, я переделал вот так длл:
Код:
library ProjectDLL;

uses
  SysUtils,
  Classes,
  StrUtils,
  IdCookieManager,
  IdHTTP;

{$R *.res}

procedure GetCookie(Head : PChar; HTTP : TIdHTTP);
var
  i, j : Integer;
  Cookie : PChar;
begin
Cookie := '';

for i := 1 to Length(Head) do
if Copy(Head, i, 10) = 'Set-Cookie' then
  begin
    for j := i+11 to length(Head) do
      if Head[j] = ';' then
        begin
          Cookie := PChar(Cookie + Copy(Head, i+11, j-i-10));
          break;
        end;
  end;

if Length(Cookie) > 50 then
  begin
    Cookie := PChar('Connection: Keep-Alive'+#13+'Cache-Control: no-cache'+#13+'Cookie: remixchk=5'+'Cookie: ' + Cookie);
    HTTP.Request.CustomHeaders.Clear;
    HTTP.Request.CustomHeaders.Add(Cookie);
  end;
end;

function Autoriz(mail, pass : PChar) : Integer; stdcall;
var
  S, ResultStr : PChar;
  Logged : Boolean;
  DT : TStringList;
  i, j, k : Integer;
  HTTP : TIdHTTP ;
  CookieMan : TIdCookieManager;
begin
HTTP := TIdHTTP.Create;
HTTP.AllowCookies := True;
HTTP.CookieManager := CookieMan;
HTTP.HandleRedirects := True;
HTTP.ProtocolVersion := pv1_1;
HTTP.ProxyParams.BasicAuthentication := True;
HTTP.ProxyParams.ProxyPort := 0;
HTTP.RedirectMaximum := 15;

CookieMan := TIdCookieManager.Create;

S := '';

DT := TStringList.Create;
DT.Add('op=a_login_attempt');
DT.add('email=' + mail);
DT.Add('pass=' + pass);
DT.Add('expire=0');

S := PChar(HTTP.Post('http://www.vkontakte.ru/login.php', DT));

if Pos('good', S) <> 0 then Logged := True;
if S = 'failed' then Logged := False;

if Logged then
  begin
    GetCookie(PChar(HTTP.Response.RawHeaders.Text), HTTP);
    S := PChar(HTTP.Get('http://www.vkontakte.ru/feed2.php'));
    if S <> '{"user": {"id": -1}}' then
      begin
        i := PosEx('id', s, 10);
        j := PosEx(':', s, i);
        k := PosEx('}', s, j);

        i := PosEx('friends', s, k);
        j := PosEx(':', s, i+10);
        k := PosEx('}', s, j);

        i := PosEx('messages', s, k);
        j := PosEx(':', s, i+10);
        k := PosEx('}', s, j);
        ResultStr := PChar(Copy(s, j+1, k-j-1));
        Result :=StrToInt(ResultStr);
      end;
  end
else
  Result := -1;

HTTP.Disconnect;
HTTP.Free;
CookieMan.Free;
DT.Free;
end;


exports
    Autoriz;

begin
end.
Только меня интересует еще 1 вопрос, нече что я в процедуру GetCookie передаю HTTP : TIdHTTP, который был создан в функции? Или надо было в процедуре создавать свой объект TIdHTTP ?

З.Ы. Извините за такие тупые вопросы, просто меня эти ошибки задолбали уже.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
access violation at address UnChanter Общие вопросы Delphi 22 07.02.2011 11:00
Access violation at address... Ralf_ru Помощь студентам 13 05.04.2009 05:20
Access violation at address при выполнении end elsin Общие вопросы Delphi 5 30.01.2009 10:29
Access violation at address.. RegentM Общие вопросы Delphi 4 01.11.2007 03:46
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Fen1x Общие вопросы Delphi 8 13.10.2007 20:13