在我的新项目中,我遇到了关于加载dll的问题。 我的文件结构如下:
我的代码是
HMODULE h = LoadLibrary("D:\\dll_directory\\calculate.dll");
if(!h)
return GetLastError();
pfnInit = (PInit)GetProcAddress(h, "initialize");
if(!pfnInit())
{
// Fail
}
在我的calculate.dll代码中,我需要获取工作目录,所以我使用
int initialize() {
...
GetModuleFileName(...,myPath,...);
currentPath = ...; // get directory from path
filePath = currentPath + ...
if(!DoesExist(filePath))
return 0;
...
}
问题出在那里。因为我在其他目录中的“D:\ dll_directory \”中加载了DLL,所以currentPath值是错误的。
在调试中,currentPath是“D:\ myproject \ debug ...”,在执行时,它是“D:\ running_place \”。
仅当myproject.exe与calculate.dll放在同一个地方时,才能正确显示,currentPath =“D:\ dll_directory \”。
但是由于许多文件和许多地方,我不想手动放置DLL。 另外,我无法更改dll中的代码,它是稳定的。
有没有办法让它发挥作用?
提前致谢。
已更新:我将问题修改为更清晰。关于这个问题。这是我第一次使用stackoverflow。
在DLL的函数Init中,它需要运行与它放在同一位置的其他文件。 currentPath的预期是DLL的目录。
dir1中的EXE在dir2中加载DLL,EXE调用DLL的函数Init - > currentPath = dir1(错误)。
尝试使用GetCurrentDirectory更改DLL代码 - > currentPath = DIR1;还是错的。
将EXE和DLL放在dir2中,EXE调用函数Init的DLL - > currentPath = dir2(预期)。
答案 0 :(得分:0)
你确实使用了错误的函数来获取当前目录。 GetCurrentDirectory
返回当前目录(即要求.\thisFile.txt
的位置)。
GetModuleFileName
返回模块来自的名称。这通常不是当前的工作目录。那个工作目录几乎可以是任何东西。您在调试和发布之间看到的变化只是可能变化的一小部分样本。期待什么。
除了问题中提到的3之外,您还在寻找另一个文件。目前还不清楚其他文件的位置,因此这个答案可能不完整。是否有理由期待当前工作目录中的其他文件?
答案 1 :(得分:0)
GetModuleFileName
的第一个参数(你遗漏了)决定了要获得的路径。根据观察到的行为,我们现在可以推断您传递了NULL
或0
,这意味着您获得了EXE模块的文件名。
您应该已经从第一个代码段(DLL模块)传递了HMODULE h
。
(此值也可在DllMain
第一个参数中找到。将第一个参数保存到DLL中的全局变量,以便将其传递给GetModuleFileName
)
答案 2 :(得分:0)
我发现这些代码返回DLL当前路径。
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
WCHAR DllPath[MAX_PATH] = {0};
GetModuleFileName((HINSTANCE)&__ImageBase, DllPath, _countof(DllPath));
实际上,我不知道_ImageBase是什么及其缺点/专业人士,我还在调查。
如果可以,也许我在DLL代码中使用它。