请教:VC中如何调用Delphi的DLL中的回调函数!Delphi部分
-------------------------------------------------------
//回调函数定义
TOnMyCallBack = procedure(Data: Pointer; id:Integer) of Object;
//DLL中的导出函数声明
procedure StartCall(param: TOnMyCallBack);
begin
...
...
end;VC部分
-------------------------------------------------------
//定义回调函数原型
typedef void (CALLBACK * MY_Callback)(void * data,int id);
//声明回调函数
void CALLBACK cxxGetDllData(void * data,int id)
{
MessageBox(NULL,"收到数据:","Notice",MB_OK | MB_ICONWARNING);
}//调用部分
void test()
{
//动态加载DLL到当前EXE的进程空间
hDll = LoadLibrary(pszDllName);
if(!hDll)
{
MessageBox(NULL,"加载动态链接库失败!","Notice",MB_OK | MB_ICONWARNING);
return false;
} hStartCall = (void(WINAPI*)(MY_Callback))::GetProcAddress(hDll,"StartCall");
if(!hStartCall)
{
MessageBox(NULL,"获取StartCall函数地址错误!","Notice",MB_ICONWARNING);
return false;
}
hStartCall(cxxGetDllData);
}
编译完全正常,但调用过程中在执行hStartCall(cxxGetDllData)时报"XXX,该内存XXX错误"
请问在VC中应如何调用或声明回调函数原型

解决方案 »

  1.   

    procedure StartCall(Data: Pointer; id:Integer);stdcall;
    begin
    ...
    ...
    end;excepts
      StartCall;
      

  2.   

    主要是调用约定的问题,VC是用的win32标准调用约定,参数从右至左入栈,Object Pascal是从左至右。
    VC偶不熟,如果上面那样不行,你就把
    TOnMyCallBack = procedure(Data: Pointer; id:Integer) of Object;
    改成
    TOnMyCallBack = procedure(Data: Pointer; id:Integer) of Object;stdcall;看看
      

  3.   

    首先搂主的VC编译肯定通不过,猜测一下搂主的想法:
    delphi:
    library test;
    uses
      SysUtils,
      Classes;{$R *.res}
    type
      TOnMyCallBack = procedure(data:pchar; id:Integer);stdcall;procedure StartCall(param: TOnMyCallBack;data:pchar; id:Integer);stdcall;
    begin
       param(data,id);
    end;
    exports  StartCall;begin
    end.
    //vc
    typedef void (CALLBACK * MY_Callback)(void *,char *data,int id);
    void CALLBACK cxxGetDllData(void * data,int id)
    {
        CString ss;
        ss.Format("%s:%d",data,id);
    ::MessageBox(NULL,"收到数据:",ss,MB_OK | MB_ICONWARNING);
    }void CTttDlg::OnOK() 
    {
        HINSTANCE hDll = LoadLibrary("d:\\temp\\test.dll");
    if(!hDll)
    {
    ::MessageBox(NULL,"加载动态链接库失败!","Notice",MB_OK | MB_ICONWARNING);
    return ;
    }
        MY_Callback hStartCall = (MY_Callback) ::GetProcAddress(hDll,"StartCall");
    if(!hStartCall)
    {
    ::MessageBox(NULL,"获取StartCall函数地址错误!","Notice",MB_ICONWARNING);
    return ;
    }
    hStartCall(cxxGetDllData,"123456",100);
       }//全部编译执行通过,不知是否合你的意思!!!
      

  4.   

    非常、非常感谢<zjqyb(风清扬*任它溺水三千,我只取一瓢饮*)>和<pankun(剑神一笑)>但大哥可能不小心忽略了一个重要的细节:procedure (...) of Object;其后的of Object不能少,请再赐教!