Visual studio 调用由VC++;Visual Studio 2015的6.0版本

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>至少存在两个版本:版本/厂商之

我必须处理一个古老的软件模块,它只支持从VC++6.0调用其API

如果我添加一个间接层,也就是说,将模块包装在用VC++6.0编写的动态库中,并将API传输到底层模块。dll将从Visual Studio 2015中提供的VC++工具链中调用

我的问题是:

  • 这原则上可行吗
  • 是否存在任何可能需要注意的陷阱
  • 可以用更好的方法吗
    更新:我想通过不同的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
    等,但如果可能的话,我会避免这样做。