delpi中对象的一个方法能否作为一个参数(回调函数),传递给DLL中的函数.
可以提供实例最好了,谢谢!
可以提供实例最好了,谢谢!
解决方案 »
- 如何取得旺旺聊天窗口的聊天内容?
- 如何让 主线程 等待 一个指定 的 子线程 ?????, 注:等待期间不可 堵塞主线程 !!!!!
- ■■■怎样才能在屏幕上以透明的异型窗体的形式实现OSD(屏幕上的提示,背景是透明的)显示?(就是说用窗体模拟OSD显示)
- 如何实现象QQ那样在一般WINDOWS窗口界面上写信息提交后和远程服务器进行数据交互?
- 关于SQL中的游标
- 怀疑Delphi v7.0 中 TcpServers TcpClient UDP 可能有问题,请高人指教
- 继续昨天标题栏的问题!
- 用delphi操纵excel如:进行统计、过滤、查询、打印,用那种连接方式好?如何连,谢谢
- 能否具体解释一下adoquery1.Parameters[n]等!
- 能否通过数字n直接来使当前记录指向表中的第n条记录?
- 一组字符串和一组数字的保存和传递
- 怎么更新adoquery的当前记录?
type
TCallback = function(AParam: Integer): Integer of object;function Test(Callback: TCallback): Boolean; stdcall;
begin
if Assigned(Callback) then
Callback(1);
end;exports
Test;exe中:
type
TCallback = function(AParam: Integer): Integer of object;function Test(Callback: TCallback): Boolean; stdcall; extranal 'DllName.dll';procedure TForm1.CallBackTest(AParam: Integer);
begin
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Test(CallBackTest);
end;
TCallbackInstance = array [1..18] of Byte; procedure MakeCallbackInstance(var Instance: TCallbackInstance; ObjectAddr: Pointer; FunctionAddr: Pointer);
const CallbackCode: TCallbackInstance =
($8B,$04,$24,$50,$B8,$00,$00,$00,$00,$89,$44,$24,$04,$E9,$00,$00,$00,$00);
begin
Move(CallbackCode, Instance, SizeOf(TCallbackInstance));
PInteger(@Instance[6])^ := Integer(ObjectAddr);
PInteger(@Instance[15])^ := Integer(Integer(FunctionAddr) - Integer(@Instance) - 18);
end;
(2) 在设置回调时,申明一个TCallbackInstance类型变量,然后调用MakeCallbackInstance来生成变量值,将把该变量作为回调函数参数。type
TCallback = function(AParam: Integer): Boolean; function Test(Callback: TCallback): Boolean; stdcall; extranal 'DllName.dll'; procedure TForm1.CallBackTest(AParam: Integer); stdcall; //这个过程应该使用stdcall调用约定
begin
......
end; procedure TForm1.FormCreate(Sender: TObject);
var
Callback : TCallbackInstance;
begin
MakeCallbackInstance(Callback, Self, @TForm1.Callbacktext);
Test(@CallBack);
end;
也就是在普通回调函数中加了第一个参数为Self指针。
我写的东西只适合在Delphi中使用,而3楼写的东西可以在其他语言之间调用,譬如exe用VC写,而dll用Delphi写。
但
procedure TForm1.FormCreate(Sender: TObject);
var
Callback : TCallbackInstance;
begin
MakeCallbackInstance(Callback, Self, @TForm1.Callbacktext);
Test(@CallBack);
end;
中的Callback最好用VirtualProtect()设置成PAGE_EXECUTE的,貌似XP装了SP2之后如果启动的数据执行保护,这样的代码是执行不了的。