我在调用一个DLL的时候,一调用VB就出错,进入VB6调试,说034D207D fld  qword ptr [edx+ecx*8]这条语句有错误,老是提示: 线程 'Win32 线程' (0x614) 已退出,返回值为 0 (0x0)。
       VB6.EXE 中的 0x034d207d 处未处理的异常: 0xC0000005: 读取位置 0x00143000 时发生访问冲突。
请问这是怎么回事呢?谢谢各位了!

解决方案 »

  1.   

    列出以下内容,便于大家帮你:
    1、调用的DLL函数的原形声明
    2、你在VB中的函数声明
    3、你在VB中的调用传参方式及数据
      

  2.   

    这是C语言中的定义:
    void search(const double *Buf, int32_t nP, double minW, double Inc, double th, double thre, double Level, double shold, int32_t maxs, int32_t *n_s, double *p_s, double *p_l);
    我用vb翻译为:
    Private Declare Function search Lib "MyDLL.dll"(ByRef Buf() As Double,ByVal nP As Long, ByVal minW As Double, ByVal Inc As Double, ByVal th As Double,ByVal thre As Double, ByVal Level As Double, ByVal shold As Double,ByVal maxs As Long, ByVal n_s As Long, ByRef p_s() As Double, ByRef p_l() As Double)Private Sub Command1_Click()    Dim Peak As Long, P_Y(550) As Double, P_X(550) As Double, y_q(1026) As Double, maxs As Long    Peak = 10000
        maxpeaks = 3000
        search y_q, 512, 1520, 0.005, 0.1, -50, 3, -6, maxs, Peak, P_Y, P_X
    End Sub
      

  3.   

    Private Declare Function search Lib "MyDLL.dll" _
           (ByRef Buf As Double, _
            ByVal nP As Long, _
            ByVal minW As Double, _
            ByVal Inc As Double, _
            ByVal th As Double, _
            ByVal thre As Double, _
            ByVal Level As Double, _
            ByVal shold As Double, _
            ByVal maxs As Long, _
            ByRef n_s As Long, _
            ByRef p_s As Double, _
            ByRef p_l As Double)Private Sub Command1_Click()
        Dim Peak As Long, maxs As Long
        Dim P_Y(550) As Double, P_X(550) As Double, y_q(1026) As Double    Peak = 10000
        maxpeaks = 3000
        search y_q(0), 512, 1520, 0.005, 0.1, -50, 3, -6, maxs, Peak, P_Y(0), P_X(0)
    End Sub
      

  4.   

    这是C语言中的定义: 
    void search(const double Buf[], int32_t nP, double minW, double Inc, double th, double thre, double Level, double shold, int32_t maxs, int32_t *n_s, double p_s[], double p_l[]); 
    我用vb翻译为: 
    Private Declare Function search Lib "MyDLL.dll"(ByRef Buf() As Double,ByVal nP As Long, ByVal minW As Double, ByVal Inc As Double, ByVal th As Double,ByVal thre As Double, ByVal Level As Double, ByVal shold As Double,ByVal maxs As Long, ByVal n_s As Long, ByRef p_s() As Double, ByRef p_l() As Double) Private Sub Command1_Click()     Dim Peak As Long, P_Y(550) As Double, P_X(550) As Double, y_q(1026) As Double, maxs As Long     Peak = 10000 
        maxs = 3000 
        search y_q, 512, 1520, 0.005, 0.1, -50, 3, -6, maxs, VarPtr(Peak), P_Y, P_X 
    End Sub
      

  5.   

    VB 数组是 SAFEARRAY,不匹配。
    不确定在 C 中 double Buf[] 参数是否就是一个 Double 指针,否则根本无法用 VB 调用;你看 MSDN 中的 API 原型,通常总是 double *Buf 形式的参数。
      

  6.   

    我用vb翻译为: 
    Private Declare Function search Lib "MyDLL.dll"(ByVal Buf As Double,ByVal nP As Long, ByVal minW As Double, ByVal Inc As Double, ByVal th As Double,ByVal thre As Double, ByVal Level As Double, ByVal shold As Double,ByVal maxs As Long, ByRef n_s As Long, ByVal p_s As Double, ByVal p_l As Double) Private Sub Command1_Click()     Dim Peak As Long, P_Y(550) As Double, P_X(550) As Double, y_q(1026) As Double, maxs As Long     Peak = 10000 
        maxs = 3000 
        search y_q(0), 512, 1520, 0.005, 0.1, -50, 3, -6, maxs, Peak, P_Y(0), P_X (0)
    End Sub现在出现:
    “VB6.EXE”: 已加载“C:\WINDOWS\system32\apphelp.dll”,未加载任何符号。
    VB6.EXE 中的 0x034d2192 处未处理的异常: 0xC0000005: 写入位置 0xc0180000 时发生访问冲突
    停在反编译这条指令上了:034D2192  mov         dword ptr [ecx],0
    请帮忙呀!谢谢 
      

  7.   

    ByRef 和 ByVal 是有区别的!
      

  8.   

    我用vb翻译为: 
    Private Declare Function search Lib "MyDLL.dll"(ByRef Buf As Double,ByVal nP As Long, ByVal minW As Double, ByVal Inc As Double, ByVal th As Double,ByVal thre As Double, ByVal Level As Double, ByVal shold As Double,ByVal maxs As Long, ByRef n_s As Long, ByRef p_s As Double, ByRef p_l As Double) Private Sub Command1_Click()     Dim Peak As Long, P_Y(550) As Double, P_X(550) As Double, y_q(1026) As Double, maxs As Long     Peak = 10000 
        maxs = 3000 
        search y_q(0), 512, 1520, 0.005, 0.1, -50, 3, -6, maxs, Peak, P_Y(0), P_X (0) 
    End Sub 
    还是不行,还是出现一样的错误,要崩溃了,是什么原因会引起这样呢?
      

  9.   

    C 函数要改为
    void search(double *Buf[],
                int32_t nP,
                double minW,
                double Inc,
                double th,
                double thre,
                double Level,
                double shold,
                int32_t maxs,
                int32_t *n_s,
                double *p_s,
                double *p_l[]);
      

  10.   

    唉,DLL我是用别人的,我现在只知道函数调用,里面的东西我无法改呀,请问还有其他的好办法吗?谢谢!
      

  11.   

    被 VB 调用的函数必须符合一定的标准,比如 stdcall。
    你可以再用 C 写一个 dll,对原先的函数封装一下。