Вызов C ++ DLL из VB6 передает мусорные данные для аргументов? - PullRequest
0 голосов
/ 27 ноября 2018
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 Debugger перед вызовом VC Debugger, где они являются мусором (например, 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.

1 Ответ

0 голосов
/ 28 ноября 2018

Ваш VB Declare не включает тип возврата для функции.Если нет оператора DEFxxx, который вы не показываете, это означает, что VB ожидает Variant.Поскольку Variant функции возвращают свое значение, используя скрытый параметр, стек будет смещен.Одно это может вызвать то, что вы видите.

Решение состоит в том, чтобы добавить правильный тип возврата в VB Declare.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...