8

我们正在尝试将单元测试添加到遗留的 c++ COM 应用程序中。我们还需要我们的构建机器能够运行单元测试,以确保每个构建都没有引入错误。但是,我们不希望构建机器必须注册 com dll,以便一台构建机器可以并行构建多个版本。我们假设我们可以更改为使用带有清单文件的免注册 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++ 单元测试而不注册,我也想听听这些。

谢谢你的帮助。

4

2 回答 2

3

对于 OP 来说可能为时已晚,但对于遇到这个问题的其他人来说,这里有 Samuel Jack 的一篇文章......这可能会或可能不会帮助未来的读者......

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

于 2017-11-04T01:00:04.870 回答
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);
}

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

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

于 2014-09-25T16:45:10.123 回答