SAFEARRAY aus TypeLib?



  • Hallo zusammen,

    ich versuche jetzt schon seit Stunden aus einer tlb (per #import eingebunden) ein SAFEARRAY zurückzulesen. Das Array ist vom Typ UDT, das entsprechende Struct wird in der tlh definiert. Die Funktion die mich interessiert sieht wie folgt aus:

    virtual HRESULT __stdcall get_foo (
        /*[out,retval]*/ SAFEARRAY * * pRetVal ) = 0;
    

    Der zugehörige Datentyp (UDT):

    struct __declspec(uuid("ceb83eb7-efec-3d12-b520-b74fe0127063"))
    OptionSelect
    {
        LPSTR Line1;
        LPSTR Line2;
        long Inverted;
    };
    

    Die Frage ist jetzt was als Parameter an get_foo zu übergeben ist.
    Für einfache Arrays wie Strings reicht ein Pointer auf ein SAFEARRAY* nur für UDT's scheint das nicht zu reichen 😞

    Viele Grüße

    connan.


  • Mod

    GIDF.
    Suche nach SafeArray und UDT liefert sofort einen Eintrag auf die MSDN
    http://msdn.microsoft.com/en-us/library/ms221212.aspx



  • Das Beispiel kenn ich gut, ich scheitere aber schon an diser Zeile:

    hr = LoadRegTypeLib(LIBID_Student, 1, 0, GetUserDefaultLCID(), &pTypelib);
    

    Was setze ich für LIBID_Student ein? Ich habe zwar die GUID der TypeLib aber die einzige Funktion die ich gefunden habe um die umzuwandeln ist CLSIDFromString aber da wird eine ungültige ClassId angemeckert (__uuidof(...) hat auch nicht funktioniert). Außerdem sollte doch LoadRegTypeLib schon durch den import erledigt sein!? Ich tu mich immer schwer mit COM/ATL und ich will ja auch 'nur' die Funktion nutzen und nicht selbst COM entwickeln. Irgendwie fehlt mir aber ein entscheidendes Stück zum Puzzle.


  • Mod

    Das ist die Library GUID, wenn Du diese hast, kannst Du die auch selber definieren.
    Wie hast Du uuidof benutzt? Denn OptionSelect hat ja eine UID. Wenn Du also die korrekte tlh einbindest solle _uuidof gehen.



  • Also der Anfang der tlh sieht so aus:

    // Created by Microsoft (R) C/C++ Compiler Version 14.00.50727.762 (b9652826).
    //
    // C:\DOKUME~1\***\LOKALE~1\Temp\sharedmem.tlh
    //
    // C++ source equivalent of Win32 type library C:\SharedMem\SharedMem.tlb
    // compiler-generated file created 03/23/10 at 00:55:06 - DO NOT EDIT!
    
    //
    // Cross-referenced type libraries:
    //
    //  #import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb"
    //
    
    #pragma once
    #pragma pack(push, 8)
    
    #include <comdef.h>
    
    namespace SharedMem {
    
    //
    // Forward references and typedefs
    //
    
    struct __declspec(uuid("7cd071e9-56f0-4e7a-b261-622c2bcbb44e"))
    /* LIBID */ __SharedMem;
    enum Bits;
    enum Bits2;
    enum Bits3;
    (...)
    

    Was ich versucht habe ist dann folgendes:

    LPTYPELIB pTL;
        hr = LoadRegTypeLib(__uuidof( SharedMem::__SharedMem), 2, 1,GetUserDefaultLCID() , &pTL);
    

    Das funktioniert inzwischen auch, der Fehler lag in der Versionsnummer. In der Assembly ist die Version 1.2.0.0 eingetragen. Warum ich dann bei wVerMajor eine 2 eintragen muß verstehe ich zwar nicht, aber gut. Der nächste Schritt:

    LPTYPEINFO pTI;
        hr = pTL->GetTypeInfoOfGuid(__uuidof( SharedMem::OptionSelect ), &pTI);
    

    funktioniert auch, aber an der entscheidenden Stelle:

    IRecordInfo* pRI;
        hr = GetRecordInfoFromTypeInfo( pTI, &pRI );
    

    bekomme ich die Fehlermeldung 'Altes Format oder ungültige TLB'. Eine Suche ergab das es wohl etwas mit der LCID zu tun hat aber alle Versuche da etwas anderes einzutragen schlugen bis jetzt fehl. An dieser Stelle bin ich mal wieder Ratlos 😞


Anmelden zum Antworten