调用C++;VB6中的DLL传递参数的垃圾数据? VC函数都使用 使用.def文件导出的函数 (例如别名=_FuncName@NumCallArgBytes) 现有的C DLL被修改为具有一些新的调用参数 (修改后的函数名,构建为新的dll名) 调用新DLL时,具有未经修改的调用参数的函数会工作 调用新DLL时,具有修改的调用参数的函数不起作用 (所有调用参数在条目上都是垃圾) 调用参数是几个输入双精度和几个返回双精度* h调用定义与c源代码定义匹配 新DLL的Visual Basic声明在样式上与旧DLL的声明相匹配 (几个ByVal双输入参数和几个ByRef返回参数)

调用C++;VB6中的DLL传递参数的垃圾数据? VC函数都使用 使用.def文件导出的函数 (例如别名=_FuncName@NumCallArgBytes) 现有的C DLL被修改为具有一些新的调用参数 (修改后的函数名,构建为新的dll名) 调用新DLL时,具有未经修改的调用参数的函数会工作 调用新DLL时,具有修改的调用参数的函数不起作用 (所有调用参数在条目上都是垃圾) 调用参数是几个输入双精度和几个返回双精度* h调用定义与c源代码定义匹配 新DLL的Visual Basic声明在样式上与旧DLL的声明相匹配 (几个ByVal双输入参数和几个ByRef返回参数),vb6,visual-c++-6,Vb6,Visual C++ 6,在调用VC调试器之前,参数在VB调试器中看起来不错,因为它们是垃圾(例如1.34867e-308、3.49732e-88等) 如果您对可能的原因有任何想法,我将不胜感激。我已经为此挣扎了几天。顺便说一下,我不选择在遗留代码中工作 下面是C头原型、.DEF定义和VB声明 头文件定义: .DEF文件定义: VB6声明: 注意:我已经在最后两个参数上尝试了显式的ByRef,而不是依赖默认的传递约定ByRef您的VBDeclare没有包含函数的返回类型。除非有一个DEFxxx语句没有显示,否则这意味着V

在调用VC调试器之前,参数在VB调试器中看起来不错,因为它们是垃圾(例如1.34867e-308、3.49732e-88等)

如果您对可能的原因有任何想法,我将不胜感激。我已经为此挣扎了几天。顺便说一下,我不选择在遗留代码中工作

下面是C头原型、.DEF定义和VB声明

头文件定义: .DEF文件定义: VB6声明:
注意:我已经在最后两个参数上尝试了显式的
ByRef
,而不是依赖默认的传递约定
ByRef

您的VB
Declare
没有包含函数的返回类型。除非有一个
DEFxxx
语句没有显示,否则这意味着VB需要一个
变量。由于
Variant
函数使用隐藏参数返回其值,堆栈将不对齐。光是这一点就可能导致你所看到的


解决方案是将正确的返回类型添加到VB
Declare

您可以在回答中添加以下信息:VB6声明中函数的返回值应该是
,只要
。我不敢相信我错过了这一点。添加返回类型解决了该问题。非常感谢。
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);
LIBRARY "SYSx32d10a"

DESCRIPTION 'SYSx Dlls'

EXPORTS
    SYSDll_FRoulSlideXa = _SYSDll_FRoulSlideXa@144
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)