c++ dll 中使用vb传入的回调函数问题

xuggzu 2008-03-13 09:42:15
dll中使用的回调函数为CDECL型,而vb传入的回调函数为_stdcall型,请问有什么解决方法??
...全文
99 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
abomber2 2008-03-17
  • 打赏
  • 举报
回复
假如 dll是自己的有源代码就改 dll

没有的话用C++写个转换的代理dll
arong1234 2008-03-15
  • 打赏
  • 举报
回复
2楼说法不对,调用约定不同会破坏线程堆栈,程序会立刻崩溃
arong1234 2008-03-15
  • 打赏
  • 举报
回复
线程函数的类型是定死的,vb的函数原型也是定死的。你不能直接用VB的函数做。你需要写一个proxy函数来转换,如:


typedef UINT(*__stdcall VBFunc)(LPVOID);
struct ProxyData
{
VBFunc func;
LPVOID pData;
};

UINT ThreadFunc(LPVOID param)
{
VBFunc func;
LPVOID data;
ProxyData * proxy=(ProxyData)param;
func = proxy->func;
data = proxy->data;
delete proxy;
return func(data);
}

void Call(VBFunc func1, LPVOID param)
{
ProxyData* pData=new ProxyData;
pData->func = func1;
pData->data = param;
AfxBeginThread(ThreadFunc, pData);
}


代码没测试过,因此可能有错,但是大方向应该如此
sunlin7 2008-03-15
  • 打赏
  • 举报
回复
可以用__stdcall 或者__cdecl来指定函数的调用类型嘛, MS C++默认函数是__cdecl, 默认回调函数是__stdcall.
  • 打赏
  • 举报
回复
能呀按照函数原型写函数就可以了
xuggzu 2008-03-13
  • 打赏
  • 举报
回复
...那只好换线程函数了,请问vb能传入dll一个函数作为线程函数吗?如果可以,麻烦给个例子代码。。。谢谢
  • 打赏
  • 举报
回复
没有办法,只能修改dll的代码了
这个依赖编译器的。
xuggzu 2008-03-13
  • 打赏
  • 举报
回复
之所以提这个问题,是因为dll中一个函数使用的回调函数为_cdecl,我想用vb的回调替换它,但是vb传入的函数都为_stdcall,我使用强制转换:(_cdecl)调用就出错/崩溃;如果不转换,dll编译又提示错误,。。。。
ouyh12345 2008-03-13
  • 打赏
  • 举报
回复
再说了,每个函数都有自己的调用约定,与其它函数不同,也不影响调用
ouyh12345 2008-03-13
  • 打赏
  • 举报
回复
回调函数都是__stdcall约定的

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧