我用VB调 用VC++写的Dll
我调试时候当然走到调用到VC++的这个函数时候为什么我的Vb程序会死了。提示
   VB6.0产生了错误,会被windows关闭。您需重新启动程序。这是为什么呀。

解决方案 »

  1.   

    是生明的时候吗?提意把C++的DLL卸了,重新编译在加上去试试
      

  2.   

    C++的Dll怎么卸呀,C++的Dll都不用注册的。
    我也试过了把这个Dll先删除了。然后在用VC++去重新编译然后还是一样。
      

  3.   

    这个有很多情况了,你dll是不是正确,能在VC中调试通过吗?
      

  4.   

    你先确认DLL是不是正确的.你编译的时候要用static link mode(静态连接模式)
      

  5.   

    我用VC++去调用就没有问题,然后用到VB中调用就会出现这些问题,编译的时候也是用static link mode(静态连接模式)
      

  6.   

    参数传入的类型错误或者函数声明错误,总之你要确认你的DLL本身是否有问题,调用参数是否相符
      

  7.   

    楼上的说的都有道理。
    还有几个问题要注意
    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。注意数据类型差异。
      

  8.   

    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错在哪里??
      

  9.   

    BOOL _stdcall vnt2tbx(LPSTR inputFileName, LPSTR outputFilePath)
    {
    return true;
    }
      

  10.   

    TO: qiqi5521(琪琪) 
    CString 和 LPSTR 有什么区别
    在VC++中的这个函数中有return true
      

  11.   


    CString是一个类,LPSTR是一个指针VB中的
    byval outputFilePath As String,传过去的是字符串指针,所以它和LPSTR相容
      

  12.   

    TO: qiqi5521(琪琪) 
    那在VC++中用Cstring这样用VB调用会出现什么问题呢。谢谢!!我试试
      

  13.   

    CString是一个类,LPSTR是一个指针,VB中的字符串其实也是个指针
    所以VB字符串只和VC中的LPSTR相容。
      

  14.   

    注意参数的传递 
    使用函数指针的局限与风险
    使用函数指针是有风险的。每当调用 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 语句来实现。