COM-Objekt-Interfaces herausfinden ?
Verfasst: 02.06.2006 12:27
Hi!
Ich habe da mal eine Frage zur COM-Objekt-Programmierung:
Ich habe folgende Funktion programmiert:
welche intern die ProgId über die Registry in die CLSID umwandelt und dann über CoCreateInstance_() eine Instanz dazu erzeugt.
Eigentlich bräuchte man ja bereits hierfür ein in PB definiertes Interface, welches sämtliche Methodennamen des COM-Objekts auflisted (Ich nutze hier IUnknown). Für den Methodenaufruf ist später lediglich deren Reihenfolge von belang, da im ASM-output die Aufrufe folgendermaßen ablaufen:
1. Pushe Parameter auf Stack
2. Lade *inst in eax
3. CALL "eax + 4 * 'MethodenId in Liste'"
Mein Ziel ist es, nun eine Methode zu basteln, welche einfach zur Laufzeit versucht, die Methode "MethodenName" aufzurufen, ohne dass das Interface hierfür definiert sein muss. D.h. es muss herausfinden, ob und wenn ja an welcher Stelle die Methode "MethodenName" im Interface steht. Ich hatte schon versucht, das über manuelles Auslesen der DLL zu machen, aber dort erscheinen die Methoden ebenfalls nur noch anhand ihrer ID, nicht ihres Namens.
Gibt es hierfür eine API-Funktion oder lässt sich das irgendwie über QueryInterface oder so erreichen ?
In Matlab funktioniert das übrigens, also muss es irgendwie machbar sein. Da geht das so:
ohne weiteres Hintergrundwissen über die Interfaces, etc.
Ich habe da mal eine Frage zur COM-Objekt-Programmierung:
Ich habe folgende Funktion programmiert:
Code: Alles auswählen
*inst = GetInstanceFromProgId("MyProg.Component")
Eigentlich bräuchte man ja bereits hierfür ein in PB definiertes Interface, welches sämtliche Methodennamen des COM-Objekts auflisted (Ich nutze hier IUnknown). Für den Methodenaufruf ist später lediglich deren Reihenfolge von belang, da im ASM-output die Aufrufe folgendermaßen ablaufen:
1. Pushe Parameter auf Stack
2. Lade *inst in eax
3. CALL "eax + 4 * 'MethodenId in Liste'"
Mein Ziel ist es, nun eine Methode
Code: Alles auswählen
InvokeMethod(*inst, "MethodenName" [, Param1 [, Param2 [,...]]])
Gibt es hierfür eine API-Funktion oder lässt sich das irgendwie über QueryInterface oder so erreichen ?
In Matlab funktioniert das übrigens, also muss es irgendwie machbar sein. Da geht das so:
Code: Alles auswählen
h = actxserver('progid')
h.methodenName(Param1, Param2, ...)