佚名通过本文主要向大家介绍了vc 回调函数,vc dll反编译,vc dll反编译工具,c dll 回调函数,delphi dll 回调等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: VC编译的DLL回调VB函数出错
描述:
在VC DLL中的函数定义如下:
VB中的代码如下
解决方案1:
描述:
本帖最后由 weichaogui 于 2011-01-07 15:53:48 编辑
本人用VC6做了一个Win32标准DLL供VB6使用,DLL中用回调函数的形式来通知触发事件。DLL中导出的函数VB6都可正常使用,一旦在VB6中定义了回调函数,然后把这个函数的地址传回DLL中调用就程序蹦溃。DLL中没有涉及多线程。哪位有这方面经验的烦麻指点一下。若有相关的简单示例,请发一份给我,谢谢。俺的E-Mail: weichaogui@163.com在VC DLL中的函数定义如下:
//回调函数定义
typedef int (CALLBACK *CALLBACKFUNCTION) (int a, int b);
//回调函数指针
CALLBACKFUNCTION g_lpCallBack = NULL;
//设置回调函数
extern "C" void __stdcall SetCallBack(CALLBACKFUNCTION lpCallBack)
{
g_lpCallBack = lpCallBack;
//回调函数设置成功,这里一调用就出错
int c = g_lpCallBack(1, 2);
}
VB中的代码如下
'-----------------------------
'在Module文件中导入DLL函数
'-----------------------------
'设置回调函数
Declare Function SetCallBack Lib "../Bin/CallBackDll.dll" (ByVal lpCallBack As Long)
'回调函数
Function MyCallBack(ByVal a As Long, ByVal b As Long) As Long
Dim c As Long
c = a + b
MyCallBack = c
End Function
'-------------------------
'在From中设置回调函数
'-------------------------
'回调函数地址
Dim lpCallBack As Long
'获取回调函数地址
Function GetCallBack(ByVal lpCallBack As Long) As Long
GetCallBack = lpCallBack
End Function
'设置回调函数
Private Sub btnSetCallBack_Click()
lpCallBack = GetCallBack(AddressOf MyCallBack)
SetCallBack (lpCallBack)
End Sub
解决方案1:
typedef int (CALLBACK *CALLBACKFUNCTION) (int a, int b);
改为
typedef int (CALLBACK __stdcall (*CALLBACKFUNCTION)) (int a, int b);
试试,呵呵
感觉给vb的东西还是做成COM,你这种方式能否成功还真不知道
解决方案3:回调函数的堆栈调用约定是否一致呢,如果不一致在debug版本中检测堆栈平衡时就会发现错误导致出错.
解决方案4:可以把PBYTE等转成数组等,然后用VARIANT等,VB中在转换
解决方案5:VB的回调,VC不一定方便调用,可以考虑用其他进程通信方式等.
解决方案6:还没这样用过,只是VC写DLL供VB使用,没有函数传递都是参数传递