我正在使用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中。
答案 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';
}