从 VB6 调用 C++ DLL 传递参数的垃圾数据?
Calling C++ DLL from VB6 passes garbage data for arguments?
VC functions all use _stdcall
functions exported using .def file
(e.g. AliasFuncName = _FuncName@NumCallArgBytes)
Existing C DLL was revised to have some new call arguments
(revised function names, built to new dll name)
Functions with unrevised call arguments work when calling the new DLL
Functions with revised call arguments do not work when calling the new DLL
(all call arguments are garbage on entry)
Call arguments are several input doubles and a few return double*
Prototype.h call definition matches c source code definition
Visual Basic declarations to new DLL match in style those to the old DLL
(several ByVal double input args and a few ByRef return args)
参数在 VB 调试器中看起来不错,然后调用 VC 调试器,它们是垃圾(例如 1.34867e-308、3.49732e-88 等)。
如有任何关于可能原因的想法,我将不胜感激。我已经为此苦苦挣扎了几天。顺便说一句,我不选择在遗留代码中工作!
下面是 C 头文件原型、.DEF 定义和 VB 声明。
头文件定义:
LONG _stdcall SYSDll_FRoulSlideXa(
double ATest, double Hc, double Hivr,
double Eeq, double Rx, double Rk,
double L, double U, double SlRol,
double R, double Wlc, double Wpc,
double Mu, double MuOil, double Cor2AL,
double Fs, double Ft,
double *FRoul, double *FSlid);
.DEF 文件定义:
LIBRARY "SYSx32d10a"
DESCRIPTION 'SYSx Dlls'
EXPORTS
SYSDll_FRoulSlideXa = _SYSDll_FRoulSlideXa@144
VB6 声明:
Declare Function SYSDll_FRoulSlideXa Lib "SYSX32D10A.DLL" ( _
ByVal ATest As Double, ByVal Hc As Double, ByVal Hivr As Double, _
ByVal Eeq As Double, ByVal rx As Double, ByVal Rk As Double, _
ByVal L As Double, ByVal U As Double, ByVal SlRol As Double, _
ByVal r As Double, ByVal Wlc As Double, ByVal Wpc As Double, _
ByVal Mu As Double, ByVal MuOil As Double, ByVal Cor2AL As Double, _
ByVal Fs As Double, ByVal Ft As Double, _
FRoul As Double, FSlid As Double)
注意:我已经在最后两个参数上尝试了显式 ByRef
,而不是依赖默认传递约定 ByRef
。
您 VB Declare
不包含函数的 return 类型。除非您没有显示 DEFxxx
语句,否则这意味着 VB 需要 Variant
。因为 Variant
使用隐藏参数函数 return 它们的值,堆栈将错位。仅此一项就可以导致您所看到的。
解决方案是将正确的 return 类型添加到 VB Declare
。
VC functions all use _stdcall
functions exported using .def file
(e.g. AliasFuncName = _FuncName@NumCallArgBytes)
Existing C DLL was revised to have some new call arguments
(revised function names, built to new dll name)
Functions with unrevised call arguments work when calling the new DLL
Functions with revised call arguments do not work when calling the new DLL
(all call arguments are garbage on entry)
Call arguments are several input doubles and a few return double*
Prototype.h call definition matches c source code definition
Visual Basic declarations to new DLL match in style those to the old DLL
(several ByVal double input args and a few ByRef return args)
参数在 VB 调试器中看起来不错,然后调用 VC 调试器,它们是垃圾(例如 1.34867e-308、3.49732e-88 等)。
如有任何关于可能原因的想法,我将不胜感激。我已经为此苦苦挣扎了几天。顺便说一句,我不选择在遗留代码中工作!
下面是 C 头文件原型、.DEF 定义和 VB 声明。
头文件定义:
LONG _stdcall SYSDll_FRoulSlideXa(
double ATest, double Hc, double Hivr,
double Eeq, double Rx, double Rk,
double L, double U, double SlRol,
double R, double Wlc, double Wpc,
double Mu, double MuOil, double Cor2AL,
double Fs, double Ft,
double *FRoul, double *FSlid);
.DEF 文件定义:
LIBRARY "SYSx32d10a"
DESCRIPTION 'SYSx Dlls'
EXPORTS
SYSDll_FRoulSlideXa = _SYSDll_FRoulSlideXa@144
VB6 声明:
Declare Function SYSDll_FRoulSlideXa Lib "SYSX32D10A.DLL" ( _
ByVal ATest As Double, ByVal Hc As Double, ByVal Hivr As Double, _
ByVal Eeq As Double, ByVal rx As Double, ByVal Rk As Double, _
ByVal L As Double, ByVal U As Double, ByVal SlRol As Double, _
ByVal r As Double, ByVal Wlc As Double, ByVal Wpc As Double, _
ByVal Mu As Double, ByVal MuOil As Double, ByVal Cor2AL As Double, _
ByVal Fs As Double, ByVal Ft As Double, _
FRoul As Double, FSlid As Double)
注意:我已经在最后两个参数上尝试了显式 ByRef
,而不是依赖默认传递约定 ByRef
。
您 VB Declare
不包含函数的 return 类型。除非您没有显示 DEFxxx
语句,否则这意味着 VB 需要 Variant
。因为 Variant
使用隐藏参数函数 return 它们的值,堆栈将错位。仅此一项就可以导致您所看到的。
解决方案是将正确的 return 类型添加到 VB Declare
。