Главная страница
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.065 c
4-1163658294
Out
2006-11-16 09:24
2007.04.01
Убийство процесса


2-1173426039
wwwrr
2007-03-09 10:40
2007.04.01
constructor


2-1173861867
Нуб
2007-03-14 11:44
2007.04.01
Ручная ли это процедура иль ее создал кто ?


15-1173161727
Alkid
2007-03-06 09:15
2007.04.01
Кратифф на тему названий техники (не мой)


15-1173014043
dreamse
2007-03-04 16:14
2007.04.01
Помогите разобраться с проблемой