Формат маршалинга COM-взаимодействия
Если COM-интерфейс имеет определение в C++:
interface Ixxx { .... HRESULT fn([in]LPWSTR pszName, [in]REFIID riid, [out]void** ppv);
Я объявляю это в моем COMImport как
[ComImport, Guid(...)] Interface Ixxx { .... void fn( [In, MarshalAs(UnmanagedType.LPWStr)] string pszName, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [Out, MarshalAs(UnmanagedType.Interface, IidParameterIndex = 1)] out IInterface ppv);
Затем, когда я пытаюсь вызвать функцию...
IInterface obj; Ixxx x = // object implementing the Ixxx interface; string name="name"; try { x.fn(name, typeof(IInterface).GUID, out obj); } catch { // Handle the COM exception
..- Я получаю нарушение защищенной памяти. Я уверен, что что-то не так с тем, как я объявляю параметр void**, хотя все это, кажется, работает нормально при вызове функции API с такой же сигнатурой.
Есть какие-нибудь идеи о том, как должна быть объявлена сортировка?
Что я уже пробовал:
установка ppv в качестве IntPtr
прохождение riid по ref
опуская параметр IidParameterIndex
и, конечно же, google.
Bernhard Hiller
Чего вы здесь добиваетесь? Создание экземпляра COM-класса из C#?
Midi_Mick
На самом деле я пытаюсь работать с системой свойств Windows. Я создаю экземпляр объекта, предоставляющего интерфейс IPropertySystem, с вызовом PSGetPropertySystem - это прекрасно работает. Затем, когда я пытаюсь использовать этот интерфейс для вызова, скажем, IPropertySystem.GetPropertyDescriptionByName - эта ошибка возникает. Я объявил интерфейсы с атрибутом COMImport.