Visual studio 调用由VC++;Visual Studio 2015的6.0版本
我必须处理一个古老的软件模块,它只支持从VC++6.0调用其API 如果我添加一个间接层,也就是说,将模块包装在用VC++6.0编写的动态库中,并将API传输到底层模块。dll将从Visual Studio 2015中提供的VC++工具链中调用 我的问题是:Visual studio 调用由VC++;Visual Studio 2015的6.0版本,visual-studio,visual-c++,visual-c++-6,Visual Studio,Visual C++,Visual C++ 6,我必须处理一个古老的软件模块,它只支持从VC++6.0调用其API 如果我添加一个间接层,也就是说,将模块包装在用VC++6.0编写的动态库中,并将API传输到底层模块。dll将从Visual Studio 2015中提供的VC++工具链中调用 我的问题是: 这原则上可行吗 是否存在任何可能需要注意的陷阱 可以用更好的方法吗 更新:我想通过不同的windows版本以及相应的支持VS版本,C ABI是稳定的。如果dll是用纯C编写的,那么这样做可能不会太麻烦 > P>至少存在两个版本:版本/厂商之
更新:我想通过不同的windows版本以及相应的支持VS版本,C ABI是稳定的。如果dll是用纯C编写的,那么这样做可能不会太麻烦 > P>至少存在两个版本:版本/厂商之间的可移植性:C++对象/类布局和C/C++内存分配器。 为了避免第一个问题,您应该将可视API设计为一组C函数(与大多数Win32 API类似) 内存问题可以通过从
new
/malloc
切换到本机Windows功能之一来解决,如LocalAlloc
、HeapAlloc
或CoTaskMemAlloc
。假设您的旧.dll没有静态链接,理论上可以强制较新的代码使用msvcrt.dll中的malloc
,但这会使您的构建设置有点脆弱,并且与当前的最佳实践背道而驰
另一种选择是middleman.dll将所有内容都实现为COM对象:
EXTERN_C HRESULT WINAPI CreateMyObject(IMyObject**ppv) ...
是的,这是可行的。是的,您基本上需要一个C风格的接口,并避免跨模块边界传递资源所有权(例如,在DLL中分配内存以在客户端EXE中释放,除非您在两端使用操作系统提供的函数,如
GlobalAlloc
)。实现不必是纯C,只需是接口。您是否介意给出一个提示,说明如何强制od dll使用LocalAlloc、HeapAlloc、CoTaskNewAlloc等,而不是它的默认分配器?唯一重要的规则是,您的应用程序不能对从.dll获得的内存调用free
/delete
。如果.dll不是静态链接的,那么middleman.dll(如果使用vc6编译)可以代表您调用free
。理论上,您可以将.dll调用挂接到malloc
/free
并使用LocalAlloc
等,但如果可能的话,我会避免这样做。