从其他目录加载DLL函数

时间:2015-03-24 15:05:03

标签: c++ dll

在我的新项目中,我遇到了关于加载dll的问题。 我的文件结构如下:

  1. d:\ dll_directory \ calculate.dll
  2. d:\ myproject的\ myproject.vcxproj
  3. d:\ running_place \ myproject.exe
  4. 我的代码是

    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(预期)。

3 个答案:

答案 0 :(得分:0)

你确实使用了错误的函数来获取当前目录。 GetCurrentDirectory返回当前目录(即要求.\thisFile.txt的位置)。

GetModuleFileName返回模块来自的名称。这通常不是当前的工作目录。那个工作目录几乎可以是任何东西。您在调试和发布之间看到的变化只是可能变化的一小部分样本。期待什么。

除了问题中提到的3之外,您还在寻找另一个文件。目前还不清楚其他文件的位置,因此这个答案可能不完整。是否有理由期待当前工作目录中的其他文件?

答案 1 :(得分:0)

GetModuleFileName的第一个参数(你遗漏了)决定了要获得的路径。根据观察到的行为,我们现在可以推断您传递了NULL0,这意味着您获得了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代码中使用它。