Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не получается из dll забрать данные, Помогите пожалуйста 
:(
    Опции темы
Teran
Дата 27.1.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

Репутация: нет
Всего: 3



Вот Dll:
Код

library PhpBBLib;

uses
  SysUtils,Classes,StrUtils,          
  IdHTTP,IdCookieManager,IdGlobal;

{$R *.res}
var
IdHTTP1: TIdHTTP;
IdCookieManager1: TIdCookieManager;

procedure Login(UserName,Pass:string);
var
   str:TStringList;
   HtmlLogin:string;
begin
  str:=TStringList.Create;
     str.Add('username='+UserName);
     str.Add('password='+Pass);
  HtmlLogin:=IdHTTP1.Post('http://!!!!forum!!!!!/login.php?!!1', str);
  str.Free;
end;

function GetInbox(UserName,Pass,ProxyPort,ProxyServer,ProxyUsername,ProxyPassword:string;Proxy,BasicAuthentication:boolean):string;stdcall;
var
StrResult:string;
begin
 Result:='';
 IdHTTP1:=TIdHTTP.Create(nil);
 IdCookieManager1:=TIdCookieManager.Create(nil);
 with IdHTTP1 do
   begin
    MaxLineAction:=maSplit;
    ReadTimeout:=0;
    Port:=0;
    AllowCookies:=True;
    HandleRedirects:=True;
    ProtocolVersion:=pv1_0;
    ProxyParams.BasicAuthentication:=False;
    Request.ContentLength:=100;
    Request.ContentRangeEnd:=0;
    Request.ContentRangeStart:=0;
    Request.ContentType:='text/html';
    Request.Pragma:='no-cache';
    Request.Accept:='text/html, */*';
    Request.AcceptLanguage:='ru';
    Request.BasicAuthentication:=False;
    Request.UserAgent:='Mozilla/3.0 (compatible; Indy Library)';
    HTTPOptions:=[];
    CookieManager:=IdCookieManager1;
  end;

 if Proxy then
   begin
    IdHTTP1.ProxyParams.ProxyPort:=StrToInt(ProxyPort);
    IdHTTP1.ProxyParams.ProxyServer:=ProxyServer;
    if BasicAuthentication then
       begin
        IdHTTP1.ProxyParams.BasicAuthentication:=true;
        IdHTTP1.ProxyParams.ProxyUsername:=ProxyUsername;
        IdHTTP1.ProxyParams.ProxyPassword:=ProxyPassword;
       end else IdHTTP1.ProxyParams.BasicAuthentication:=false;
   end;
 Login(UserName,Pass);    //в начале логинемся
 
StrResult:=IdHTTP1.Get('http://forum!!.ru/privmsg.php?inbox!!!!');  //скачиваем страницу

 IdCookieManager1.Free;
 IdHTTP1.Free;

result:=StrResult;
end;


exports
  GetInbox;

begin
end.


а так вызываю
Код

var
  Form1: TForm1;

implementation

function GetInbox(UserName,Pass,ProxyPort,ProxyServer,ProxyUsername,ProxyPassword:string;Proxy,BasicAuthentication:boolean):string; stdcall; external 'PhpBBLib.dll';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(GetInbox('Teran','!!!!!','80','10.0.0.1','','',true,false));
end;



первый раз даже вроди как приходит но когдаеще нажимаю раз на кнопку выдает ошибки связанные с Dll
может что то неправильно в Dll сделал???
smile
Добавлено @ 18:36
Пишет ошибку "Invalid pointer operation"
Добавлено @ 18:44
Странно но когда в dll в коце вместо result:=StrResult; ставлю result:='';

все прорабатывает без ошибок по нескольку раз, так а каже можно от туда забрать данные?? smile


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
Snowy
Дата 27.1.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



1. IdCookieManager1:=TIdCookieManager.Create(IdHTTP1);
и IdCookieManager1.Free делать ненужно.

2. Все запросы помести в try except, иначе ругаться будут.
В остальном код полностью рабочий.
PM MAIL   Вверх
bems
Дата 27.1.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Когда создаешь новую длл в ее начале делфа помещает большой комментарий. Почитай его.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Teran
Дата 27.1.2006, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

Репутация: нет
Всего: 3



подописывал в uses-ы в начало Sharemem всеравно ругается
Добавлено @ 19:44
Когда ремиш в конце result:=StrResult;

все отлично
Добавлено @ 19:49
оооо ........
Sharemem......... вроди помомогло
Добавлено @ 19:52
да действиьтельно помогло спасибо

а если подключать dll из Builder там тоже нужно первым в h ставить #include <Sharemem.hpp>???????????


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
bems
Дата 27.1.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



БМП






--------------------
Обижено школьников: 8
PM MAIL   Вверх
Poseidon
Дата 27.1.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



В экспортируемых из dll процедур string никогда не стоит использовать. Получите Invalid pointer operation. Именно об этом и написано в комментарии к длл. Используйте ShortString или еще что-нить подходящее


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
bems
Дата 27.1.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



предлагаю изменить так:
Код

function GetInbox(UserName,Pass,ProxyPort,ProxyServer,ProxyUsername,ProxyPassword:string;Proxy,BasicAuthentication:boolean;var TextToCaller:pointer):integer;stdcall;


в конце функции:
Код

GetMem(TextToCaller,length(StrResult));
result:=length(StrResult);
CopyMemory(TextToCaller,pointer(StrResult),result);


тогда вызов функции делаешь так:
Код

var txt:pointer;len:integer;str:string;
....
len:=GetInbox('Teran','!!!!!','80','10.0.0.1','','',true,false,txt);
SetLength(str,len);
CopyMemory(pointer(str),txt,len);
FreeMem(txt,len);
ShowMessage(str);


если не заработает то вместо GetMem/FreeMem используй GlobalAlloc/GlobalFree

Это сообщение отредактировал(а) bems - 27.1.2006, 20:22


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bems
Дата 27.1.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



ЗЫ
Странно что проблема возникает только с возвращаемым значением, а не с параметрами, которые тоже стринг


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Guedda
Дата 27.1.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Я всем предлагаю пользоваться либо Pchar, либо ShortString.
Но к первому больше склонен.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Snowy
Дата 27.1.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Либо просто убираем stdcall.
У меня этот код чудесно работает, если запросы засунуть в try except.
Ну и убийство печенюшек доверить IdHttp1, а не вручную убивать.
PM MAIL   Вверх
Guedda
Дата 27.1.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Цитата(Snowy @ 27.1.2006, 22:13)
Либо просто убираем stdcall.

По-моему, это ни на что не повлияет.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0732 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.