Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.01;
Скачать: CL | DM;

Вниз

реализация Callback вызова из DLL: не выходит каменный цветочек..   Найти похожие ветки 

 
savva ©   (2006-11-14 19:09) [0]

Вообщем приспичило сделать DLL которой передается указатель на процедуру, которую надо вызвать в нужный момент (кодом из DLL). Ну че то у меня не выходит.
основные моменты:

var
 callBackProc: TFarProc; // указатель на нужную процедуру

procedure initCBPointer(p: Pointer); stdcall; external "testDLL";// утанавливает указатель на нужную процедуру
procedure TestCall; stdcall; external "testDLL"; // просто для проверки

procedure testProc(const p: Pchar); { это вызываемая процедура }
begin
 ShowMessage(StrPas(p));// до сюда даже не доходит:)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 callBackProc := MakeProcInstance(@testProc, hInstance);
 initCBPointer(callBackProc); // инициализируем
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FreeProcInstance(callBackProc);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TestCall; // вызываем
end;

соответственно код DLL

type
 PCallbackProc = ^TCallbackProc;
 TCallbackProc = procedure(p :PChar);stdcall;

var
 saveCBProc : PCallbackProc;

 
procedure initCBPointer(cbProc: Pointer); stdcall;
begin
 saveCBProc := cbProc;
end;

procedure TestCall; stdcall;
var
 tmp : Pchar;
begin
 getMem(tmp, 4);
 try
   StrPCopy(tmp,"test");
   saveCBProc^(tmp);
 finally
   FreeMem(tmp);
 end;
end;


ЗЫ. Вот уж не думал что спрошу на эту тему. Стыдно, млин:)
ЗЫЫ. исходники тестового проекта http://www.webfile.ru/1191680


 
Eraser ©   (2006-11-14 19:46) [1]

> callBackProc := MakeProcInstance(@testProc, hInstance);

лишнее. достаточно initCBPointer(@callBackProc);

> procedure testProc(const p: Pchar); { это вызываемая процедура
> }
> begin
> ShowMessage(StrPas(p));// до сюда даже не доходит:)
> end;

должна быть объявлена как stdcall, судя по логике программы.

> FreeProcInstance(callBackProc);

лишнее.


 
savva ©   (2006-11-14 19:50) [2]

>> Eraser ©   (14.11.06 19:46) [1]
изначально так все и было - перестраховался, ибо не выходило..
stdcall было и убирал..

ЗЫ. Возможно имеет смысл объявить ОС: WinXP, Win2003 Server


 
savva ©   (2006-11-14 19:51) [3]

попробуй прогнать тестовый проект, а?


 
Eraser ©   (2006-11-14 19:56) [4]

> [2] savva ©   (14.11.06 19:50)

нет, тут не в системе дело.

>   saveCBProc^(tmp);

"^" возможно здесь и ошибка, лучше не использовать PCallbackProc.
код до туда и после выполняется?


 
savva ©   (2006-11-14 20:05) [5]

выполняется.. а что криминального в таком определении?


 
Eraser ©   (2006-11-14 21:02) [6]

> [5] savva ©   (14.11.06 20:05)
> выполняется.. а что криминального в таком определении?

скорее всего то, что если уж так делать,
то нужно вместо

> procedure initCBPointer(cbProc: Pointer); stdcall;
> begin
> saveCBProc := cbProc;
> end;

писать
procedure initCBPointer(cbProc: Pointer); stdcall;
begin
 New(saveCBProc);
 saveCBProc^ := cbProc;
end;

а вообще лучше убрать эти заморочки с указателями, лишнее никому не нужно нагромаждение.


 
Eraser ©   (2006-11-14 21:04) [7]

ЗЫ
потестил с

> procedure initCBPointer(cbProc: Pointer); stdcall;
> begin
> New(saveCBProc);
> saveCBProc^ := cbProc;
> end;

и без PCallbackProc вообще - прекрасно работает.

ЗЗЫ
не забудьте раставить где надо stdcall.


 
savva ©   (2006-11-14 22:13) [8]

да уж:) веки живи, век учись - дураком помрешь:)

Спасибо  большое...

ЗЫ. придется заново начинать процесс самообучения по части указателей:)


 
Eraser ©   (2006-11-15 00:42) [9]

> [8] savva ©   (14.11.06 22:13)


> Спасибо  большое...

не за что!

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

> saveCBProc^(tmp);

на
TCallbackProc(saveCBProc)(tmp);
только, опять же, в чем тогда тайный смысл использования типизированного указателя, когда он используется как нетипизировнный ))



Страницы: 1 вся ветка

Текущий архив: 2007.04.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.06 c
15-1173086710
Mozart
2007-03-05 12:25
2007.04.01
Проблема с загрузкой windows


11-1153760523
Alexei6021
2006-07-24 21:02
2007.04.01
Печать в KOL


15-1173439194
Sapos
2007-03-09 14:19
2007.04.01
InterBase


2-1173767179
Sw
2007-03-13 09:26
2007.04.01
число записывается в базу в научном формате


15-1173262964
Kok
2007-03-07 13:22
2007.04.01
const