2016-04-20 19 views
0

Ich bin eine COM-API wickeln Letztendlich versuche ich, mehr Code in Generics zu drücken und das Vererbungsmuster in der API hilft nicht.Aufrufen einer COM-Methode mithilfe von InvokeMember

Ich habe eine generische IBase, Es gibt ~ 80 Klassen, die Ergebnissätze darstellen. Sie sind sehr ähnlich, aber sie alle erben oder implementieren eher die sehr einfache IBase.

Ich habe versucht, Extension-Methoden und ich glaube nicht, dass der Weg zu gehen ist, weil die com ist spät gebunden und mit Reflection.PropertyInfo schien eine Sackgasse zu sein.

Im generischen haben wir die Untertypen, also denke ich, dass ich InvokeMember verwenden kann, um die Methoden/Eigenschaften aufzurufen, die ich brauche.

Meine Herausforderung ist, dass ich das ProgId nicht finden kann. Ich habe die Registrierung durchsucht, ich habe viele Vermutungen gemacht. "Excel.Application" funktioniert, also ist der grundlegende Ansatz solide.

Die COM dll in Frage ist die Intuit Quickbooks API. Ich habe versucht, viele Variationen von

„QBFC13Lib.ICustomerRetList“

Bin ich auf dem richtigen Weg? Wenn ja, wo finde ich das ProgId? Soll ich eine andere Wende versuchen?

von OleView, sehe ich diese für ICustomerRetList

[ 
    odl, 
    uuid(DF331154-953C-4813-BAEC-F65DDBBFEB5B), 
    helpstring("ICustomerTypeRetList Interface"), 
    dual, 
    oleautomation 
] 
interface ICustomerTypeRetList : IQBBase { 
    [id(0x00000004), helpstring("method GetAt")] 
    HRESULT GetAt(
        long index, 
        [out, retval] ICustomerTypeRet** retVal); 
    [id(0x00000005), propget, helpstring("property Count")] 
    HRESULT Count([out, retval] long* pVal); 
    [id(0x00000006), helpstring("method Append")] 
    HRESULT Append([out, retval] ICustomerTypeRet** retVal); 
}; 

einige relevante Linien von der typelib

gibt es 36-Schnittstelle Erklärungen. Ich denke, wir festgestellt haben, wir nicht nach diesen sind ... wir die Dinge wollen, dass diese

interface ICustomerMsgRetList;  
interface ICustomerMod; 

dort implementieren sind viele Linien, die Typen wie die Zeile unter verweisen. Dies sind einfach Objekte, die den Kunden als Eigenschaft haben (Bestellung zum Beispiel). Diese werden alle in Interface-Deklarationen gefunden. Es ist schon eine Weile her, seit ich C++ gemacht habe. Ist IQBBase ein Zeiger auf einen Zeiger? Nachdenklich denken, brauchen Sie keine Antwort.

HRESULT CustomerRef([out, retval] IQBBaseRef** pVal);  

Also ja, kann es zu einer Fabrik sein dort irgendwo. Ich glaube, dass diese Objekte (ICustomerRetList-Implementierer) instanziierbar sind, sie sind eindeutig instanziiert. Aber die Typelib gibt ihre Geheimnisse nicht auf. Zurück zur ursprünglichen Frage, ich glaube nicht, dass es eine Antwort gibt, wenn ich nicht das ProgId bekommen kann. Die ProgIDs können absichtlich verschleiert werden. Weiß nicht. Ich weiß, ich denke an sie und war nicht erfolgreich. Das Intuit Support Forum ist nach meinem besten Wissen nicht mehr aktiv.

+0

erhalten https://github.com/pkpjpmZombie –

+0

danke, können Sie die Frage – greg

Antwort

1

Sie schreiben "Die com dll in Frage ist die Intuit Quickbooks api". Das verstehe ich nicht ganz, weil das nicht der Name einer DLL ist. Wenn Sie die DLL kennen, können Sie das Microsoft-Dienstprogramm OleView mit dem Namen der DLL verwenden, und es wird eine dekompilierte Typbibliothek für Sie angezeigt, in der Sie alle Typen einschließlich ProgIds betrachten können.

Persönlich würde ich regedit.exe verwenden und dann zu HKEY_CLASSES_ROOT \ TypeLib gehen. Von dort würde ich die Suchfunktion verwenden, um nach "Intuit" oder "Quickbooks" zu suchen, um die Typbibliothek zu finden. Wenn Sie die Typbibliothek finden, können Sie sie mit OleView durchsuchen.

Wenn Sie es nicht finden, können Sie Ihre Quickbooks-Installation anzeigen und dann den Dateipfad finden. Nachdem Sie den Pfad gefunden haben, wechseln Sie in RegEdit zu HKEY_CLASSES_ROOT und suchen Sie nach dem Pfad. Sie sollten einige Schlüssel finden, die den Pfad haben und wenn sie mit LocalServer32 oder InProcServer32 beschriftet sind, erhalten Sie die CLSID und von der CLSID können Sie die ProgID

+0

kommentieren ich die Ausgabe für ICustomerRetList. Ich sehe eine uuId und einen Helpstring. sind beide von denen, wonach ich bin? – greg

+1

Der Name der Schnittstelle wird Ihnen nicht helfen. Was Sie brauchen, ist der Name des Objekts, das diese Schnittstelle implementiert. Wenn Sie Quickbooks auf Ihrem PC haben, gehen Sie in das Verzeichnis und suchen Sie nach einer Typbibliotheksdatei (.tlb). Es kann einen haben oder nicht. Die Typbibliothek kann in eine DLL oder EXE eingebettet sein. Sie können versuchen, OleView für jede DLL oder EXE in dem Verzeichnis Quickbooks zu verwenden, um die Typenbibliothek zu finden. Wenn es Automatisierungsmethoden verfügbar macht, werden Sie es schließlich finden. Die andere Sache, die Sie tun müssen, ist sicherzustellen, dass Ihre Anwendung 64 Bits ist, wenn die Quickbooks DLL 64 Bits oder wenn 32 Bits auch 32 Bits ist. –

+0

Wenn ich den OleViewer öffne, Datei-> TypeLib laden und auf qbfcLib13.dll ... zeige, bekomme ich einen Baum auf der linken Seite, es gibt Enumerationen, Interfaces und dispInterfaces. Ich verstehe den Unterschied zwischen einer Schnittstelle und einem Objekt, das eine Schnittstelle implementiert. Alles, was ich jemals in der Dokumentation gesehen habe, sind jedoch Verweise auf die Schnittstellen. Ich bin nicht sicher, wie, aber die Klassennamen, wenn es Klassennamen gibt, scheinen maskiert zu sein. Vielleicht schaue ich nicht an der richtigen Stelle. – greg