Aufruf Visual Basic-DLL in C++

Ich erworben habe eine DLL, die erstellt wurde in Visual Basic von einem Drittanbieter(Sensor DLL.dll). Diese DLL enthält Funktionen für das Gespräch ein sensor, und ich brauche, um diese Funktionen aufrufen aus einem Visual C++ Programm, das ich Schreibe. Der Verkäufer wird sich nicht stellen Sie eine header-Datei, und ich weiß nicht Visual Basic. Wenn ich die header-Datei wäre dies ein 15 Minuten Projekt... stattdessen bin ich immer noch mit ihm zu kämpfen, eine Woche später. Bitte Um Hilfe!!

Mir wird gesagt, dass eine Funktion (Get_Data) in der DLL ist von der form:

Public Function Get_Data(ByVal Handle As String) As String

Ich habe versucht, verschiedene Methoden für den Aufruf dieser Get_Data-Funktion ohne Erfolg:

Methode 1) das DllImport-Attribut

#using <mscorlib.dll>
using namespace System::Runtime::InteropServices; 

namespace Sensor
{

[DllImport("Sensor DLL.dll", EntryPoint = "Get_Data", CharSet = System::Runtime::InteropServices::CharSet::Unicode)]
BSTR Get_Data(BSTR Handle);
}

//then I call the function
Sensor::Get_Data(Handle);

Diese Methode scheint der nächste, den ich gelernt habe, einen sloution. Es kompiliert, aber gibt den folgenden Fehler, wenn es ausgeführt wird:

Eine nicht behandelte Ausnahme des Typs 'System.EntryPointNotFoundException " ist aufgetreten

Weitere Informationen: kann Nicht finden, einen Einstiegspunkt namens 'Get_Data' in der DLL "Sensor DLL.dll'.

Habe ich versucht verschiedene Datentyp-Kombinationen/Permutationen neben BSTR einschließlich BSTR*, wchar_t, int, etc. Es ist möglich, dass ich eine verpasst, aber jeden Datentyp gibt den gleichen Fehler.

Methode 2) dllimport-storage-class-Attribut

__declspec(dllimport) BSTR Get_Data(BSTR Handle);

//then I call the function
Get_Data(Handle);

Diese Methode ist verwirrend für mich, weil ich don ' T geben Sie die DLL, die ich importieren möchten aus. Ich habe kopiert die DLL in den Projekt-Ordner und ich habe ihn Hinzugefügt, um das Projekt manuell, also hoffentlich bedeutet dies, dass es gefunden werden kann. Beim kompilieren wird der linker liefert den folgenden Fehler:


error LNK2028: nicht aufgelöstes token (0A00034F) "wchar_t * __cdecl Get_Data(wchar_t *)" (?Get_Data@@$$FYAPA_WPA_W@Z), verwiesen in Funktion "" int __cdecl main(void)" (?main@@$$HYAHXZ)

error LNK2019: nicht aufgelöstes externes symbol "wchar_t * __cdecl Get_Data(wchar_t *)" (?Get_Data@@$$FYAPA_WPA_W@Z), verwiesen in Funktion "" int __cdecl main(void)" (?main@@$$HYAHXZ)

Ich vermutete, dass dies vielleicht gemeint, ich sollte mit wchar_t oder wchar_t* anstelle des BSTR, aber ändern, um entweder datatype Ergebnisse in die gleichen Fehler.

Methode 3) GetProcAddress

typedef BSTR (*Get_Data_Ptr)(BSTR Handle);  
HINSTANCE LoadMe;
LoadMe = LoadLibraryA("Sensor DLL.dll");

if (!LoadMe)
    std::cout << "\nDLL failed to load!\n";

Get_Data_Ptr LibMainGet_Data;  
LibMainGet_Data = (Get_Data_Ptr)GetProcAddress(LoadMe,"Get_Data");

//then I call the function
LibMainGet_Data(Handle);

Dies kompiliert, gibt aber die folgende Fehlermeldung beim ausführen:


Eine nicht behandelte Ausnahme des Typs 'System.AccessViolationException " ist

Weitere Informationen: Versucht, Lesen oder schreiben von geschütztem Speicher. Dies ist Häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

Wenn ich die Maus über die verschiedenen Teile der code im debug-Modus scheint es, dass, wie die erste Methode, es war auch nicht in der Lage zu finden, die 'Get_Data' Einstiegspunkt in der DLL.

Hat jemand aufgerufenen Funktionen aus einer VB-DLL mit C++, wenn du nicht die DLL selbst und die Sie nicht haben .idl-Dateien, etc? Hat jemand ein funktionierendes Beispiel, wie dieses könnten Sie teilen?

Danke!

  • Attribute sind nicht verfügbar in C++. Nur in managed C++, das ist nicht das gleiche
  • Sind Sie absichtlich mit C++/CLI? Oder sind Sie es einfach benutzen, weil es der einzige Weg ist der Aufruf von COM-Objekten, die Sie mit vertraut sind?
InformationsquelleAutor John | 2010-09-09
Schreibe einen Kommentar