CLSID eines erstellbaren Objektes herausfinden & Objekt ansteuern

  • Hallo zusammen,


    ich habe folgendes Anliegen: Im Ordner C:\Windows\SysWOW64 liegt die PortableDeviceAPI.dll, die in der Registry registriert ist und über ein COM-Interface (ich denk, das hat was mit ObjCreate() zu tun), angesteuert werden kann.

    Was die DLL kann: Man kann alle über USB verbundenen Geräte auflisten und Dateien über das MTP-Protokoll austauschen.

    Meine Frage: Wie bekomm ich den Klassennamen bzw. die CLSID des Objekts und wie kann ich die vorhandenen COM-Methoden aufrufen.

    Die Methoden konnt' ich schon mal ausfindig machen, aber keine Paramter.


    So wird in C++ das Interface erstellt: Establishing a Connection.


    CoCreateInstance(CLSID_PortableDeviceFTM, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppDevice));


    wobei ich die Parameterwerte nirgendswo finden konnte, auch nicht die CLSID. Es gibt anscheinend 2 verschiedene CLSIDs, siehe Microsoft-Dokumentation: IPortableDevice interface.



    Um jegliche Hilfe wäre ich sehr dankbar, es eilt aber nicht, da ich grad selber wenig Zeit hab.


    Vielen Dank, NO1 :-)

  • Im EN-Forum gabs dazu einen Beitrag: https://www.autoitscript.com/f…338-get-portable-devices/



    EDIT:

    Ich denke, das kann durchaus in einer Funktion untergebracht werden. Habe den Code mal angepasst.

    Der Zugriff (darauf bezog sich deine Frage) passiert in Zeile 25. Es wird ein Objektinterface erstellt, aus CLSID und IID und der Struktur(Interfacebeschreibung) des PortableDeviceManager. Mit diesem Interface hast du dann Zugriff auf die Methoden.


    Die Methoden konnt' ich schon mal ausfindig machen, aber keine Paramter.

    Um Parameter zu finden, gehe ich immer so vor:

    - Dll im DLL Export Viewer laden

    - gewünschte Funktion markieren

    - mit F7 Google-Suche zu dieser Funktion aufrufen

  • Erstmal recht herzlichen Dank BugFix, hatt mir echt sehr weitergeholfen, hab den Eintrag im englischen Forum auch gar nicht gefunden.

    Ich lass das Thema mal noch offen, falls es weitere Fragen meinerseits gäbe.


    Den DLL-Export Viewer hatt ich auch, damit hab ich die Methoden herausgefunden :D.


    Jetzt noch ne generelle Frage:


    Die CLSID hab ich über die Registry rausgefunden, wo bekomm ich zum Beispiel die Interface-ID her?

    Woher weiß ich welche DLL-Structs ich benötige? Weil ich hab jetzt zu dem PortableDeviceInterface keine gute Doku und kein brauchbares Beispiel gefunden (auch in c#, c++, vbs usw.).

  • Diese Informationen findest du generell in den Header Dateien. Gehen wir mal von dem IPortableDeviceManager Interface aus, diese ist in der PortableDeviceApi.h definiert. Dort findest du auch die einzelnen Strukturen der entsprechenden Interfaces. In welchen Header die Interfaces zu finden ist siehst du ja in MSDN - Demnach dann in Google: Header + Source > "PortableDeviceApi.h source" -> Und du findest meist den Source Code. In dem Fall war das mein erster Eintrag:


    https://github.com/tpn/winsdk-….0/um/PortableDeviceApi.h


    Im Browser die Suche aktiviert und (Strg + F) und nach IPortableDeviceManager gesucht.



    Hier bekommen wir zum einen die Struktur des Interfaces raus, zum anderen auch die IID -> MIDL_INTERFACE("a1567595-4c2f-4574-a6fa-ecef917b9a40")


    Wie du die CLSID her bekommst weißt du ja. Generell ist das COM Gedönse extrem schlecht dokumentiert für AutoIt Zwecke.

  • Eine Übersicht über die Klassen und Interfaces der PortableDeviceAPI.dll findest du unter Windows 7 DLL File Information - PortableDeviceApi.dll.

    Die CLSID der Objekte findest in der Registry im Zweig HKEY_CLASSES_ROOT, Suchbegriff 'PortableDeviceAPI.dll'.


    Dazu findest du dann diese Einträge:



    Dann googeln nach der ersten Klasse (PortableDeviceManager). Erster Fund ist gleich IPortableDeviceManager interface (Windows) - MSDN - Microsoft .

    Dort findest du die Methoden und verlinkt deren Parameter.

    Ebenfalls verlinkt sind die 'Client Interfaces'.

    Nun müssen wir noch die IID der Interfaces finden. Unter MSDN ist auf Anhieb nichts zu finden. Also ist die zweite Anlaufstelle WinSDK. Googeln mit "winsdk PortableDeviceManager" bringt dir u.a.: winsdk-10/PortableDeviceApi.h at master · tpn/winsdk-10 · GitHub.

    In der 'PortableDeviceApi.h' findest du alle erforderlichen Informationen.

    Oder auch die reine Interfacebeschreibung in der PortableDeviceApi.idl.


    Die Interfacebeschreibung erfolgt in AutoIt so:

    $sTagInterface = "MethodName1 RetType(ParamType1;ParamType2;...); MethodName2 RetType(..."

    Was mir im Moment nicht ganz klar ist, warum im Bsp. z.B. GetDeviceFriendlyName hresult(wstr;wstr;dword*) verwendet wird.

    Laut MSDN:

    Code
    HRESULT GetDeviceFriendlyName(
    [in] LPCWSTR pszPnPDeviceID, Pointer to a null-terminated string that contains the device's Plug and Play ID.
    [in, out] WCHAR *pDeviceFriendlyName, A caller-allocated buffer that is used to hold the user-friendly name for the device.
    [in, out] DWORD *pcchDeviceFriendlyName On output, the number of characters that is returned by pDeviceFriendlyName
    );

    Ich hätte also eher verwendet: $sTagInterface = "GetDeviceFriendlyName HRESULT(wstr;wstr*;dword*)", was jedoch zum Absturz des Skriptes führt.

    Aber vielleicht hat ja da jemand eine Erklärung für.



    EDIT: Kaum hat man mühevoll seinen Post ordentlich mit viel Zeitaufwand formatiert, drängelt sich schon wer mit einer Antwort dazwischen. :rofl:

  • Zitat

    EDIT: Kaum hat man mühevoll seinen Post ordentlich mit viel Zeitaufwand formatiert, drängelt sich schon wer mit einer Antwort dazwischen. :rofl:

    Sorry, ich konnte mich nicht zurück halten. Hab es schon fast gerochen dass du was schreibst, :P

    Zitat


    Ich hätte also eher verwendet: $sTagInterface = "GetDeviceFriendlyName HRESULT(wstr;wstr*;dword*)", was jedoch zum Absturz des Skriptes führt.

    GetDeviceFriendlyName möchte als zweiten Parameter einen Pointer zu den Stringanfang. AutoIt regelt das intern bereits von selber für str, wstr und bstr. Dort ist es niemals nötig nochmal das "*" anzugeben es sei denn die Ziel Methode möchte einen doppleten pointer haben: ala -> **pDeviceFriendlyName


    Es geht sogar so weit, dass du durch das * eben diesen doppelten pointer generierst.

  • Uja... vielen Dank ihr Beiden. Das ist aber ganz schön kompliziert. Vor allem, weil es echt keine sinnvollen Dokumentationen für nicht Microsoft-Sprachen gibt. Danke für die verlinkten Seiten, die sind mir neu. Jetz kann ich wenigstens mal versuchen die DLL-Tags zu verstehen.


    LG NO1 :-)