考虑将C ++ API定义为一系列__options(declexport/import)
类。
此外,假设永远不允许调用者在这些类上调用普通的operator new(size_t)
。静态工厂方法可以执行新操作,也可以使用特定于类的operator new
。并根据需要在删除大小上标记(通常只是一个虚拟析构函数)。
现在,如果您使用VS2010中的工具编译和链接DLL和IMPLIB,是否可以将该implib和DLL交给VS2005的用户并期望它能够正常工作?
根本不涉及MFC。
我特别感谢任何关于该主题的任何相对正式的微软声明的提及。
答案 0 :(得分:2)
只要C ++ API上的名称相同(它们是),并且不使用STL类型的特定参数,例如basic_string
或std::map
,其实现可能在编译器的版本(他们有),然后它应该工作。
当然,您需要确保使用/MT
模式(静态链接运行时)编译DLL,或者使用提供的库和链接目标包含VS2010运行时的可再发行组件。
编辑:扩展“不要传递具有版本特定实现的类型”。通过查看MSVC100P.DLL
的导出输出,可以轻松找到部分列表。
cd %VS100COMNTOOLS%\..\VC\redist\x86\Microsoft.VC100.CRT
DUMPBIN /exports MSVCP100.DLL
下一个问题将是map
或set
之类的仅限标头的实现,这些实现在编译器版本之间已经发生了变化。
这就是为什么强烈建议只有标量类型跨越内存竞技场之间的边界。因此,简单的测试将通过并且可靠。
答案 1 :(得分:1)
你没有提到你是否已经使用MFC来创建DLL。如果你有,常规DLL应该可以工作,但我不认为扩展应该工作,因为后者链接到MFC dll。我包括链接供你参考。
http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c4017
http://www.experts-exchange.com/Programming/System/Windows__Programming/MFC/Q_20385543.html
http://msdn.microsoft.com/en-us/library/26h8x9sy%28v=VS.100%29.aspx
修改强> 如果它是一个普通的DLL,应该没有任何问题。也取决于链接类型。