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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2009, 00:02   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию DLL и ошибка EInvalidPointer

Вобщем есть код, который я засунул в ДЛЛ:
Код:
library Project1;

uses
  SysUtils,
  Classes,
  IdCookieManager,
  IdHTTP;

{$R *.res}

procedure GetCookie(Head : String; HTTP : TIdHTTP);
var
  i, j : Integer;
  Cookie : String;
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 := Cookie + Copy(Head, i+11, j-i-10);
          break;
        end;
  end;

if Length(Cookie) > 50 then
  begin
    Cookie := '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 Registration(mail, pass : String ; HTTP : TIdHTTP ; CookieMan : TIdCookieManager) : String;
var
  S: String;
  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 := 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(HTTP.Response.RawHeaders.Text, HTTP);
    S := HTTP.Get('http://www.vkontakte.ru/feed2.php');
    if S <> '{"user": {"id": -1}}' then
        Result := S;
  end
else
  Result := 'Error';
DT.Free;
end;

exports
    Registration;

begin
end.
Вызываю я функцию из ДЛЛ вот так:
Код:
function Registration(mail, pass : String ; HTTP : TIdHTTP ; CookieMan : TIdCookieManager) : String; external 'Project1.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := Registration('xxx@mail.ru', 'password', idHTTP1, idCookieManager1);
end;
Проблема в следующем:
Если e-mail и/или password верны, то все отлично работает.
Если e-mail и/или password не верны, то выскакивает ошибка EInvalidPointer.
Но, если методы из ДЛЛ поместить в проект, то как положено срабатывает Result := 'Error'; и в Едит пишется Error.

Кто знает как избавиться от ошибки EInvalidPointer, при вводе неверных данных, используя при этом ДЛЛ ?

З.Ы. Пробовал ставить исключения, все равно эта ошибка.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 26.08.2009, 00:48   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Проблема в менеджере памяти: при возвращении строки из dll память под нее выделяет один менеджер памяти и в основной программе память из под нее пытается освободить другой менеджер.
Решение: подключи первым в списке модулей и программе и dll модуль: shareMem.
+ почти это:
http://www.cyberguru.ru/programming/...ils-page8.html
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 26.08.2009, 01:58   #3
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Daramant вроде все заработало, но.............теперь эта же ошибка стала выскакивать каждый раз при закрытии программы. Что можно с этим сделать?

P.S. Решил проблему, заменив String на PChar.
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 26.08.2009 в 02:34.
spamer вне форума Ответить с цитированием
Старый 26.08.2009, 13:37   #4
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
теперь эта же ошибка стала выскакивать каждый раз при закрытии программы. Что можно с этим сделать?
Странно, по идее, должно работать корректно. Если при завершении программы, значит ошибка при освобождении ресурсов.
Точно shareMem во всех uses первым поставил?
Цитата:
P.S. Решил проблему, заменив String на PChar.
Да, про PChar я забыл тебе сказать.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 26.08.2009, 13:47   #5
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Странно, по идее, должно работать корректно. Если при завершении программы, значит ошибка при освобождении ресурсов.
Точно shareMem во всех uses первым поставил?
Да, точно подключил. Но покопавшись в гугле, я узнал, что не всегда shareMem помогает, т.е. если решена проблема какая то изначальная, то при закрытии будет вылазить все равно ошибка EInvalidPointer. (такой же случай и у меня). Дальше воспользовавшись уже поиском по форуму, увидел совет ,что лучше использовать PChar, и никаких проблем не будет. (можно правда было shortstring, но у меня строка большая).
Вобщем проблема решена. Daramant спасибо.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 26.08.2009, 14:12   #6
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Рад был помочь.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при загрузке dll nikmay Общие вопросы Delphi 10 25.06.2009 15:42
Ошибка при загрузке DLL dani92 Общие вопросы Delphi 12 24.04.2009 14:54
EInvalidPointer Манжосов Денис :) Помощь студентам 1 23.11.2008 21:51
Ошибка в ntdll.dll mutabor Общие вопросы Delphi 1 24.06.2008 14:55