Eleu Geschrieben 11. August 2010 Geschrieben 11. August 2010 Hallo, ich habe mal eine Frage zu der Funktion "CreateObjekt" in VB6 Und zwar kann man ja in der FormLoad mit folgender Anweisung ein COM - Objekt erzeugen und darauf zugreifen. ------------------------ Dim Anwendung As Object Private Sub Form_Load() 'Anwendungs Object erzeugen Set Anwendung = CreateObject("Hier muss das richtige drinstehen damit das klappt") End Sub ----------------------------------- Jetzt steht dazu bei MS: CreateObject kann in Visual Basic nur dann zur Erstellung von Klasseninstanzen verwendet werden, wenn diese explizit als COM-Komponenten verfügbar gemacht werden. CreateObject-Funktion (Visual Basic) Wenn ich jetzt auf eine x-beliebige Anwendung über VB6 zugreifen möchte, wie mache ich das COM Objekt dieser Anwendung dann verfügbar ? Also ohne Verweis sondern zur erst zur Laufzeit. Und wie bekomme man heraus, was in Set Anwendung = CreateObjekt("?????") stehen muss, damit das dann auch funktioniert. Weiß das jemand ? Gruß Eleu Zitieren
MartinSt Geschrieben 12. August 2010 Geschrieben 12. August 2010 Hallo, ich verstehe nicht ganz, wie du dir das Erzeugen der Instanz zur Laufzeit vorstellst, ohne dass dieses zur Entwurfszeit bekannt ist. Wenn man diese Instanz erzeugt, dann will man ja später deren Methoden und Eigenschaften benutzen, dh. man muß wissen, welche sie überhaupt hat. Gruß Martin Zitieren
Klotzkopp Geschrieben 12. August 2010 Geschrieben 12. August 2010 Wenn ich jetzt auf eine x-beliebige Anwendung über VB6 zugreifen möchte, wie mache ich das COM Objekt dieser Anwendung dann verfügbar ? Die wenigsten Anwendungen haben überhaupt eine COM-Schnittstelle. Das ist nichts, was man für jede Anwendung "freischalten" könnte. COM-Objekte müssen in der Anwendung implementiert sein, das passiert nicht automatisch. Wenn also eine Anwendung gar keine COM-Schnittstelle hat, kannst du nichts machen. Wenn sie eine hat, die aber nur nicht registriert ist, kannst du die Regstrierung mit regsvr32.exe (bei DLLs) durchführen. EXE-COM-Server haben üblicherweise einen Kommandozeilenschalter für die Regstrierung. Beides erfordert allerdings Administratorrechte. Und wie bekomme man heraus, was in Set Anwendung = CreateObjekt("?????") stehen muss, damit das dann auch funktioniert.Das bestimmt die Anwendung/Bibliothek selbst, du musst es also vorher wissen. Wie gesagt, das ist kein Mechanismus, um beliebige Anwendungen aus VB zu benutzen. Die Anwendung muss das explizit anbieten. Zitieren
Eleu Geschrieben 12. August 2010 Autor Geschrieben 12. August 2010 Hallo, ich verstehe nicht ganz, wie du dir das Erzeugen der Instanz zur Laufzeit vorstellst, ohne dass dieses zur Entwurfszeit bekannt ist. Wenn man diese Instanz erzeugt, dann will man ja später deren Methoden und Eigenschaften benutzen, dh. man muß wissen, welche sie überhaupt hat. Hallo MartinSt, also ich glaube, wenn das Objekt nicht über einen Verweis dem Projekt bekannt gemacht wird, sondern erst zur Laufzeit, nennt man es späte Bindung. Bin mir jedenfalls sicher, das es bei manchen Applikationen funktioniert, da ich einen Datenaustausch ohne Verweis im Projekt schon mal Richtung WinCC hinbekommen habe. Das bestimmt die Anwendung/Bibliothek selbst, du musst es also vorher wissen. Wie gesagt, das ist kein Mechanismus, um beliebige Anwendungen aus VB zu benutzen. Die Anwendung muss das explizit anbieten. Hallo Klotzkopp, hatte gehofft, dass es irgendwie über "dcomcnfg" herauszufinden ist. Da sind ja irgendwie COM Objekte aufgelistet. Weiß aber nicht wo ich da gucken muss / kann. Also ich verstehe dich so, dass wenn eine App. ein COM Objekt unterstützt, dieses nur ansprechbar ist, wenn man die Schnittstellendoku vom Hersteller hat. Gruß Eleu Zitieren
Klotzkopp Geschrieben 12. August 2010 Geschrieben 12. August 2010 Was versprichst du dir denn eigentlich davon? Selbst wenn eine Anwendung eine COM-Schnittstelle hat, heißt das nicht, dass du damit die Anwendung so kontrollieren kannst, wie das bei den Office-Produkten der Fall ist. Das COM-Automatisierungsinterface von Word zum Beispiel stellt praktisch alle Funktionen von Word zur Verfügung. Das muss aber nicht so sein. Weder muss eine COM-Schnittstelle dieselbe Funktionalität zur Verfügung stellen wie die Anwendung selbst, noch muss sie vollständig sein. Ich habe hier beispielsweise eine Anwendung, die eine COM-Schnittstelle hat. Sie stellt von ihren vielen Funktionen genau zwei über COM zur Verfügung. Und in diesen beiden Funktionen verhält sie sich über COM anders, als wenn man die Funktion direkt aus der Anwendung aufrufen würde. Und man muss genau wissen, wie man diese Funktionen benutzt. Du scheinst dir unter COM eine automatisch vorhandene Fernsteuerungsmöglichkeit für jede Art Anwendung vorzustellen, das ist aber nicht der Fall. Beschreib also bitte, was du damit erreichen willst. Vielleicht geht's ja auch anders. Zitieren
Eleu Geschrieben 12. August 2010 Autor Geschrieben 12. August 2010 Du scheinst dir unter COM eine automatisch vorhandene Fernsteuerungsmöglichkeit für jede Art Anwendung vorzustellen, das ist aber nicht der Fall. Beschreib also bitte, was du damit erreichen willst. Vielleicht geht's ja auch anders. Es ist eine rein theoretische Frage, die im Prinzip nur dazu dient, meinem eigenen Verständnis auf die Sprünge zu helfen. Also kein konkretes Projekt. Ich hatte angenommen, dass die Eigenschaften und Methoden von COM Objekten, falls sie vorhanden sind, ähnlich wie bei Klassen, offen verfügbar sind. Wenn auch keine Beschreibung dieser Eigenschaften und Methoden vorliegt, so ist doch vielleicht durch ausprobieren etwas möglich ? Eine Eigenschaft "value" wäre ja zum Beispiel ziemlich selbsterklärend. Aber wo findet man zur entsprechenden Applikation den Namen der .dll oder der .exe und die Eigenschaften und Methoden die von diesen COM - Objekten veröffentlicht werden ? Kann man das gar nicht herausfinden ? Oder ist das die berühmte Nadel im Heuhaufen ? Zitieren
Klotzkopp Geschrieben 12. August 2010 Geschrieben 12. August 2010 Wenn auch keine Beschreibung dieser Eigenschaften und Methoden vorliegt, so ist doch vielleicht durch ausprobieren etwas möglich ? Ausprobieren halte ich für gewagt. Du solltest nicht irgendwelche Funktionen aufrufen, von denen du nicht weißt, was sie tun. Erstens kannst du die Wirkung unter Umständen gar nicht beobachten, weil beispielsweise nur der interne Zustand eines Objekts geändert wird, oder weil eine Wirkung erst im Zusammenspiel mit anderen Funktionsaufrufen eintritt. Zweitens kann so ein Aufruf durchaus unerwünschte Effekte haben. Gelöschte Dateien gehören da vermutlich noch zu den kleineren Problemen. Aber wo findet man zur entsprechenden Applikation den Namen der .dll oder der .exe und die Eigenschaften und Methoden die von diesen COM - Objekten veröffentlicht werden ? Alle COM-Objekte werden registriert, d.h. die Informationen darüber, welche DLL, OCX oder EXE ein bestimmtes Objekt bereitstellt, steht in der Registry unter der CLSID des Objekts (das ist der 16-Byte-Zahlenwert wie {000209FF-0000-0000-C000-000000000046}). Wenn du in VB CreateObject benutzt, sucht das Programm in der Registry nach dem angegebenen Namen (die sog. ProgID), um darüber die CLSID zu ermitteln, und darüber wiederum die zu benutzende DLL oder EXE. Wenn das Objekt das IDispatch-Interface implementiert (und das muss es, um aus VB6 benutzbar zu sein), kannst du die Methoden und Eigenschaften zur Laufzeit ermitteln. Das sagt dir aber immer noch nicht, wie das Objekt zu benutzen ist. Zitieren
Eleu Geschrieben 12. August 2010 Autor Geschrieben 12. August 2010 Ich glaube, ich habe jetzt den Mechanismus verstanden der dahintersteckt. Vielen Dank dafür. Versuche auf einer alten stand allone Maschine sind m.E. schmerzfrei. Wo findet man denn in der Registry die jeweilige ProgID ? Zitieren
Klotzkopp Geschrieben 12. August 2010 Geschrieben 12. August 2010 Wo findet man denn in der Registry die jeweilige ProgID ?Jede registrierte ProgID hat einen Unterschlüssel unter HKEY_CLASSES_ROOT. Die CLSIDs stehen unter HKEY_CLASSES_ROOT/CLSID. Zitieren
Eleu Geschrieben 13. August 2010 Autor Geschrieben 13. August 2010 Wenn das Objekt das IDispatch-Interface implementiert (und das muss es, um aus VB6 benutzbar zu sein), kannst du die Methoden und Eigenschaften zur Laufzeit ermitteln. Wie meinst Du das genau ? Kann ich die verfügbaren Methoden u. Eigenschaften des COM - Objektes über VB zur Laufzeit auch auflisten ? Wenn ja, wie denn ? Ich habe gelesen, dass man das mit dem Tool "oleview" von MS kann. Geht das damit, oder gibt es etwas besseres ? Ich habe mir das Tool overview.exe downgeloaded und bekomme beim Start des Programms die Meldung das er die IViewers.dll nicht finden kann. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.