我们有一个使用Visual Studio 2008版本编译的可执行文件。由于第三方依赖,我们必须在visual studio 2008中编译此可执行文件。
我们还有另一个在visual studio 2010中编译的组件。现在我们需要从使用2008编译器版本编译的可执行文件访问的该组件(在2010编译器版本中编译)中获取一个COM组件dll。 / p>
我的问题是,它会正常工作吗?在可执行文件(即2008运行时库)和COM组件使用的运行时(使用2010运行时)中是否存在冲突。
我们实际上尝试在可执行文件中加载此COM dll,实际上工作正常。但我担心在以后因多次运行时可能会崩溃/失败。
请告诉我如何处理多个运行时。在单个可执行文件中加载不同的运行时是否安全。由于可用的运行时间不同,在执行的后期会不会有任何冲突?
无论如何,我们正在寻求解决这个问题的解决方案,使COM组件成为一个OUT proc服务器,无论如何都可以。但这需要做很多工作。
请告诉我。
非常感谢
答案 0 :(得分:1)
混合使用不同运行时库的COM对象应该没有问题,因为每个对象的内存分配和释放都将在DLL边界后面完成。
您需要注意所有方法都有适当的COM签名,即所有指针都应该是COM指针。
答案 1 :(得分:1)
COM专为二进制互操作而设计。通过设计,框架是实现不可知的。目的是COM服务器可以在一种语言/运行时实现,并由使用不同语言/运行时实现的COM客户端使用。
对于不同方使用的语言和运行时,绝对没有限制。
答案 2 :(得分:1)
在几种情况下已经回答了几次。
只要您不处理和/或传递模块之间的C运行时(CRT)数据结构,您就可以了。如果在依赖于不同CRT的模块之间执行以下任何操作,则会遇到问题,在这种特定情况下,您无法正确实现COM对象:
malloc
内存和另一个模块中的realloc
或free
fopen
一个模块中的FILE*
和另一个模块中的fread
,fwrite
,fclose
等setjmp
在一个模块中,longjmp
在另一个模块中请注意,您可以执行以下操作:
malloc
,负责重新分配和释放原始模块fopen
交互的一些界面,保留其在原始模块上的使用责任setjmp
/ longjmp
,定义回调,中止错误代码等等,但不要依赖于展开技术,即使提供通过操作系统你可以在这里看到一个模式。只要您将这些资源委托给该模块,就可以使用其他模块中的资源。
使用COM,你不应该遇到这种麻烦,所有东西都应该通过它们实现的接口封装在对象中。虽然您可以将malloc
ed内存作为顶级指针参数传递,但您只应该访问被调用者中的内存,而不是重新分配或释放它。对于内部指针,您必须使用CoTaskMemAlloc
及其表兄弟,因为这是COM中的公共内存管理器。这适用于处理文件(例如将其封装在IStream
,IPipeByte
,IEnumByte
或类似内容中),并且不要在COM调用中展开