2017-06-08 4 views
2

das scheint wie eine einfache Frage, aber ich kann nicht google up die Antwort scheinen. Ich habe eine DLL, die eine Schnittstelle wie folgt hat:Pass struct mit c Strings von vb6

struct TestResults 
{ 
    int StringLengths; 
    Error Error; 
    LPTSTR SerialNumber; 
    LPTSTR Application; 
    LPTSTR GSM; 
}; 

extern "C" Error DLLNAME_ _stdcall GetResult(TestResults* testResults); 

Die DLL wird die verschiedenen Zeichenfolgen ausfüllen. Wie kann ich diese Schnittstelle von VB6 verwenden? Wie kann ich die Zeichenfolgen initialisieren, um beispielsweise eine Zeichenfolge mit 64 Zeichen Länge fester Länge zu verwenden?

+0

Die Zeichenfolgen sind einfach genug, Sie müssen sie nur vorbelegen. Aber was ist die Definition von "Fehler" in Ihrer Struktur? – tcarvin

Antwort

1

I Error annehmen wird als 32-Bit-Integer definiert, was bedeutet, dass Ihre Art in VB sollte wie folgt aussehen:

Type ResultsType 
    StringLengths As Long 
    ErrorValue As Long 
    SerialNumber As Long 
    Application As Long 
    GSM As Long 
End Type 

Dim testResults As ResultsType

Jede der Saiten eine Pre-Größe variabel sein sollte -Länge Zeichenfolge, wie;

Dim strGSM as String 
strGSM = String$(64, 0) 
testResults.GSM = StrPtr(strGSM) 

Die Erklärung wäre:

Declare Function GetResult Lib "DLLNAME" (ByVal testResults As ResultsType) As Long 

Der Rückgabewert der Error Wert oben beschrieben wäre. Das Feld Lib nimmt an, dass die DLL in Ihrem Pfad ist - wenn nicht, können Sie es weiter qualifizieren.

All das ist Luft-Code, keine Garantien, da es nicht getestet wird.

+0

Sie können reguläre VB6-String-Variablen für den LPTSTR verwenden, solange Sie sie mit 'String $ (64, 0)' vorbesetzen, wie Sie darauf hingewiesen haben. VB6 weiß, wie man diese anordnet. – tcarvin

+0

@tcarvin Ja, aber im Falle eines LPTSTR erwartet die DLL Wide Strings und Standard-Marshalling wird Ansi (verengt) BSTR passieren. Ich schätze, das OP müsste experimentieren, wenn nicht dokumentiert ist, was erwartet wird. –

+0

Das stimmt. So oder so muss der Entwickler diese Antwort wissen, als ob es wirklich ein LPSTR wäre, dann wird dieser obige Code nicht funktionieren, da VB6 erwartet, dass die Zeichenkette als Unicode angezeigt wird, und dies wird nicht der Fall sein. – tcarvin