Visual Basic DLL Funktionen in C++ importieren und verwenden
-
Hallo,
ich habe seit geraumer Zeit ein Problem das ich einfach nicht gelöst bekomme...
Ich möchte aus einer C++ DLL eine Visual Basic DLL aufrufen um somit MS Office Programme zu steuern. Leider kann ich C++ nicht wirklich, Visual Basic jedoch schon, deswegen gehe ich diesen weg. (Ich habe bereits versucht die TypeLibs von Microsoft Office zu verwenden, siehe "Anhang:" unten)
Ich habe zum Test eine Visual Basic Class Library (.dll) in Visual Studio geschrieben welche eine MsgBox aufruft:
Public Class Test Public Function callBox(ByVal strIn As String) MsgBox("VB MsgBox! Hello " + strIn + "!") End Function End Class
Diese habe ich kompiliert, das ging auch und dann in mein VC++ Projekt geschoben.
In mein VC++ Projekt habe ich dann in der "stdafx.h"-Datei unter dem ersten#pragma once
folgendes geschrieben:
#import "vb2vc.dll" using namespace vb2vc;
Die VB-DLL-Funktion wird dann in meiner VBtoVC.cpp wie folgt aufgerufen:
void Test(char* strIn) { HRESULT hresult; CLSID clsid; _test *t; CoInitialize(NULL); hresult = CLSIDFromProgID(OLESTR("vb2vc.test"), &clsid); hresult = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, __uuidof(_test), (LPVOID *)&t); if (!FAILED(hresult)) { t->callBox(strIn); }
Beim Kompilieren meiner C++ DLL kommt dann allerdings der Fehler C1083, die Datei ist jedoch im Ordner vorhanden und richtig geschrieben.
Ich habe dann Google konsultiert und bin auf folgenden Thread gestoßen:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c2a470e0-52c8-47c8-a953-003d28c921c4/fatal-error-c1083-cannot-open-type-library-fileDieser empfiehlt zuerst /clr in den Projekteinstellungen zu aktivieren, getan - gleicher Fehler.
Dann empfiehlt er die DLL mit der regasm.exe zu registrieren/eine TypeLib zu erstellen.
Wenn ich dann weiterhin über#import
gehe dann kommt der gleiche Fehler, versuche ich die .tlb in Referenzen auszuwählen kommt folgende Fehlermeldung (englisch):
"Could not add a reference to: [DATEI] For one of the following reasons:
- Targets a higher version of the .NET Framework
- Not a .NET assembly
- Not a registered ActiveX control"Ich versuche das mittlerweile schon seit 3 Wochen und komme leider auf kein Ergebnis...
Was mache ich falsch und wie kann ich das bewerkstelligen?Anhang:
Ich hatte versucht die TypeLib von MS PowerPoint als Referenz zu verwenden und dann die erstellte Headerdatei zu verwenden, hier wird mir dann allerdings ein Haufen Fehler angezeigt (180 Error, 40 Warnings) (Hauptsächlich syntax und no return statement...).Ich wäre überglücklich wenn ich dieses Thema vom Tisch bekommen kann und endlich wieder produktiv werden kann.
Ich bedanke mich schonmal vielmals im Voraus für Antworten!Vielen Dank!
Viele Grüße
- Daniel
-
Deine DLL mag da sein, aber nicht dort wo sie gesucht wird.
Leg die datei mal in das Projektverzeichnis. Bist Du ganz sicher, diese DLL sich per COM ansprechen last.Verwende mal VBScript zum Testen.
Bzgl. nutzung der COM Automatisation von Office gibt es ca. 3Mio Beispiele inkl. Code. Hier solltest Du genauer warden was Du gemacht hast und was detailiert nicht geht.
-
Hallo,
die DLL liegt im Projektverzeichnis, habe mich auch nicht verschrieben...
Ob sie per COM ansprechbar ist weiß ich leider nicht...Ich werds gleich mal mit VBScript versuchen, danke.
Ich hatte lediglich genau den Anweisungen folgenden Artikels gefolgt:
http://support.microsoft.com/kb/307473/en-us
Das
#import
zeigt mir allerdings dann erst an das die .tlh/.tlb nicht gefunden werden kann was sich nach dem ersten Build erledigt hat, aber der Build failed wegen der beschriebenen syntax und return statement Fehler in der Headerdatei von (in meinem Fall) PowerPoint...
-
Gib etwas mehr Infos, was nicht geht. Fehlermeldungen. Codezeilen...
Sicher das #import nach include der Windows.h erfolgt?