Frage

Ich habe eine Windows-DLL, die ich in C/C++ geschrieben habe (alle exportierten Funktionen sind „C“).Die DLL funktioniert bei mir in VC++ einwandfrei.Ich habe die DLL an eine andere Firma weitergegeben, die ihre gesamte Entwicklung in VB durchführt.Sie scheinen ein Problem mit der Verknüpfung mit den Funktionen zu haben.Ich habe VB seit zehn Jahren nicht mehr verwendet und habe es noch nicht einmal installiert.Was könnte das Problem sein?

Ich habe alle meine öffentlichen Funktionen wie folgt deklariert:

#define MYDCC_API __declspec(dllexport)


MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.

Irgendwelche Ideen?


Ich bin heute endlich darauf zurückgekommen und habe es zum Laufen gebracht.Die Antworten haben mich auf den richtigen Weg gebracht, aber ich fand Folgendes am hilfreichsten:

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

Außerdem hatte ich ein paar Probleme beim Übergeben von Zeichenfolgen an die DLL-Funktionen. Folgendes fand ich hilfreich:

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml


War es hilfreich?

Lösung

Durch die Nutzung __declspec Beim Export wird der Funktionsname exportiert verstümmelt, d.h.enthalten Typinformationen, die dem C++-Compiler beim Auflösen von Überladungen helfen.

VB6 kann mit entstellten Namen nicht umgehen.Um dieses Problem zu umgehen, müssen Sie die Namen entzerren.Die einfachste Lösung besteht darin, die DLL-Datei mit einer zu verknüpfen Exportdefinition Datei in VC++.Die Exportdefinitionsdatei ist sehr einfach und enthält lediglich den Namen der DLL und eine Liste der exportierten Funktionen:

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

Zusätzlich müssen Sie angeben stdcall Aufrufkonvention verwenden, da dies die einzige Aufrufkonvention ist, die VB6 verarbeiten kann.Es gibt ein Projekt, das Assembly-Injection zur Verarbeitung von C-Aufrufen verwendet, aber ich denke, Sie möchten diese schwierige und fehleranfällige Methode nicht verwenden.

Andere Tipps

Versuchen Sie, am Ende __stdcall hinzuzufügen

#define MYDCC_API __declspec(dllexport) __stdcall

Wir haben einige C++-DLLs, die mit unseren alten VB6-Apps interagieren, und das haben sie am Ende alle.

Eine VB6-DLL ist immer eine COM-DLL.Ich werde ein Beispiel in möglichst wenigen Worten beschreiben.Angenommen, Sie haben ein ActiveX-DLL-Projekt in VB6 mit einer Klasse namens CTest, die eine Methode wie unten gezeigt enthält

Öffentliche Funktion vbconcat (Byval A als String, Byval B als String) als String vbconcat = A & B -Endfunktion

und Sie haben den Projektnamen als VBTESTLIB in VB6 -Projekteigenschaften festgelegt und Sie haben das Projekt als f: proj vb6 activexdll vbtestdll.dll zusammengestellt

Sie müssen die DLL mit dem Windows -Befehl regsvr32 f: proj vb6 activexdll vBtestDll.dll registrieren

Jetzt Ihr C++-Code:

#import "f: proj vb6 activexdll vBtestDll.dll" unter Verwendung des Namespace vBTESTLIB;

void cdialogtestdlg :: onbutton1 () {

 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  {
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   }

}

Das ist alles, um loszulegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top