delphi 利用回调函数调用VC编写的dll
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');执行不了!
多谢各位指点。感激不尽!