我的应用程序使用LoadLibrary
,GetProcAddress
和FreeLibrary
实现各种插件架构。由于我的所有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等价物?
答案 0 :(得分:2)
这里的问题是,带有NULL
第一个参数的GetModuleFileName
为您提供了当前运行代码的可执行文件的路径,而您希望具体正在运行代码的模块。因此,当您在NUnit下运行代码时,最终会得到测试工具可执行文件,而不是您期望的。
您真正想要的是获取当前正在执行的模块的句柄,然后将其传递给GetModuleFileName
。 This StackOverflow post详细介绍了获取当前执行模块句柄的多种方法。
将当前模块句柄与您当前拥有的代码组合在一起,这应该都可以在NUnit下运行。