Ich bin ein C++ (MSVC) Schreiber, VB-Neuling versucht, einen Experten VB.net Schriftsteller zu unterstützen, der diese Aufgabe zuvor nicht getan hat.Weitergabe von Zeigern an externe C-Funktion in einer DLL von VB
Wir möchten sowohl C/C++ - als auch VB-Anwendungen entwickeln, um eine in C++ geschriebene DLL mit C extern API-Funktionen zu verwenden. Das C++ - Programm funktioniert einwandfrei. Es ist VB, wo wir Schwierigkeiten haben.
Die DLL stellt eine extern C
Funktion:
RegisterCallback(void* cbFuncPtr, void* dataPtr);
Anmerkung 1: Siehe meine Anmerkung unten für eine Designänderung und die Gründe, warum wir es geschafft.
HINWEIS 2: Zusätzliche Aktualisierung als Antwort unten hinzugefügt.
wo die Callback-Funktion havs dieses C typedef:
typedef (void)(* CALL_NACK)(void*);
Die cbFuncPtr
wird erwartet, dass ein Funktionszeiger auf einige VB-Funktion sein, die als CALL_BACK genannt wird erhalten. Die dataPtr
ist ein Zeiger auf eine Datenstruktur, die diese C Definition hat:
typedef struct
{
int retCode;
void* a_C_ptr;
char message[500];
} cbResponse_t;
wo a_C_ptr is an internal pointer in the DLL that the VB can cast to
long`. Es identifiziert eindeutig, wo in der DLL der Rückruf durchgeführt wurde, und ermöglicht es der VB-Funktion, Anrufe von denselben/verschiedenen Standorten zu erkennen.
Wir sind in der Lage, die RegisterCallback()
-Funktion von VB zugreifen und ausführen, einfach gut. Protokollierung zeigt, dass wir dorthin gelangen und dass Daten weitergegeben werden. Es sind die tatsächlichen Daten, die das Problem zu sein scheinen.
Beim Lesen von ungefähr einer Million Foreneinträgen haben wir gelernt, dass VB nicht weiß, welche Zeiger sind und dass eine VB-Struktur mehr als nur organisierter Speicher ist. Wir sind uns ziemlich sicher, dass die "Adresse" einer VB-Struktur nicht das ist, was C für eine Adresse hält. Wir haben wiederholt Hinweise auf "Marshalling" und "Managed Data" gesehen, aber wir haben nicht genug Verständnis, um zu wissen, was uns das sagt.
Wie sollen wir VB codieren, um der DLL die Ausführungsadresse ihrer Callback-Funktion zu geben und wie wir ein VB-Konstrukt codieren, das die DLL genauso ausfüllen kann wie für C++?
Benötigen wir eine DLL-Funktion, in der die aufrufende App "C" oder "VB" sagen kann und die DLL die Strukturzeiger anders verarbeitet? Wenn ja, wie würde man C kodieren, um die VB-Struktur auszufüllen?
Diese [MS Artikel darüber, wie zu marshall Daten in einem DLL] (http://msdn.microsoft.com/en-us/library/fzhhdwae.aspx) zumindest sieht aus wie es angewandt werden könnte .Es wurde von diesem [Artikel über das Aufrufen von C++ - DLLs aus VB] (http://social.msdn.microsoft.com/forums/en-US/Vsexpressvb/thread/4c486d10-fe8b-49da-a5f1-8054b82251ff/) verknüpft. Ich bin kein VB- oder .NET-Programmierer, also bin ich vielleicht daneben. –
@DaveNewman Der letzte Beitrag zu dieser Diskussion ist bereits eine große Hilfe. Als C-Programmierer ist die Idee, dass Daten sich nur aufheben und bewegen können und dass Zeiger darauf nur so lange vertrauenswürdig sind, wie die Anweisung, die sie abgefragt hat, Häresie ist. Ich denke, ich muss die Struktur auf der DLL-Seite erstellen und der App mitteilen, wo ich die Daten ablege. Das vereitelt die Idee, die App die Daten so besitzen zu lassen, dass sie trotz der DLL vorhanden wären. –
Soweit ich weiß, ist es in vb.net sehr nützlich, die IntPtr-Struktur für Zeiger zu bevorzugen. Aber wenn Sie bereits eine Zeigerdefinition haben, nicht sicher, ob sie wirklich benötigt wird. Zeiger sind auch in vb.net, nur ein bisschen schwieriger zu finden – Amegon