我在调用一个DLL的时候,一调用VB就出错,进入VB6调试,说034D207D fld qword ptr [edx+ecx*8]这条语句有错误,老是提示: 线程 'Win32 线程' (0x614) 已退出,返回值为 0 (0x0)。
VB6.EXE 中的 0x034d207d 处未处理的异常: 0xC0000005: 读取位置 0x00143000 时发生访问冲突。
请问这是怎么回事呢?谢谢各位了!
VB6.EXE 中的 0x034d207d 处未处理的异常: 0xC0000005: 读取位置 0x00143000 时发生访问冲突。
请问这是怎么回事呢?谢谢各位了!
1、调用的DLL函数的原形声明
2、你在VB中的函数声明
3、你在VB中的调用传参方式及数据
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
(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
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
不确定在 C 中 double Buf[] 参数是否就是一个 Double 指针,否则根本无法用 VB 调用;你看 MSDN 中的 API 原型,通常总是 double *Buf 形式的参数。
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
请帮忙呀!谢谢
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
还是不行,还是出现一样的错误,要崩溃了,是什么原因会引起这样呢?
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[]);
你可以再用 C 写一个 dll,对原先的函数封装一下。