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

How can we unit test our c++ COM code without registering the dlls?

本文关键字:代码 COM c++ 单元测试 情况下 注册 dll      更新时间:2023-10-16

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

他们提供的示例工作良好(使用c++ com服务器和c++客户端),但是当我重新构建它们时,它们不工作。

我们使用的是Visual Studio 2013,所以在我看来,registration free . com的工作方式发生了很大的变化,这使得本教程与较新的编译器不兼容。

谁能告诉我使用最新版本的visual studio注册免费网站的资源?为了使我们自己的应用程序更加复杂,当我到达那里时,我们使用VS 2013,但目标是2010编译器,希望这不会造成太大的差异。

如果有更好的方法在com组件上运行c++单元测试而不需要注册,我也想听听这些

谢谢你的帮助。

对于OP来说可能太晚了,但是对于任何遇到这个问题的人来说,这里有Samuel Jack的一篇文章…这可能对未来的读者有帮助,也可能没有帮助……

见http://blog.functionalfun.net/2012/09/a-quick-guide-to-registration-free-com.html

你可以实现你自己的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);
}

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

当然,我假设这些是inproc COM服务器。