VB调 用VC++的Dll问题 我用VB调 用VC++写的Dll我调试时候当然走到调用到VC++的这个函数时候为什么我的Vb程序会死了。提示 VB6.0产生了错误,会被windows关闭。您需重新启动程序。这是为什么呀。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是生明的时候吗?提意把C++的DLL卸了,重新编译在加上去试试 C++的Dll怎么卸呀,C++的Dll都不用注册的。我也试过了把这个Dll先删除了。然后在用VC++去重新编译然后还是一样。 这个有很多情况了,你dll是不是正确,能在VC中调试通过吗? 你先确认DLL是不是正确的.你编译的时候要用static link mode(静态连接模式) 我用VC++去调用就没有问题,然后用到VB中调用就会出现这些问题,编译的时候也是用static link mode(静态连接模式) 参数传入的类型错误或者函数声明错误,总之你要确认你的DLL本身是否有问题,调用参数是否相符 楼上的说的都有道理。还有几个问题要注意1。就是调用约定的问题, VB 只支持 _stdcall 调用约定,而 VC++中的函数默认的调用约定是 _cdecl ,所以要在 VC DLL 中导出函数供 VB 使用,就必须 显式的指明 _stdcall 调用约定。(所谓调用约定,就是一套规范,规定了参数怎么传递,由谁来平衡堆栈等一套约定,如果主调者和被调函数的调用约定不匹配,就会导致参数传递错误和堆栈溢出等一系列问题)实例:unsigned long _stdcall ShL32(unsigned long Num ,long BitNum){//左移,Num 是待移位变量,BitNum 是 移位的位数 return (Num << BitNum);}2。在 *.def 文件中,必须列出输出函数的函数名,以强制 VC++ 系统将输出函数的装饰名(decorated name)改成普通的函数名。实例:EXPORTS ; Explicit exports can go here ShL32 ShR32 ShL32_1bit ShR32_1bit ShL16 ShR163。注意数据类型差异。 VC++的函数接口如下Bool vnt2tbx(CString inputFileName, CString outputFilePath);我用VB调用如下Private Declare Function vnt2tbx Lib "dll.dll" (ByVal inputFileName As String, outputFilePath As String) As BooleanPrivate Sub Command1_Click() Dim bolYY As Boolean bolYY = vnt2tbx(FilePath, App.Path & "\File\") '程序一到这里就提示VB6.0产生了错误, 会被windows关闭。您需重新启动程序。End Sub错在哪里?? BOOL _stdcall vnt2tbx(LPSTR inputFileName, LPSTR outputFilePath){ return true;} TO: qiqi5521(琪琪) CString 和 LPSTR 有什么区别在VC++中的这个函数中有return true CString是一个类,LPSTR是一个指针VB中的byval outputFilePath As String,传过去的是字符串指针,所以它和LPSTR相容 TO: qiqi5521(琪琪) 那在VC++中用Cstring这样用VB调用会出现什么问题呢。谢谢!!我试试 CString是一个类,LPSTR是一个指针,VB中的字符串其实也是个指针所以VB字符串只和VC中的LPSTR相容。 注意参数的传递 使用函数指针的局限与风险使用函数指针是有风险的。每当调用 DLL 的时候,就失去了 Visual Basic 开发环境的稳定性,使用函数指针的危险性就更大了,因为它很容易导致应用程序失败并因此而丢失已完成的工作。在工作的时候必须经常地保存和备份工作成果。下面列出了使用函数指针的一些注意事项: 调试。在中断模式下,如果应用程序引发了回调函数,那么回调函数将被正常执行,但是断点和单步设置将被忽略。如果回调函数产生了异常,则可以捕捉到它并返回当前值。在中断模式下,如果堆栈上有回调函数,那么禁止复位。形实转换程序。形实转换是 Windows 实现代码重定位的手段。如果在中断模式下删除回调函数,它的形实转换程序将被修改返回 0。该值通常总是正确的,但是也有意外的情况。如果在中断模式下先删除了一个回调函数,然后又再次将其加入,那么有些被调用者可能对新的函数地址一无所知。在 .exe 中不使用形实转换程序,指针被直接传递到入口点。被传递的函数的签名有误。如果函数的参数个数与调用者期望的不一致,或者在调用某个参数时错误地使用 ByRef 或 ByVal,则应用程序可能会失败。因此,在传递函数时签名一定要正确。将函数传递给不存在的 Windows 过程。在对某个窗口进行子类派生的时候,需要将一个函数指针作为 Windows 过程 (WindowProc) 传递给 Windows。但是,在 IDE 中运行应用程序时,在调用 WindowProc 时下一层函数可能已经被破坏了。这可能导致一般性保护错误,并使 Visual Basic 开发环境遭到破坏。不支持“Basic 到 Basic”的函数指针。在 Visual Basic 的内部不能传递指向 Visual Basic 函数的指针。目前,只支持从 Visual Basic 到 DLL 函数的指针。回调过程中包含错误。回调过程中的任何错误都不应回传最初调用它的外部过程,这是很重要的。可以通过在回调过程的开始加上 On Error Resume Next 语句来实现。 vb.net添加mmcontrol VB+ACCESS里对象数据类型为文本如何取 GetCursorPos 问题 VB6.0调用存储过程时提示Timeout expired,以前都很正常,现在突然冒出这个问题来了,急! 请问一个关于文本文件导入数据库的问题,简单,高手赐教! 请问上海的VB程序员收入大概多少? 封装 有没有新疆的人和我说句话 请教关于API查找句柄的问题 送分,谁能够把scut的原来英文拼出来拿全分!! Text控件问题!!!在线等!!急! 新手!!100分急求简单的DLL程序段~~谢谢
我也试过了把这个Dll先删除了。然后在用VC++去重新编译然后还是一样。
还有几个问题要注意
1。就是调用约定的问题, VB 只支持 _stdcall 调用约定,而 VC++中的函数默认的调用约定是 _cdecl ,所以要在 VC DLL 中导出函数供 VB 使用,就必须 显式的指明 _stdcall 调用约定。
(所谓调用约定,就是一套规范,规定了参数怎么传递,由谁来平衡堆栈等一套约定,如果主调者和被调函数的调用约定不匹配,就会导致参数传递错误和堆栈溢出等一系列问题)
实例:
unsigned long _stdcall ShL32(unsigned long Num ,long BitNum)
{//左移,Num 是待移位变量,BitNum 是 移位的位数
return (Num << BitNum);
}
2。在 *.def 文件中,必须列出输出函数的函数名,以强制 VC++ 系统将输出函数的装饰名(decorated name)改成普通的函数名。
实例:EXPORTS
; Explicit exports can go here
ShL32
ShR32
ShL32_1bit
ShR32_1bit
ShL16
ShR16
3。注意数据类型差异。
Bool vnt2tbx(CString inputFileName, CString outputFilePath);
我用VB调用如下
Private Declare Function vnt2tbx Lib "dll.dll" (ByVal inputFileName As String, outputFilePath As String) As BooleanPrivate Sub Command1_Click()
Dim bolYY As Boolean
bolYY = vnt2tbx(FilePath, App.Path & "\File\") '程序一到这里就提示VB6.0产生了错误, 会被windows关闭。您需重新启动程序。End Sub错在哪里??
{
return true;
}
CString 和 LPSTR 有什么区别
在VC++中的这个函数中有return true
CString是一个类,LPSTR是一个指针VB中的
byval outputFilePath As String,传过去的是字符串指针,所以它和LPSTR相容
那在VC++中用Cstring这样用VB调用会出现什么问题呢。谢谢!!我试试
所以VB字符串只和VC中的LPSTR相容。
使用函数指针的局限与风险
使用函数指针是有风险的。每当调用 DLL 的时候,就失去了 Visual Basic 开发环境的稳定性,使用函数指针的危险性就更大了,因为它很容易导致应用程序失败并因此而丢失已完成的工作。在工作的时候必须经常地保存和备份工作成果。下面列出了使用函数指针的一些注意事项: 调试。在中断模式下,如果应用程序引发了回调函数,那么回调函数将被正常执行,但是断点和单步设置将被忽略。如果回调函数产生了异常,则可以捕捉到它并返回当前值。在中断模式下,如果堆栈上有回调函数,那么禁止复位。
形实转换程序。形实转换是 Windows 实现代码重定位的手段。如果在中断模式下删除回调函数,它的形实转换程序将被修改返回 0。该值通常总是正确的,但是也有意外的情况。如果在中断模式下先删除了一个回调函数,然后又再次将其加入,那么有些被调用者可能对新的函数地址一无所知。在 .exe 中不使用形实转换程序,指针被直接传递到入口点。
被传递的函数的签名有误。如果函数的参数个数与调用者期望的不一致,或者在调用某个参数时错误地使用 ByRef 或 ByVal,则应用程序可能会失败。因此,在传递函数时签名一定要正确。
将函数传递给不存在的 Windows 过程。在对某个窗口进行子类派生的时候,需要将一个函数指针作为 Windows 过程 (WindowProc) 传递给 Windows。但是,在 IDE 中运行应用程序时,在调用 WindowProc 时下一层函数可能已经被破坏了。这可能导致一般性保护错误,并使 Visual Basic 开发环境遭到破坏。
不支持“Basic 到 Basic”的函数指针。在 Visual Basic 的内部不能传递指向 Visual Basic 函数的指针。目前,只支持从 Visual Basic 到 DLL 函数的指针。
回调过程中包含错误。回调过程中的任何错误都不应回传最初调用它的外部过程,这是很重要的。可以通过在回调过程的开始加上 On Error Resume Next 语句来实现。