Chiamata C DLL da Basic 6 a vista: tipo di dati Double non funziona
-
30-09-2019 - |
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 .
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