请教: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中应如何调用或声明回调函数原型
-------------------------------------------------------
//回调函数定义
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中应如何调用或声明回调函数原型
解决方案 »
- 在一个窗体中如何去掉系统图标,保留最小化,最大化,关闭按钮?
- WIN9x系统有没有页目录和页表之分?如有用SOFTICE怎样查看?
- 高分求教:如何把Recordset当成内存表使用?ADO高手请进来讨论讨论
- 我用olecontainer显示autocad的dwg文件,可是它提示我‘不一致的函数属性’
- 如何對DBGRID中的單條數據逕行修改?
- RAVE使用中如何在用脚本生成的dataTExt中添加事件代码?
- 我的程序在别人的机器上运行不到
- 为什么单独运行正确,但跟踪调试会出问题?
- 如何修改单击TCombobox的小三角按钮的缺省过程?
- 如何学习Delphi
- 简单问题困绕多时
- 关于日期格式的问题:
begin
...
...
end;excepts
StartCall;
VC偶不熟,如果上面那样不行,你就把
TOnMyCallBack = procedure(Data: Pointer; id:Integer) of Object;
改成
TOnMyCallBack = procedure(Data: Pointer; id:Integer) of Object;stdcall;看看
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);
}//全部编译执行通过,不知是否合你的意思!!!