在测试工具下获取当前可执行目录失败

时间:2012-01-16 19:23:29

标签: c++ windows unit-testing dll directory

我的应用程序使用LoadLibraryGetProcAddressFreeLibrary实现各种插件架构。由于我的所有dll都与可执行文件位于同一目录中,因此当我查找dll时,我会使用此函数获取可执行文件的目录并在那里搜索:

string FileSystem::GetPathToProgramDirectory(){
    char progname[MAX_PATH];
    GetModuleFileNameA( NULL, progname, MAX_PATH );
    PathRemoveFileSpecA( progname );
    return string( progname );
}

这适用于生产,但是当我尝试使用NUnit在集成测试下运行时,可执行目录最终成为NUnit,因此加载失败。 请记住,这是非托管C ++;在托管C ++中,我使用Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location)解决了这个问题,这在两种情况下均有效,但是非托管案例让我感到难过。是否存在非托管的Winapi等价物?

1 个答案:

答案 0 :(得分:2)

这里的问题是,带有NULL第一个参数的GetModuleFileName为您提供了当前运行代码的可执行文件的路径,而您希望具体正在运行代码的模块。因此,当您在NUnit下运行代码时,最终会得到测试工具可执行文件,而不是您期望的。

您真正想要的是获取当前正在执行的模块的句柄,然后将其传递给GetModuleFileNameThis StackOverflow post详细介绍了获取当前执行模块句柄的多种方法。

将当前模块句柄与您当前拥有的代码组合在一起,这应该都可以在NUnit下运行。