2009-09-27 5 views
1

Я столкнулся со следующей конфигурацией: IE загружает C++ activeX (приложение LOADER, которое загружает C# COM ActiveX (EXECUTOR), которое с помощью отражения начинает приложение C# UI (основное приложение), которое использует некоторое наследие C++ COM библиотеки DLL.Проблема манифеста с IE и ActiveX-приложением

Я пытаюсь избежать регистраций этого наследия C++ COM (я хочу использовать манифест). Но без успеха.

Если есть способ указать манифест для ActiveX с раздел «файл», который указывает на эти DLL?

I t ried для созданного манифеста для IE без успеха, поместив Native.manifest в каталог, в котором находится наследие, а также - нет успеха.

Кажется, что XBAP вместо загрузчика и исполнителя должен решить проблему. Но любые идеи, как решить проблему в текущей архитектуре?

благодарит

ответ

1

Вы не владеете IE, так что вы не должны создавать манифест для него. Если вы собираетесь поместить данные регистрации COM в манифест, вам нужно будет сказать системе, чтобы просмотреть этот манифест для регистрационных данных. Поскольку вы не контролируете приложение-хост, способ сделать это - использовать Activation Context APIs, в частности CreateActCtx, указывающий на правильный манифест, за которым следует ActivateActCtx в этом потоке. Вы можете затем CoCreateInstance, что хотите, и следуйте за ним с помощью DeactivateActCtx/ReleaseActCtx.

Причина, по которой XBAP может работать для вас, заключается в том, что, поскольку это отдельный исполняемый файл, манифест автоматически активируется системой и привязан к вашему процессу XBAP при запуске процесса. Когда вы размещаете внутри IE, вам нужно больше работать, так как вы не контролируете этот процесс.

0

Если вы создаете свой собственный процесс и размещаете элемент управления веб-браузера, вы можете предоставить файл манифеста вашему приложению, содержащее информацию COM. Как вы можете предположить, он может содержать записи для каждого старого COM-компонента (с информацией о progid и comClass и т. Д.). Затем, когда javascript, загруженный в ваш управляемый элемент управления браузером, выполняет «новый вызов ActiveXObject()», перезагружается загрузчик COM (Side-by-Side) без учета реестра, и он разрешит то, что ему нужно для использования файла манифеста.

Вы можете получить это решение менее чем за 15 минут только для доказательства концепции: просто создайте новое .net-приложение с встроенным элементом управления веб-браузером, напишите тестовую html-страницу с помощью javascript, чтобы создать свой устаревший компонент и вызвать метод в вашем компоненте COM и, наконец, создать файл .manifest для вашего exe с записью устаревшего компонента. Просто установите свойство управления веб-браузером в свой тестовый html-файл. Не забудьте отменить свой COM-компонент и обновить exe с помощью файла .manifest.

Пример манифест файла запись будет, как:

<file name="mycom.dll"> 
    <typelib tlbid="<YOUR TYPELIB ID>" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" /> 
    <comClass clsid="<YOUR COCLASS ID>" threadingModel="Apartment" tlbid="<YOUR TYPELIB ID>" progid="mycom.class.1" description="mycom.class" /> 
</file> 

Более подробной информации о манифестах файлов можно найти здесь:

http://msdn.microsoft.com/en-us/library/aa375632(v=VS.85).aspx