(03.09.2016 08:56 )hansi9990 schrieb: Hi
Ich vesuche schon einige Zeit eine DLL in LabView zu importieren was mir zu Teil auch schon gelungen ist, einige Dinge konnte ich erfolgreich testen, nur habe ich ein Problem mit einem define (OVERLAPPED) das scheinbar nochmal eine externe Funktion ist.
Ich habe aber keine Ahnung wie ich das in das .h File bekomme damit mir der DLL Import Assistent mir die DLL korrekt erstellt.
Ich habe in den Anhang ein Bild mit dem Aufbau der DLL angehängt, das Header File habe ich umbenannt mit .txt Erweiterung da hier scheinbar keine .h Dateien im Anhang zugelassen sind.
Hat evtl. jemand eine Ahnung wie ich dieses OVERLAPPED in das Header bekomme um die DLL korrekt importieren zu können?
OVERLAPPED ist keine externe Funktion sondern ein struct von den Windows low level Systemtreibern wenn diese asynchon aufgerufen werden. Aber dieses API ist definitive etwas obskur in dieser Hinsicht.
Die Windows Deklaration sieht als folgt aus:
Code:
typedef struct _OVERLAPPED {
ULONG_PTR Internal;
ULONG_PTR InternalHigh;
union {
struct {
DWORD Offset;
DWORD OffsetHigh;
};
PVOID Pointer;
};
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
Ich gehe mal davon aus dass Du auf die Elemente sowohl in der struct strHidDevice als auch in diesen OVERLAPPED überhaupt nicht direkt zugreifen musst. Dann könnte man es einfach als ein Pointersized Integer behandeln.
Und selbst wenn Du diese struct in den Header mit aufnimmst kann der DLL Import Wizard NICHT den korrekten Code erzeugen da es ziemlich undeutlich ist wer den Speicher für diese OVERLAPPED Strukturen anlegen soll. Zudem enthält diese Struktur HANDLES und eben diese Pointers zu OVERLAPPED und das bewirkt, dass die entsprechenden Strukturen qua Memorylayout völlig verschieden werden, je nachdem ob man dies für 32 bit oder 64 bit versucht zu machen.
Am einfachsten wäre halt einfach um eine weitere DLL in C zu machen die diese Struktur anlegt und korrekt initialisiert und dann einfach den Zeiger darauf als Pointersized Integer zurückgibt und Du diesen dann auch entsprechend an jede Funktion übergibts. Eine zweite Funktion in dieser Hilfs-DLL gibt den Speicher für diese Struktur wieder frei. Dummerweise hätte der ursprüngliche DLL Programmierer genau das so machen können indem die HANDLE HID_Init() Funktion genau diesen Pointer einfach als HANDLE oder void* zurückgeben könnte und alle Funktionen würden dann auch ein HANDLE oder void* als ersten Parameter erhalten. Daneben hätte noch eine weitere Funktion exportiert werden müssen wie HID_Free(HANDLE hid) oder so die den entsprechenden Speicher wieder dealloziert. Das wäre korrekte Programmierung gewesen.
Das alles in LabVIEW selber zu machen versuchen wird sehr viel Handarbeit erfordern (der Import Wizard kann das nicht) und Zeigerarithmetik und 32 bit/64 bit Gegrumschel in einem LabVIEW Diagram ist hässlich, kaum zu warten auf längere Dauer da nur extrem wenig Leute so was auf LabVIEW Niveau überhaupt machen können und ein C Programmierer der dies begreifen könnte meist keinerlei Kenntnisse auf LabVIEW Gebiet hat und Dir oder wer es dann auch eventuel modifizieren oder debuggen muss, nicht helfen kann und will.