Announcement

Collapse
No announcement yet.

TypeBibiliothek ermitteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TypeBibiliothek ermitteln

    Hallo,

    ich habe ein Problem eine Typbibiliothek zu finden. Das einzige was ich bisher habe ist ein möglicherweise unvollständiges Interface und eine Guid.

    Ich habe also folgendes gebaut und kann mein COM-Objekt auch finden und über das Interface alle mir bekannten Funktionen benutzen.

    Code:
        [ComImport, Guid(COMConstants.myGuid), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        interface IMyInterface
        {
    
            [PreserveSig, DispId(1)]
            int Read([In] int type, [In] int id, [In] IStream destination);
    
            ...
        }
    Jetzt würde ich gern wissen, in welcher DLL sich mein COM-Objekt versteckt, damit ich mit TLBImp ein volständiges Interface erstellen kann. Ich weiß, dass es auch noch eine Reihe verwandter typn dort geben muss - von denen weiß ich jedoch nichts als die Guid.

    Wie gesagt ich habe nur die Guid und zur Laufzeit eine Instanz über mein rudimentäres Interface. Wie kann ich an mehr Informationen gelangen?

    Grüße Kim

  • #2
    Hallo Kim Yong Sha2,


    such doch einfach in der Windows-Registry (regedit.exe) nach der Dir bekannten GUID. Da diese ja offensichtlich richtig ist, muß es eine Eintragung in der Registry geben (HKEY_CLASSES_ROOT\CLSID). Der untergeordnete Schlüssel "InprocServer" gibt dann Auskunft darüber, in welcher Datei dieses Objekt bzw. Interface definiert wurde. Wenn nur ein Dateiname angegeben ist, dann befindet sich diese Datei sehr wahrscheinlich im Verzeichnis "windows\system32".


    Mit freundlichen Grüßen,


    rednax

    Comment


    • #3
      Hi rednax,

      vielen Dank für die schnelle Antwort. Also ich habe jetzt dort nochmal nachgeschaut. Die DLL heißt NSObjectXProxy.dll. Wenn ich jedoch "TLBImp NSObjectXProxy.dll" mache, kommt: "TlbImp : error TI0000 : The input file 'Q:\Test\nsobjectxproxy.dll' is not a valid type library."

      Was kann ich nun tun?

      Comment


      • #4
        Hallo,

        ...is not a valid type library.
        nicht alle COM-Objekt haben eine binäre Typibliothek (tlb). Der Typbibliotheksmarshaler (oleaut32.dll) von Windows wurde von Microsoft primär für die Dual Interfaces von Visual Basic vorgesehen (obwohl auch Borland Delphi diesen Weg genutzt hat). Der Typbibliotheksmarshaler liest zur Laufzeit auf beiden Seiten (COM-Objekt- und Client-Prozess) die binäre TLB aus, um im Arbeitsspeicher jeweils ein generiertes Proxy-Objekt einzublenden. Wenn das COM-Objekt allerdings mit C/C++ geschrieben wurde, wird es eigene Proxy-/Stub-DLLs mitbringen und in der Registry als zuständigen Marshaler registrieren (bei C++ hat das Tool den Quelltext für diese Proxy-DLLs generiert, so dass der Entwickler bereitst die fertige Proxy-DLLs mit ausliefern konnte).

        Da "ComInterfaceType.InterfaceIsIUnknown" in der Frage vorkommt, ist der Typbibliotheksmarshaler nicht im Spiel. Anstelle der binären TLB liegt in derartigen Fällen im besten Fall nur eine IDL-Datei (Interface Description Language) mit der Schnittstellenbeschreibung vor. Mit dem Tool MIDL.EXE aus dem Platform SDK kann aus der IDL-Datei eine TLB-Datei generiert werden. Mit dem Tool TLBIMP.EXE aus dem .NET Framework SDK wird daraus ein RCW (Runtime Callable Wrapper) generiert.

        Wenn keine IDL-Datei vorliegt, wird es schwierig (weil der Entwickler des COM-Objekts anscheindend die Öffentlichkeit außen vor lassen wollte). Über Reverse Engineering müsste das Interface aus der Implementierung der Proxy-DLLs von Hand extrahiert werden.
        Zuletzt editiert von Andreas Kosch; 17.03.2007, 16:08.

        Comment

        Working...
        X