Midi_Mick Ответов: 0

Формат маршалинга 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.

0 Ответов