【发布时间】:2017-06-02 03:47:34
【问题描述】:
为了避免 dll 预加载,我尝试使用 SetDllDirectory(""),正如 MSDN 中提到的那样从搜索路径中删除当前目录。
要添加到搜索路径的目录。如果这个参数是 空字符串 (""),调用从 默认 DLL 搜索顺序。如果此参数为 NULL,则函数 恢复默认搜索顺序。
令人惊讶的是它没有工作。如果 dll 存在,我可以看到 dll 仍然从当前目录加载。我也厌倦了将 dll 目录路径设置为系统 32 路径,但它仍然从当前目录中选择 dll。最后,我决定将所有模块加载到我的应用程序中并再次重新加载它们。我的代码是这样的,
if(wcsstr(szModName,L"TestLibrary.dll"))
{
FreeLibrary(hMods[i]);
LoadLibrary("SomeRelavantPath\TestLibrary.dll");
}
您发现我的代码有什么问题吗?
@编辑: 我的完整 POC 代码,
int main( void )
{
SetDllDirectory(L"");
LPWSTR s = new WCHAR[100];
GetDllDirectory(100,s);
HINSTANCE myDLL = LoadLibrary(L"TestLibrary.dll");
//myDLL returns non-null, there is file in current dir and not at any other location, it should have return null.
return 0;
}
【问题讨论】:
-
在
SetDllDirectory("")之后和LoadLibrary之前尝试GetDllDirectory。 -
@iehrlich 没用。有什么理由打电话给
GetDllDirectory应该有效吗? -
@PranitKothari,我怀疑@iehrlich 的意思是使用
GetDllDirectory确保搜索路径确实已更改为您想要的。变了吗? -
您是否链接了导致 TestLibrary.dll 被显式导入的 .lib 文件?
-
等等等等。比如,“C:\Work\MyApp\MyDll.dll”显式?