1

我面临以下配置: IE 加载 c++ activeX(加载 c# COM ActiveX (EXECUTOR) 的加载器应用程序,它使用反射启动 c# UI 应用程序(主应用程序),它使用一些旧的 c++ COM dll。

我试图避免注册这些遗留的 c++ COM(我想使用清单)。但没有成功。

如果有一种方法可以使用指向这些 dll 的“文件”部分为 ActiveX 指定清单?

我尝试为 IE 创建清单但没有成功,将 Native.manifest 放在遗留目录所在的目录中,也没有成功。

似乎 XBAP 而不是 loader 和 executor 应该可以解决这个问题。但是,任何想法如何解决当前架构中的问题?

谢谢

4

2 回答 2

1

您不拥有 IE,因此您不应该为其创建清单。如果您要将 COM 注册数据放入清单中,您将不得不告诉系统查看该清单中的注册数据。由于您不控制主机应用程序,因此执行此操作的方法是使用Activation Context API,特别是指向正确清单的 CreateActCtx,然后是该线程上的 ActivateActCtx。然后,您可以根据需要 CoCreateInstance,并使用 DeactivateActCtx/ReleaseActCtx 跟随它。

XBAP 可能为您工作的原因是,由于它是一个单独的可执行文件,因此系统会自动激活清单并在进程启动时与您的 XBAP 进程相关联。当您在 IE 中托管时,您必须做更多的工作,因为您无法控制该过程。

于 2009-12-01T06:21:23.827 回答
0

如果您创建自己的进程并托管 Web 浏览器控件,则可以向您的应用程序提供一个包含 COM 信息的清单文件。正如您所建议的,它可以包含每个旧 COM 组件的条目(带有 progid 和 comClass 信息等)。然后,当您的托管浏览器控件中加载的 javascript 执行“new ActiveXObject()”调用时,无注册表的 COM(并排)加载程序被激活,它将解决使用清单文件所需的内容。

您可以在不到 15 分钟的时间内获得此解决方案,仅用于概念验证:只需创建一个嵌入了 webbrowser 控件的新 .net 应用程序,使用 javascript 编写测试 html 页面以创建您的旧组件并在您的 COM 中调用一个方法组件,最后使用旧组件的条目为您的 exe 创建 .manifest 文件。只需将 Web 浏览器控件属性设置为您的测试 html 文件。不要忘记取消注册您的 COM 组件并使用您的 .manifest 文件更新 exe。

文件清单条目的示例如下:

<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

于 2011-05-06T22:54:27.857 回答