2016-11-03 2 views
0

Ich versuche, eine DLL (erstellt mit LabView) von .NET aufzurufen. Für die meisten Methoden ist es mir gelungen, aber man benötigt ein String-Array als Eingabe.Verwenden von LStrHandleArray in .NET

Labview verwendet angeblich Konventionen C-Aufrufs, wenn DLLs aber der Funktionsprototyp keinen char Zeiger verwenden, wie ich erwarten würde, sondern eine LStrHandleArray:

void SetOutputUnits(LStrHandleArray *OutputUnits) 

weiß jemand, was Referenz ich hinzufügen muß sein Kann ich LStrHandleArray aus .NET heraus benutzen?

Googling LStrHandleArray ergibt nur 19 Ergebnisse, von denen die meisten unbeantwortete Fragen in anderen Foren sind. Ich habe jede Referenz von National Instruments hinzugefügt, die ich mir vorstellen kann, aber ich sehe LStrHandleArray nicht und kann online keine Dokumentation darüber finden.

Antwort

0

Die Definition des Typs ist wie folgt:

/** @brief Long Pascal-style string types. */ 
typedef struct { 
    int32 cnt;  /* number of bytes that follow */ 
    uChar str[1];  /* cnt bytes */ 
} LStr, *LStrPtr, **LStrHandle; 
typedef struct _LStrArray { 
    int32 nElts; 
    LStrHandle str[1]; 
} LStrArray, **LStrArrayHandle; 

anzumerken, dass die Verwendung von 1 ist die C-Technik eines Array-Typ zu machen flache inline zugeordnet werden, anstatt ein separaten Zeiger in. Die gleiche Deklaration wird unabhängig von der Länge des Arrays oder der Länge der Zeichenfolge verwendet. Sie reservieren genügend Speicher für die volle Größe des Arrays/Strings ... Indizes gehen bewusst über die angegebene Zuordnungsgröße hinaus. Es ist etwas, das in verwalteten Sprachen unerhört ist, aber dies ist die strukturelle Deklaration auf niedriger Ebene, die der Compiler verwendet.

Um von .NET-Code aufzurufen, müssen Sie eine Wrapper-DLL erstellen, die eine abgeflachte Form der Daten, die Sie als eine Zeichenfolge oder andere marshalable Datenstruktur marshalieren und dann im C++ - Code öffnen. Sowohl das Array-Handle selbst als auch die internen String-Handles müssen mit DSNewHandle() oder DSNewHClr() aus der Headerdatei extcode.h zugeordnet werden, damit sie sich im Speicherbereich befinden, den LabVIEW manipulieren kann.

This example zeigt den Aufruf der DLL aus einer anderen C DLL, aber es hat andere hilfreiche Diskussion.

PS: LabVIEW verwendet C-Aufrufkonventionen. Das bezieht sich auf die Reihenfolge der Parameter im Stack und darauf, dass die Datenstrukturen alle mit PODs (plain old C data types) definierbar sind. Es impliziert nichts über die Datenstrukturen, die in den Schnittstellen verwendet werden.

Verwandte Themen