从VB6调用C++ DLL传递垃圾数据的参数?

Piu*_*ski 3 vb6 visual-c++-6

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)
Run Code Online (Sandbox Code Playgroud)

在调试VC调试器之前,VB调试器中的参数看起来很好,它们是垃圾(例如1.34867e-308,3.4937e-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);
Run Code Online (Sandbox Code Playgroud)

.DEF文件定义:

LIBRARY "SYSx32d10a"

DESCRIPTION 'SYSx Dlls'

EXPORTS
    SYSDll_FRoulSlideXa = _SYSDll_FRoulSlideXa@144
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

注意:我已经ByRef在最后两个参数上尝试显式,而不是依赖于默认传递约定ByRef.

Jim*_*ack 6

您VB Declare不包含该函数的返回类型.除非有一个DEFxxx你没有表明的声明,这意味着VB期望一个Variant.因为Variant函数使用隐藏参数返回其值,所以堆栈将不对齐.仅这一点就可以导致你所看到的.

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