VB Dll in C++ Projekt laden
-
Hast Du eine tlb-Datei für Deine VB-Componente?
Dann mach doch einfach#import "meine-vb-com.tlb"
-
Hallo, danke für deine schnelle Rückmeldung.
Ich habe lediglich die "name.dll" vorliegen.
Inzwischen habe ich etwas über eine "name.idl" gelesen,
was mich aber noch nicht wirklich weiter gebracht hat.
Zumindest habe ich diese idl schonmal erzeugen können.Diese .tlb muss ich auch selbst erzeugen?
-
Du kannst auch die dll direkt importieren, wenn dort die tlb drin ist (was oft der Fall ist)
-
Ja, diese tlb scheint vorhanden zu sein.
Als Laie ist es mir nur noch nicht verständlich wie ich dann auf die
Klassen der DLL zugreifen kann. Hast du evtl. dafür ein Beispiel, oder
ist das Thema zu umfassend um es in einem Beispiel halbwegs verstehen
zu können?Für eine Buchempfehlung wäre ich auch sehr empfänglich
-
AFAIK werden dann tlh/tli Dateien erzeugt, die kannst Du Dir mal anschauen...
Für Beispiele von #import, siehe:
http://support.microsoft.com/kb/262450
http://support.microsoft.com/kb/169496Falls Du MFC hast siehe auch:
http://support.microsoft.com/kb/178749/EN-US/
-
Danke für die Links. Das wird mir allgemein schon etwas weiter helfen.
Ich vermute in meinem Fall, dass ein Fehler in der *.tlh vorliegt.
-
Hi, ich bins nochmal. Also vielen Dank für die Tipps.
Ich habe die DLL nun erfolgreich ins Projekt eingebunden.
Es gibt nur ein kleines Problem mit der Verwendung des Pointers
aus dem namespace, das ich nicht verstehe.Ich erhalte den Compilerfehler:
EXPORTMAP::_defPtr' unterscheidet sich von 'LPSTR' in Bezug auf die Anzahl vorgenommener Dereferenzierungen
Der aus dem Namespace EXPORTMAP genutzte Pointer via
EXPORTMAP::_defPtr(LPSTR x);
Erwartet aber auch einen LPSTR... hat jemand eine Idee dazu?
-
Hat hier jemand nun schon eine befriedigende Antwort gefunden?
ich stehe nämlich auch vor dem gleichen Problem, daß ich eine VB.Net-Klasse habe, die ich in Visual C++ nutzen möchte... die Klasse in eine DLL umzuwandeln stellt ja kein Problem da, aber wie benutze ich diese nun in C++?
Cannot open type libraby file
bekomme ich als Fehler, wenn ich sie einfach wie #import einbinden möchte - muß ich noch etwas beachten? Bzw wie macht man das denn nun?
Vielen Dank im Vorraus..
Hackbard_C
-
Mit .NET klassen ist das schon schwieriger: Das andere VB beispiel ist wahrscheinlicch VB 6.0, wo die objekte noch COM waren. Ich glaube es gibt eine möglichkeit in VB die klassen als COM objekte zu deklarieren und dann wie üblich über class-interfaces zu nutzen. Ich glaube du musst den Attribut <IsComVisible()> setzen, sodass du auch irgendwie die klassen als COM objekte exportieren kannst.
Ich würde dir empfehlen bei der MSDN library unter interop zu suchen, da ich das auch nicht mehr genau weiß.
-
Dennis123 schrieb:
Mit .NET klassen ist das schon schwieriger
Schwieriger?
Ich dachte ehrlich gesagt, daß das einfacher sein müßte.. bei .NET wird doch alles in so eine Zwischensprache gecodet... egal ob nun VB oder C++, dementsprechend müßte es doch einfacher sein?
-
Ja aber wenn du das von native-c++ aus machst ist es schwerer. Mit C++/CLI ist das ganz einfach. #import<abc.dll> und gut is.
-
Dennis123 schrieb:
#import<abc.dll> und gut is.
Eben das geht ja nicht, siehe oben:
Hackbard_C schrieb:
Cannot open type libraby file
bekomme ich als Fehler, wenn ich sie einfach wie #import einbinden möchte - muß ich noch etwas beachten?
Ich habe bei VB.Net als Projekt einfach Klassenbibliothek ausgewählt, meine Klasse dort reinkompiliert - fertig.
Das Einbinden in Visual C++ (.NET) klappt aber wie gesagt nicht
*edit* Nochmal die Komplette Fehlermeldung, auch wenns wohl nichts bringt:
fatal error C1083: Cannot open type library file: 'myVb.dll': Fehler beim Laden der Typbibliothek/DLL.
-
Du musst in den Projekteinstellungen "Common Language Runtime Support" auf "/clr" stellen; dann geht es!
-
Jochen Kalmbach schrieb:
dann geht es!
Leider nein, die Einstellungen waren schon auf /clr - der Fehler bleibt also der gleiche
*edit*
Wenn ich es nicht via #import mache, sondern einen Verweis auf die DLL setze kann ich mein Programm immerhin wieder kompilieren.. aber keine Ahnung, wie ich nun meine "Vb.Net-Klasse" nutzen kann... denn einfach aufrufen ala "C++.Net-Klasse" geht nicht..d3plotReader reader("meinFile.txt");
da meckert er
error C2882: 'd3plotReader' : illegal use of namespace identifier in expression
error C2146: syntax error : missing ';' before identifier 'reader'
error C3861: 'reader': identifier not foundNamespace == Name der DLL aber natürlich auch == Name der Klasse == Name des Typ's bzw Konstruktors... hmhm... weiß wer da weiter?
*edit*
Wenn man seine Klasse auch explizit als "Public" deklarieren würde, dann würde es natürlich via Verweis sofort klappen.. *omg*Danke für Eure Hilfe!
-
Klassen in .NET sind immer referenzen d.h. du musst sie mit gcnew erstellen.
d3plotReader^ reader = gcnew d3plotReader("meinFile.txt"); reader->DoSomething();