VB Dll in C++ Projekt laden



  • Hiho,

    ich bin leider in der ungünstigen Lage eine in Visual Basic geschriebene
    DLL in meinem C++ Programm verwenden zu müssen.

    In VB habe ich eigentlich Null Erfahrung. Dennoch habe ich es dort geschafft
    diese VB Dll (Data.dll) zu laden. In C++ sieht das erheblich schwerer aus.

    Wo ich in VB einfach "Dim vKlasse as new xKlasse" verwenden konnte,
    stehe ich nun Ideenlos in C++ davor.

    Wie kann ich meine Klasse über C++ dennoch aus der DLL verwenden?

    Über Dependency Walker wird nichtmal die Klasse exportiert, sondern
    nur ein GetObjectOfClass. Da habe ich ja plötzlich einen absolut anderen Ansatz?

    Das läuft dann in der VB-DLL zusätzlich noch über irgendeine
    weiter MSVB...dll, die meine Data.dll offenbar selbst nochmal aufruft.



  • Die VB-DLL ist wohl eine COM-Komponente. Somit kannst Du sie wie jede andere COM-Componente auch ansprechen....
    z.B. via "#import"
    http://msdn2.microsoft.com/en-us/8etzzkb6(VS.80).aspx



  • Super, das mit dem #import hat offenbar geklappt (geht aber offenbar nur mit raw_interfaces_only)

    Ich habe allerdings mit COM bzw. DLL absolut keine Erfahrungen.
    Wie greife ich nun auf meine VB-Klassen der DLL zu?
    Dort wurde ja mit

    Dim vKlasse as new xKlasse
    

    bzw.

    Dim myVar as string
    

    deklariert.



  • Hallo Guffy

    hasts du schon eine Lösung gefunden? Würd mich auch intressiern.
    Kannst hier mal posten, wenns was neues gibt?



  • Nein. Bin nicht weiter. Laie halt...vlt kann Herr Kalmbach noch helfen?



  • Ich push dann mal in der Hoffnung dass jemand eine Idee dazu hat.



  • Hallo Herr Kalmbach & andere Spezialisten,

    ich habe mir schon die Finger wundgesucht, wie ich eine
    sinnvolle Eindindung in C++ vornehmen kann.
    Also den Zugriff auf die VB-Klassen bekommen kann.

    Irgendwie ist immer nur der umgekehrte Fall (von c++.dll in VB
    laden und nutzen) die Rede bei google und Konsorten.

    Wenn ihr mich auf den richtigen Weg bringen könnt, wäre ich
    sowas von dankbar und froh 😉



  • 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/169496

    Falls 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!


Anmelden zum Antworten