tlbimp.exe преобразует HWND в _RemotableHandle - PullRequest
1 голос
/ 02 ноября 2010

Наш интерфейс COM-компонента имеет следующий метод:

HRESULT CreatePluginWindow([in] HWND hParent, [in] RECT* prcView);

Мы собираемся использовать его в приложении .NET, но взаимодействие для этого интерфейса выглядит следующим образом:

void CreatePluginWindow(ref interop.alfrontx._RemotableHandle hParent, ref interop.alfrontx.tagRECT prcView)

Согласно моим исследованиям, нет способа использовать этот метод без небезопасного кода.Я бы не хотел менять интерфейс COM, чтобы использовать другой тип, кроме HWND, для hParent, потому что он используется во многих компонентах C ++.Я бы не хотел вносить изменения во взаимодействие, поскольку они автоматически компилируются при каждой сборке.

Есть ли другой способ решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Я думаю, что вы можете преобразовать IntPtr в _RemotableHandle, используя следующий код:

    interop.alfrontx._RemotableHandle HWNDtoRemotableHandle(IntPtr handle)
    {
        return (interop.alfrontx._RemotableHandle)Marshal.PtrToStructure(handle, typeof(interop.alfrontx._RemotableHandle));
    }

Таким образом, вы можете легко использовать вышеуказанную функцию для получения _RemotableHandle из IntPtr, и нет необходимости изменять тип внутри сборки .NET.

1 голос
/ 02 ноября 2010

Это не Tlbimp, который делает это, это было введено midl.exe при сборке неуправляемого COM-сервера. Дескриптор окна является препятствием взаимодействия, потому что это 32-битное значение в 32-битной программе и 64-битное значение в 64-битной программе. Как и все ручки.

Взгляните на файл wtypes.idl в каталоге включения Windows SDK, там вы найдете объявленный _RemotableHandle. Чуть дальше вы увидите #define, который отображает HWND в RemotableHandle:

#ifndef _MIDL_DECLARE_WIREM_HANDLE
DECLARE_WIREM_HANDLE( HWND );
// etc..
#endif

Насколько я могу судить, когда вы передадите / D _MIDL_DECLARE_WIREM_HANDLE в midl.exe, вы получите библиотеку типов без оболочки RemoteHandle. Правда, я не очень понимаю, как это должно работать.

...