delphi 利用回调函数调用VC编写的dll

piaolingfeihu 2009-10-30 12:11:28
delphi 利用回调函数调用VC编写的dll

vc中的函数原形

typedef
VOID
( *ENUM_OPENED_HANDLE_CALL_BACK ) (
IN HANDLE hProcess,
IN TCHAR* ObjectTypeName,
IN TCHAR* ObjectName,
IN ULONG HandleValue,
IN PVOID Context
);

MYLIBAPI BOOL
EnumProcessOpenedHandleEx(
IN HANDLE hProcess,
IN ULONG ProcessID,
IN ENUM_OPENED_HANDLE_CALL_BACK CallBack,
IN PVOID Context
);

我现在用delphi代码来做调用,我的回调函数是这么写的,请大家帮我看看那儿出错了?
//声明部分
ENUM_OPENED_HANDLE_CALL_BACK = procedure (
hProcess : THandle;
var ObjectTypeName : PWchar ;
var ObjectName : PWchar ;
HandleValue: ULONG;
Context :Pointer );stdcall;

tTestDll = function(
hProcess: THandle;
ProcessID: ULONG;
CallBack : ENUM_OPENED_HANDLE_CALL_BACK;
Context: Pointer): Boolean of object; stdcall;

//回调函数
procedure CallBack1(hProcess : THandle;
var ObjectTypeName : PWchar ;
var ObjectName : PWchar ;
HandleValue: ULONG;
Context :Pointer); stdcall;
begin
ShowMessage('OK');
end;


调用过程:
procedure TForm1.btn1Click(Sender: TObject);
var
Dllhandle: THandle;
func: tTestDll;
aBool: Boolean;
strlist: TStringList;
i: Integer;
bbb: WideString;
Chandle : THandle;
aaa : WideString;
// callback : ENUM_OPENED_HANDLE_CALL_BACK;
begin
caption := GetPID('QQ.exe');
//进程的句柄
PeocessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, StrToInt(GetPID('QQ.exe'))); //获取进程句柄

Label1.Caption := IntToStr(PeocessHandle);

strlist := TStringList.Create;
try
Dllhandle := LoadLibrary('DllProc.dll');
@func := GetProcAddress(Dllhandle, 'EnumProcessOpenedHandleEx');
if @func <> nil then
begin
Chandle := StrToInt(GetPID('QQ.exe')); //进程的PID
aBool := func(PeocessHandle, Chandle, callback1, nil);

// aBool := func(GetCurrentProcess(), GetCurrentProcessId(), callback1, nil);
if aBool = True then
begin
ShowMessage('success.');
end;
end;
finally
FreeAndNil(strlist);
end;
end;

请各位高手帮忙指点下,那儿出了问题,现在的问题:

callback1这个函数里面始终进步去,'EnumProcessOpenedHandleEx'函数是通过了。
ShowMessage('success.');可以执行,
但是
callback1中的
ShowMessage('OK');执行不了!

多谢各位指点。感激不尽!
...全文
222 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
buding79 2010-01-18
  • 打赏
  • 举报
回复
//参数类型比较不确定的是IN TCHAR* ,是pchar,还是pwidechar,你可以自己测试一下。另外,函数调用约定,你要看他的定义了,是cdecl,还是stdcall,你应该能看得出来的。需要注意的地方就是回掉函数应该也是要加调用约定的。
type
ENUM_OPENED_HANDLE_CALL_BACK = procedure(hProcess:thandle;ObjectTypeName:PWideChar;ObjectName:PWideChar;HandleValue:ulong;Context:pointer);cdecl;
function EnumProcessOpenedHandleEx(hProcess:thandle;ProcessID:ulong;CallBack:ENUM_OPENED_HANDLE_CALL_BACK;Context:Pointer):boolean;cdecl;external 'dll.dll';

var
fcallback:ENUM_OPENED_HANDLE_CALL_BACK;
//具体函数调用//具体实现函数同样要加函数调用约定
fcallBack:=@你的回掉函数具体实现函数名称
EnumProcessOpenedHandleEx(hProcess,ProcessID,fCallBack,Context);
//这样应该就可以了,我就是这么调用的。
gutiqiang 2009-11-27
  • 打赏
  • 举报
回复
我也遇到同样的问题,解决了吗?
piaolingfeihu 2009-10-30
  • 打赏
  • 举报
回复
各位大大,请帮忙啊,小弟实在是急!
piaolingfeihu 2009-10-30
  • 打赏
  • 举报
回复
是 VC的函数错了??
我现在用delphi调用,您的意思,是VC的dll的问题?
普通网民 2009-10-30
  • 打赏
  • 举报
回复

typedef VOID __stdcall ( *ENUM_OPENED_HANDLE_CALL_BACK ) (
IN HANDLE hProcess,
IN TCHAR* ObjectTypeName,
IN TCHAR* ObjectName,
IN ULONG HandleValue,
IN PVOID Context
);

MYLIBAPI BOOL __stdcall
EnumProcessOpenedHandleEx(
IN HANDLE hProcess,
IN ULONG ProcessID,
IN ENUM_OPENED_HANDLE_CALL_BACK CallBack,
IN PVOID Context
);

piaolingfeihu 2009-10-30
  • 打赏
  • 举报
回复
没有人回答阿,多谢,帮帮忙阿!

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧