|
|
1
8
使用用与调用EXE不同的C++编译器编译的DLL时,需要考虑的最大问题是内存分配和对象生存期。 我假设你可以通过名称转换(和调用约定),如果你使用具有兼容转换的编译器(我认为VC6与VS2008广泛兼容),或者如果你使用extern“C”,这并不难。
当你使用以下方式分配东西时,你会遇到问题
您可以使用COM样式
或者,您可以确保使用
|
|
|
2
3
接口成员名称将 不 装饰——它们只是桌子上的补偿。您可以在头文件中定义一个接口(使用C结构,而不是COM“接口”),因此:
然后,您可以从DLL导出函数,而无需进行任何修改:
只要您使用的编译器能够生成兼容的vtable,这将很好地工作。自(至少,我认为)DOS的MSVC6.1以来,Microsoft C++已经生成了相同格式的vtable,其中vtable是指向函数的简单指针列表(在多重继承的情况下使用thunking)。GNU C++(如果我没记错的话)生成带有函数指针和相对偏移量的vtable。这些彼此不兼容。 |
|
|
3
3
嗯,我想 Chris Becke's suggestion 很好。我不会用 Roger's first solution ,它只是名义上使用了一个接口,正如他提到的,可能会遇到抽象类和虚拟方法的编译器处理不兼容的问题。Roger指出了有吸引力的COM一致性案例 his follow-on .
它返回HRESULT(您也需要了解这些),并在您为接收IFoo接口指针提供的位置返回*pv。(我只是略读一下,这里需要更仔细的细节。不要相信我的语法)你用于此的实际函数原型也在*.h文件中声明。
这可能是太多的信息,但我想指出的是,您面临的关于DLL异构实现的许多问题都在COM二进制接口的定义中得到了解决,即使您不需要所有这些,它提供有效解决方案的事实也是有价值的。根据我的经验,一旦你掌握了这个窍门,你就永远不会忘记它在C++和C++互操作情况下是多么强大。 我还没有概述您可能需要参考的示例资源以及您必须学习的内容,以便制作*.h文件并实际实现您想要共享的库的工厂函数包装器。如果你想深入挖掘,就大声喊。 |
|
4
1
您还需要考虑其他事情,例如各种库正在使用哪些运行时。如果没有共享对象,那很好,但乍一看似乎不太可能。
|
|
|
5
0
不好玩,伙计。你会遇到很多挫折,你可能应该给这个:
仔细看。祝你好运。 |
|
|
PHPLover · “支持PHP扩展或功能的端口”实际上是什么意思? 2 年前 |