我正在尝试动态加载不在正常搜索路径上的 DLL (python3.dll)。我可以使用更改的搜索路径加载它,但是当我这样做时GetProcAddress
,它失败了(因为我正在加载的函数转发到另一个 DLL,python37.dll)。
我认为我需要做的是GetProcAddress
遵循与原始 DLL 加载相同的搜索逻辑,但我不知道如何在不改变系统的情况下做到这一点PATH
(正如我的代码一样,它还有各种其他潜在问题让用户运行自己的代码,这需要原始路径)。
有没有一个干净的解决方案?
这是我尝试过的代码:
HMODULE py_dll = LoadLibraryW(L"python3.dll");
if (!py_dll) {
py_dll = LoadLibraryExW(L"C:\\Work\\Projects\\pylaunch\\py3embed\\python3.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
}
if (!py_dll) {
printf("Cannot load Python DLL\n");
err();
return 1;
}
char buf[1000];
GetModuleFileName(py_dll, buf, 1000);
printf("DLL is %s\n", buf);
Py_Main_t Py_Main = (Py_Main_t)GetProcAddress(py_dll, "Py_Main");
if (!Py_Main) {
printf("Cannot load Py_Main\n");
err();
return 1;
}
添加SetDllDirectory()
似乎没有帮助,但我只是将它的调用转储到代码中,因为我不是 100% 清楚它是如何工作的,所以我可能做错了什么。
作为参考, Py_Main 符号的定义是
747 2EA Py_Main (forwarded to python37.Py_Main)