Вызов COM видимый управляемый компонент от управляемого кода до обертки COM

У меня есть сторонний компонент, позволяет, говорят, что FIPreviewHandler для обработки предварительного просмотра, который реализует IPreviewHandler. FIPreviewHandler реализован как Управляемый Компонент и использует интерфейс IPreviewHandler и связанные интерфейсы через средства interop. FIPreviewHandler регистрируется с помощью regasm.exe в качестве COM.

У меня есть клиентское приложение, которым также Управляют. Я хочу создать экземпляр FIPreviewHandler как COM-компонент в моем приложении.

У меня есть interop блок, который определяет IPreviewHandler и связанные интерфейсы.

Когда я создаю экземпляр FIPreviewHandler, с помощью Активатора. CreateInstance (), на типе, возвращенном GetTypeByCLSID (), который использует корректный CLSID для FIPreviewHandler, он возвращает меня управляемый экземпляр, поскольку он имеет фактический блок в наличии и пропускает COM. Когда я пробую к QI/cast этот экземпляр как любой из интерфейсов, IPreviewHandler, например, он возвращает пустой указатель, потому что, он загружается как управляемый объект, и хотя интерфейс IPreviewHandler, реализованный FIPreviewHandler, является тем же интерфейсом, как я имею в своем interop, но в пространстве имен/блоке различия, следовательно пустой указатель. Если это должно было возвратить меня экземпляр/RCW COM (Система. __ ComObject), это не приняло бы пространство имен во внимание, и бросит прекрасный, и возвратит допустимый экземпляр.

FIPreviewHandler является компонентом на 32 бита, и на машине Win7 на 64 бита, если я компилирую свое клиентское приложение как "Какой-либо ЦП", Активатор. CreateInstance () возвращает экземпляр/RCW COM (Система. __ ComObject), как он cudnt находят реализацию на 64 бита FIPreviewHandler, следовательно возвращает прокси. В этом сценарии хорошо работает мое приложение. Но когда я компилирую его для x86, это получает реализацию на 32 бита, и возвращает управляемый экземпляр фактического управляемого класса и не экземпляр COM, следовательно перестало работать.

Я не могу использовать интерфейсы, определенные в блоке FIPreviewHandler, как я должен записать универсальному клиенту для IPreviewHandler, и мое приложение будет работать с любой реализацией компонента IPreviewHandler, который работал бы отлично для основанного на C++ клиентского доступа FIPreviewHandler как COM-объект, но перестал работать для Управляемых клиентов.

Я надеюсь, что имею смысл, и я был бы действительно благодарен за любую справку.

16
задан shaibee 25 June 2010 в 16:09
поделиться