DLL mit C++ Klassen benutzen

Liebe Experten,

leider habe ich weder in der Online-Hilfe noch im Archiv oder im Netz etwas zu diesem Thema gefunden.

Ich habe in C++ eine Matrix-Bibliothek als DLL programmiert, die als komplette Klasse „CMatrix“ exportiert wird. Die Einbindung und Verwendung der DLL in C++ Programmen funktioniert hervorragend.

Nun möchte ich diese DLL auch in Visual Basic verwenden. In der Hilfe ist dies nur für globale Funktionen mit einfachen oder Benutzerdefonierten Datentypen, jedoch nicht für Klassen beschrieben. Wenn ich die Deklaration

Private Declare Function CMatrixCreateConst Lib "LMatrix" Alias "CMatrix::createConst" \_
(ByVal rows As Long, ByVal cols As Long, value As Double) As CMatrix

verwende, dann erhalte ich die Fehlermeldung:
„Laufzeitfehler 453: DLL-Einsprungpunkt createConst in LMatrix nicht gefunden.“

Weiß jemand von Euch, wie man Klassen aus DLL’s in Visual Basic verwenden kann?

Vielen Dank schon einmal om Voraus,

Daniel.

Hallo,

normalerweise muss man die C++ Klassen in eine ActiveX-Modul verpacken und dann sollte das auch funktionieren.

Mittels des VC-Compilers kann man sich ein ActiceX-Interface genierenen lassen und dann die C++Klassen dahinter kapseln.

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Daniel
Es gibt zwei grundlegende DLL Typen.
Die eine ist eine „Standart“ DLL, die Andere eine ActiveX-DLL
Nun ist es so, dass eine ActiveX Dll mit Declare nicht definiert werden kann. Die Standart-Dll kann aber mit Declare definiert werden.
Also handelt es sich um eine ActiveX-Dll, so musst Du follgenden Code eingeben:

Dim a
Dim DLLPath As String
DLLPath = App.Path & IIf(Right(App.Path, 1) = „“, „“, „“) & „SetupDLL.dll“

Shell "regsvr32 /s " & Chr(34) & DLLPath & Chr(34)
Set a = CreateObject(„SetupDLL.ClassSetup“)
a.SetupStart
End Sub

'SetupStart ist der Prozedurname (als Public), im Klassen Modul ClassSetup. SetupDLL ist der Projektname, SetupDLL.DLL der Dateiname. Mit Shell regsvr32 /s wird die Datei in der Registry deklariert.
Mit CreateObject kann Sie dann aufgerufen werden

Handelt es sich um eine „Standart“ DLL, so wird diese mit Declare Function deklariert. Sie kann nun als Funktion aufgerufen werden.

Was ich nicht weiss, inwiefern der Befehl Shell auch noch funktioniert.
Grüsse Sebastian

Hallo Sebastian,

bei den sogenannten Standart-Dll’s gibt es aber auch wiederum 2 Varianten, die einen die einen Prozeduralen Einsprungpunkt bereitstellen, die anderen die eine Klassen-Schnittstelle bereitstellen.
In der Doku zu den MFC Bibliotheken ist von einer sogenannten Extension-DLL die Rede, die untere anderem mit speziellen Compileroptionen compiliert werden muss und auch ein ganz andere Speicherverwaltung aufweist, da die in der DLL verwendeten Klassen auch als Basisklassen fuer Vererbungen im Hauptprogramm zur Verfuegung stehen muessen. Fuer diese Klassen muss sowieso die entsprechende Headerdatei beim Compilieren vorliegen und die sind in VisualBasic eigentlich ueberhaupt nicht zu gebrauchen.

Daniel hat uns leider nicht mitgeteile was das genau fuer eine DDL ist und wie diese erzeugt wurde. Mit diesen Infos koennte man vieleicht genauere Tips geben.

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Peter,

danke für den Hinweis. Da werde ich mich mal mit ActiveX
auseinandersetzen müssen. Zum Glück ist das VB-Programm
sowieso für die Windows-Plattform gedacht, so dass eine
Portierung nach Unix oder einem anderen Betriebssystem
nicht so wichtig ist.

Vielen Dank,

Daniel.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Sebastian, hallo Peter,

da die Matrix-Bibliothek portabel sein soll, damit ich sie
auf anderen Betriebssystemen, wie Unix, kompilieren kann
habe ich auf allen Windows-Schnickschnack verzichtet. Daher
muss es sich wohl um eine erweiterte Standard-DLL handeln.

Zur Einbindung in C++ benötige ich also die Header-Datei und
die Import-Bibliothek, die aber in VB nicht zu gebrauchen sind.

Wenn ich das richtig verstanden habe, geht die Declare Aufruf,
so, wie ich ihn verwendet habe, nur für die Standard-Schnittstelle
mit globalen Funktionen ohne Klassen. Und wenn ich Klassen verwenden
möchte, dann muss ich diese als ActiveX-DLL exportieren. Da das VB-Programm, das lediglich die Matrix-Bibliothek benutzt, nicht betriebssystemunabhängig sein muss, werde ich das mal versuchen.

Vielen Dank für die Tips,

Daniel.