Springe zum Inhalt

GetRecordInfoFromGuids liefert E_INVALIDARG wenn ein UDT struct einen Member vom Typ GUID enthält

Für ein aktuelles Projekt arbeitete ich an einem COM-Server von dem einige Funktionen ein SAFEARRAY aus structs zurückgeben sollten. In der COM-Welt spricht man da von User-Defined Data Types (UDT). Die Beispiele aus der MSDN sind dabei ganz hilfreich. Für die Verwendung von SafeArrayCreateEx braucht man dabei einen Verweis auf eine IRecordInfo-Schnittstelle. Diese bekommt man mit GetRecordInfoFromGuids(). Und jetzt zum Witz: Das funktioniert NICHT wenn der UDT ein Member vom Typ GUID besitzt. Dann liefert GetRecordInfoFromGuids() immer ein E_INVALIDARG. Das ist eine Macke von MS Visual Studio die schon seit 2008 bekannt ist. Das Problem ist das GUID selbst ein struct ist.

Einfache Lösung: Statt GUID einen BSTR verwenden. Die Konvertierung ist mit

GUID guid;
BSTR bstr;
bstr = CComBSTR(guid).Detach();

und

wstring bGuid(bstr);
CLSIDFromString(bGuid.c_str(), &guid);

einfach möglich.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert