Domanda

sto passando un semplice tipo definito dall'utente (UDT) da Visual Basic 6 a un C DLL. Funziona bene, tranne che per la doppia tipo di dati, che viene mostrata come 0.

C DLL:

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <stdio.h>

typedef struct _UserDefinedType
{
    signed int      Integer;
    unsigned char   Byte;
    float           Float;
    double          Double;
} UserDefinedType;

int __stdcall Initialize ( void );
int __stdcall SetUDT ( UserDefinedType * UDT );

BOOL WINAPI DllMain ( HINSTANCE Instance, DWORD Reason, LPVOID Reserved )
{
    return TRUE;
}

int __stdcall Initialize ( void )
{
    return 1;
}

int __stdcall SetUDT ( UserDefinedType * UDT )
{
    UDT->Byte = 255;
    UDT->Double = 25;
    UDT->Float = 12345.12;
    UDT->Integer = 1;

    return 1;
}

codice Visual Basic 6:

Option Explicit

Private Type UserDefinedType
    lonInteger As Long
    bytByte As Byte
    sinFloat As Single
    dblDouble As Double
End Type

Private Declare Function Initialize Lib "C:\VBCDLL.dll" () As Long
Private Declare Function SetUDT Lib "C:\VBCDLL.dll" (ByRef UDT As UserDefinedType) As Long

Private Sub Form_Load()

    Dim lonReturn As Long, UDT As UserDefinedType

    lonReturn = SetUDT(UDT)

    Debug.Print "VBCDLL.SetUDT() = " & CStr(lonReturn)

    With UDT
        Debug.Print , "Integer:", CStr(.lonInteger)
        Debug.Print , "Byte:", CStr(.bytByte)
        Debug.Print , "Float:", CStr(.sinFloat)
        Debug.Print , "Double:", CStr(.dblDouble)
    End With

End Sub

L'output da Visual Basic:

VBCDLL.SetUDT() = 1
              Integer:      1
              Byte:         255
              Float:        12345.12
              Double:       0

Come si può vedere, il doppio sta comparendo come 0 , quando dovrebbe essere 25 .

È stato utile?

Soluzione

UDT di VB6 doppie allineamento in indirizzi che sono multipli di 4. Ecco come fare i conti con questo in C:

#pragma pack(push,4)
typedef struct _UserDefinedType 
{ 
    signed int      Integer; 
    unsigned char   Byte; 
    float           Float; 
    double          Double; 
} UserDefinedType;
#pragma pack(pop)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top