如何在不注册dll的情况下对我们的c ++ COM代码进行单元测试?

Joh*_*n C 7 c++ unit-testing side-by-side visual-studio-2010 registration-free-com

我们正在尝试将单元测试添加到遗留的c ++ COM应用程序中.我们还需要我们的构建机器能够破坏他的单元测试,以确保每个构建都没有引入错误.但是,我们不希望构建机器必须注册com dlls,以便一台构建机器可以并行构建多个版本.我们假设我们可以改为使用注册免费com与清单文件,但我很难让它工作.不是在我们的代码库上,而是在Microsoft提供的基本示例上.
我一直在使用这个页面http://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic8 ,当我尝试使用未注册的dll运行使用清单文件时,它根本不起作用,我得到"类未注册错误"

他们提供的样本工作正常(使用c ++ com服务器和c ++客户端),但是当我重建它们时它们不起作用.

我们正在使用Visual Studio 2013,所以它看起来像注册免费com的工作方式发生了很大的变化,这使得本教程与新的编译器不兼容.

任何人都可以向我指出使用最新版本的visual studio免费注册com的资源吗?当我到达那里时,为了进一步使我们自己的应用程序中的内容复杂化,我们正在使用VS 2013,但是针对2010编译器,希望这不会产生很大的差异.

此外,如果有更好的方法在com组件上运行c ++单元测试而不注册清单文件,我也希望听到这些.

谢谢你的帮助.

Rog*_*mos 2

您可以实现自己的 CoCreateInstance 版本,该版本采用额外的 DLL 路径参数。代码将是这样的(为简洁起见,省略了错误处理和其他细节):

HRESULT CoCreateInstanceForTest(dllPath, rclsid, riid, ppv)
{
    HINSTANCE hinst = LoadLibrary(dllPath); // TODO: Maybe it is already loaded
    dllGetClassObject = GetProcAddress(hinst, "DllGetClassObject");
    return dllGetClassObject(rclsid, riid, ppv);
}
Run Code Online (Sandbox Code Playgroud)

除了错误处理之外,您还需要跟踪已加载的 DLL。使用列表或数组,其中每个元素都有一个元组来跟踪这一点。在某些时候,您可能想要卸载全部或部分它们。

当然,我假设这些是进程内 COM 服务器。