Laden...

COM-Object ansprechen

Erstellt von pitschi vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.392 Views
P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren
COM-Object ansprechen

Hallo,

ich habe da ein kleines Problem mit einem COM-Ding.

Ich möchte das Teil ansprechen, weiß aber nicht wie. In VB sieht das gnaze so aus:


Dim ApplicationObject = CreateObject("Application.1.1")
Dim report = ApplicationObject.GetComponent("Report")
Database = report.Database(Server,Username,Passwd)

Ich kenne die Application.1.1. Das ist das COM, welches aus der Registry her gestartet wird. Der "Report" ist darin enthalten. Der ist das eigentlich wichtige, was ich brauche. Nur über den komme ich an die Database ran.

Nun habe ich in mein C#-Project schon den Verweis für den Report und für die Database eingebunden.

Leider finde ich aber nicht den Verweis für das ApplicationObject. Wenn ich die entsprechende .exe einbinde, bekomme ich die Fehlermeldung, dass dies keine gültige Assembly oder COM-Komponente ist.

Mit dem VB-Code wird aber genau diese Datei aufgerufen, ausgeführt und dann aus dem VB heraus auf sie zu gegriffen.

Wie kann ich eine ein Ding bauen das es mir möglich macht, das zu realisieren?

Vielen Dank schon jetzt

pitschi

S
8.746 Beiträge seit 2005
vor 18 Jahren

Das funktioniert in .NET anders.

  1. Frühe Bindung. Hier musst du das COM-Objekt in die Steuerelemente-Leiste einfügen und auf ein Fenster ziehen. Schon hast du dein Objekt. Alternativ kannst dir mit TlbImp.exe den Wrapper mit der Hand erzeugen und die erzeugte DLL im Projekt referenzieren. Die kannst du wie jede normale .NET-Klassen verwenden (ist auch eine...).

  2. Alternativ kannst du auch späte Bindung machen, das ist allerdings ein wenig komplexer. Siehe Link.

http://www.microsoft.com/germany/msdn/library/net/SoBringenSieCOMUndNETInEinklang.mspx

P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

Das ging ja schnell...

Die Version mit der TlbImp.exe gefällt mir am besten. Da bekomme ich aber die Fehlermeldung, dass das Format der Datei ungültig sei.

Was kann ich tun?

S
8.746 Beiträge seit 2005
vor 18 Jahren

Probier mal das mit dem Steuerelement. Wenn das geht, geht das andere auch. Und gib mal genau den Kommando-Zeilen-Aufruf an, vielleicht machst du da einen Fehler.

P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

Ich bekomme es übrigens auch nicht in ein Steuerelement gezogen...

Das ist der Komandozeilenaufruf:

.......\SDK\v1.1\Bin>TlbExp.exe c:\Programme\Application\Application.exe /out:ApplicationTest.dll

S
8.746 Beiträge seit 2005
vor 18 Jahren

Findest du es denn überhaupt auf dem COM-Reiter der verfügbaren Steuerelemente? Wenn nicht, ist es nicht registriert.

Der Aufruf ist übrigens falsch. Du muss das Kommando-Tool mit einer Typbibliothek füttern, welche zum Control mitgeliefert sein muss.

Wenn du keine hast, kannst du dir auch selbst eine erzeugen:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/letcreatetypelib.asp

P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

Ne, auf dem COM-Reiter ist es nicht vorhanden. D.h. es sind schon welche vorhanden. Auch welche, die in die entsprechende Richtung gehen, aber in denen habe ich nicht das gefunden, was ich gesucht habe.

Das mit dem Kommando-Tool hatte ich mir fast schon gedacht...

Ich habe auch mit dem "Durchsuchen"-Button versucht das Teil ein zu binden, jedoch gab es da auch nur eine Fehlermeldung. Jetzt kann ich mir fast erklären, warum...

Das mit dem selber erzugen verstehe ich nicht.

Da ist von einer "Windows® Script Component" die Rede. Sowas habe ich gar nicht. Das ist ehr eine Application, die geladen wird. Geht das damit auch?

Ich habe auch noch einen Hinweis in dem Artikel gefunden, den du als erstes gschickt hattest... Da ist von einer "CoCreateInstance" Methode die rede, die aufgerufen wird und ein Object zurück liefert (irgendwie). Kann ich das teil irgendwie benutzen?

P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

Noch ne Kurze Ergänzung...

In dem COM-Reiter habe ich z.B. die Report Komponente und die Database komponente ohne Probleme gefunden...

P
939 Beiträge seit 2003
vor 18 Jahren

Das Tool zum Wrapper-Erstellen heisst TlbImp.exe, nicht TlbExp.exe. Es funktioniert auch mit Dlls. Kommt natürlich drauf an was das für eine Dll ist.

P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

ups...

hast ja recht 🙂

...\SDK\v1.1\Bin>TlbImp.exe \Programm
e\Application\Application.exe /out:ApplicationLib.dll
TlbImp error: The input file 'C:\Programme\Application\Application.exe' is not a valid type library

so besser, aber bringt natürlich auch nicht das gewüschte ergebnis... 🙂)

D
95 Beiträge seit 2005
vor 18 Jahren

Hi pitschi,
wenn du die COM Komponente findest, dann kannst du doch diese als Verweis hinzufügen.
Also im Projektmappenexplorer rechte Maustaste auf "Verweise". Verweis hinzufügen.
Dann erscheint eine Dialogbox mit den Reitern ".Net", "COM" und "Projekte". Dort dann "COM" auswählen.
Dann deine Reportkomponente und deine Datenbankkomponente auswählen. Mit <OK> bestätigen.
Nun erzeugt Visual Studio automatisch die Wrapperdlls ( ReportNameLib und DatenbankNameLib in der Projektmappe/Verweise). Wenn man diese Doppelklickt wird der Objektbrowerser geöffnet und zeigt die enthaltenen Objekte ( interop.ReportName???).
Jetzt kann man im Programm diese Klassen/ Schnittstellen aufrufen.

War es das?
Detlef

P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

Ja...

das wäre es, allerdings will er mir das Teil ebend nicht einfügen. Da sagt er mir, dass es keine gültige Assembly oder COM-Komponente ist.

Die Methode wäre mir die Liebst, weil einfachste.

Jetzt suche ich einen Alternativweg, wo ich die VB-Vorgehensweise (siehe Code meines ersten Postings in diesem Thread) kopieren kann und hoffe, dass jemand so einen kennt.

D
95 Beiträge seit 2005
vor 18 Jahren

Aber ist es dann vielleicht ein ActiveX?
Dann muss man mit der rechten Maustaste auf die "Toolbox" klicken und dort "Elemente hinzufügen". "COM" auswählen und schon hat man eine neue Komponente. Diese dann in das Formular hinzufügen und benutzen.

Weitere Fragen:
Hast du denn auf diesem Rechner, wo du das C# hast, die Komponente mit Visual Basic benutzt? Also bist du sicher, dass sie funktioniert?
Hast du die Rechte sie zu benutzen? Kann man die nicht haben?

Leider keine Lösung, nur Ideen ...
Detlef

P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

Das mit dem ActiveX probiere ich morgen nochmal aus...

Zu den Fragen:

  • Ja, ich habe das in VB auf dem Selben Ordner benutzt.
  • Ja, sie funktioniert. In dem VB kann ich tatsächlich dann damit Arbeiten.
  • Ja, ich habe auch alle Rechte, sie zu benutzen.

Auf jeden fall interessante Ideen. Ich werde da nochmal nachharken 🙂

P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

Hallo,

habe Heute tatsächlich erfahren, dass die Wrapper-DLL, für den Einstig in die COM-Application mit Absicht unterschlagen wurde. Ich bekomme sie wahrscheinlich diese Woche nachgeliefert.

Danke nochmal für die Lösungsansätze. Mir sind einige Dinge klarer geworden...

P
pitschi Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

Hallo,

falls es noch interessiert, hier die Lösung meines Problems:

Da das COM-Object sich ohne Probleme unter VB aber nicht unter C#, mangels fehlender Wrapper-DLL, ansprechen und auslesen lies, habe ich einfach in VB eine Klasse geschrieben, die das von mir benötigte Objekt public enthält. Diese habe ich dann in C# reingeholt und mir das Object geben lassen. Dann habe ich mir mittels System.Reflection das Object geben lassen, das ich wieder TypeCasten konnte.

Nicht ganz schön, aber funktioniert.

grüße und Danke für die vielen Anregungen