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');执行不了! 多谢各位指点。感激不尽!

解决方案 »

  1.   


    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 
    ); 
      

  2.   

    是 VC的函数错了??
    我现在用delphi调用,您的意思,是VC的dll的问题?
      

  3.   

    //参数类型比较不确定的是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);
    //这样应该就可以了,我就是这么调用的。