2010-08-23 22 views
2

Je passe un simple type défini par l'utilisateur (UDT) de Visual Basic 6 à une DLL C. Il fonctionne très bien, à l'exception du type de données à double, qui apparaît comme 0.Appel de DLL C à partir de Visual Basic 6: Le type de données double ne fonctionne pas

DLL C:

#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; 
} 

code 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 

La sortie de Visual Basic:

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

Comme vous pouvez le voir, le double apparaît comme , quand il devrait être .

+0

Vous pouvez essayer d'insérer une autre 'Float' entre le premier' Float' et 'Double' et voir ce qui se passe. Peut-être que C et Visual Basic ne sont pas d'accord sur la façon de doubler «double». –

Répondre

3

UDT de VB6 aligner double à des adresses multiples de 4. Voici comment composer avec que C:

#pragma pack(push,4) 
typedef struct _UserDefinedType 
{ 
    signed int  Integer; 
    unsigned char Byte; 
    float   Float; 
    double   Double; 
} UserDefinedType; 
#pragma pack(pop) 
+1

+1 Je vous suggère également de consulter le [Microsoft advice] (http://vb.mvps.org/tips/vb5dll.asp) sur l'écriture de DLL C à appeler depuis VB. Initialement publié avec VB5, mais toujours pertinent pour VB6. Par exemple, il mentionne que VB6 attend un emballage de 4 octets. – MarkJ

+0

Il n'a pas dit que j'avais des réponses ici. Quoi qu'il en soit, merci beaucoup à vous deux (Windows Programmer) pour le code et MarkJ pour le lien. :) –