在使用不同visual studio编译器版本编译的进程中加载​​COM

时间:2015-02-24 07:23:33

标签: c++ visual-studio-2010 com runtime

我们有一个使用Visual Studio 2008版本编译的可执行文件。由于第三方依赖,我们必须在visual studio 2008中编译此可执行文件。

我们还有另一个在visual studio 2010中编译的组件。现在我们需要从使用2008编译器版本编译的可执行文件访问的该组件(在2010编译器版本中编译)中获取一个COM组件dll。 / p>

我的问题是,它会正常工作吗?在可执行文件(即2008运行时库)和COM组件使用的运行时(使用2010运行时)中是否存在冲突。

我们实际上尝试在可执行文件中加载此COM dll,实际上工作正常。但我担心在以后因多次运行时可能会崩溃/失败。

请告诉我如何处理多个运行时。在单个可执行文件中加载不同的运行时是否安全。由于可用的运行时间不同,在执行的后期会不会有任何冲突?

无论如何,我们正在寻求解决这个问题的解决方案,使COM组件成为一个OUT proc服务器,无论如何都可以。但这需要做很多工作。

请告诉我。

非常感谢

3 个答案:

答案 0 :(得分:1)

混合使用不同运行时库的COM对象应该没有问题,因为每个对象的内存分配和释放都将在DLL边界后面完成。

您需要注意所有方法都有适当的COM签名,即所有指针都应该是COM指针。

答案 1 :(得分:1)

COM专为二进制互操作而设计。通过设计,框架是实现不可知的。目的是COM服务器可以在一种语言/运行时实现,并由使用不同语言/运行时实现的COM客户端使用。

对于不同方使用的语言和运行时,绝对没有限制。

答案 2 :(得分:1)

在几种情况下已经回答了几次。

只要您不处理和/或传递模块之间的C运行时(CRT)数据结构,您就可以了。如果在依赖于不同CRT的模块之间执行以下任何操作,则会遇到问题,在这种特定情况下,您无法正确实现COM对象:

    一个模块中的
  • malloc内存和另一个模块中的reallocfree
  • fopen一个模块中的FILE*和另一个模块中的freadfwritefclose
  • setjmp在一个模块中,longjmp在另一个模块中

请注意,您可以执行以下操作:

  • 使用其他模块编辑的内存malloc,负责重新分配和释放原始模块
  • 使用与另一个模块编辑的文件fopen交互的一些界面,保留其在原始模块上的使用责任
  • 不要在不相关或丢失耦合的模块中使用setjmp / longjmp,定义回调,中止错误代码等等,但不要依赖于展开技术,即使提供通过操作系统

你可以在这里看到一个模式。只要您将这些资源委托给该模块,就可以使用其他模块中的资源。

使用COM,你不应该遇到这种麻烦,所有东西都应该通过它们实现的接口封装在对象中。虽然您可以将malloc ed内存作为顶级指针参数传递,但您只应该访问被调用者中的内存,而不是重新分配或释放它。对于内部指针,您必须使用CoTaskMemAlloc及其表兄弟,因为这是COM中的公共内存管理器。这适用于处理文件(例如将其封装在IStreamIPipeByteIEnumByte或类似内容中),并且不要在COM调用中展开