其他dll作为依赖项的C ++ DLL(SDL2)

时间:2017-03-19 00:02:23

标签: c++ visual-c++ dll

我正在使用Visual Studio 2017进行C ++项目。

我将SDL2安装在自定义目录中(不在PATH中)。

我正在创建一个使用SDL2的DLL。

我在项目属性中添加了SDL2目录(VC++ Directories -> Library Directories,我也尝试使用Reference Directories)并正确编译。

然后在Core程序中,我用LoadLibraryA加载我的DLL并且它失败了(getLastError()告诉我错误126)。

我看了 Dependency Walker ,找不到 SDL2.DLL

我还看了 Process Monitor ,我看到它首先在当前目录中查找SDL2.dll,然后查找PATH环境变量中的所有目录。由于SDL2不在PATH目录中,因此加载失败,故事结束,我很伤心

当然我可以将SDL2安装目录添加到PATH变量中,但由于原因,我不想这样做。

我的配置中是否应该更改某些内容?

感谢。

SOLUTION:

我找到了解决方法。

我的核心程序加载lib.dll,需要SDL2.dll

相反,我可以创建另一个dll,例如libloader.dll。在这篇文章中,我使用SetDllDirectory来确定SDL2.dll的位置,然后使用LoadLibraryA加载lib.dll

由于我在lib.dll中有一个入口点,我只需将其包装在libloader.dll入口点。

这样,我永远不必将SDL2.dll的位置放在Core中。

2 个答案:

答案 0 :(得分:2)

您可以使用SetDllDirectory解决此问题;见:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686203(v=vs.85).aspx

(请注意,这有些非标准行为,如果您这样做,则需要注意安全隐患,但需要注意。)

答案 1 :(得分:1)

我使用SetDllDirectory做了类似的事情:

try{
    /////////////////set dependencies subfolder relative path:
    SetDllDirectory((LPCWSTR)L".\\FDD_DLL_Dependencies\\");
    /////////////////load FDD DLL:
    HINSTANCE hDLL_FDD_DLL=NULL;
    hDLL_FDD_DLL=LoadLibrary((LPCWSTR)L"FDD_DLL.dll");
    if(hDLL_FDD_DLL==NULL){
        throw "FDD DLL did not load";
    }
}
catch(char*char_Ptr_Exception){
    std::cerr<<"Error: "<<char_Ptr_Exception<<'\n';
}