delphi 利用回调函数调用VC编写的dllvc中的函数原形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');执行不了! 多谢各位指点。感激不尽!
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');执行不了! 多谢各位指点。感激不尽!
解决方案 »
- 这里有没测试员?测试是用什么工具的?
- 再次求教,关于adsl计时
- 关于用rmreport做主从表问题(100分),着急
- Object Pascal 参考手册,给点建议,这书怎么看啊,我头好晕
- 请教自定义控件的问题。
- 如果做一个类似与qq登录时,在右小角,图标可以来回变的效果?
- 找控件
- 提一个简单的问题:各位在小组开发中,各个进程之间是如何通信的???DDE是不是过时了?现在用什么?
- 谁能告诉我????如何将类做参数传递数据。
- 好奇怪的问题!(一定给分哈)
- 打听一下, Delphi7能开发GoogleEarth的软件吗?
- DELPHI 开发WEBSERVICE,在IIS中浏览时出现以下错误No interface registered for URL '/soap/'
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
);
我现在用delphi调用,您的意思,是VC的dll的问题?
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);
//这样应该就可以了,我就是这么调用的。