Загрузка символов из DLL, загруженной с нестандартным путем, который перенаправляет в другую DLL - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь динамически загрузить 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)

1 Ответ

0 голосов
/ 04 октября 2018

Похоже, что это проблема с Windows 7. Обсуждение здесь дает более подробную информацию.

По сути, GetProcAddress не соответствует изменениям в пути поиска, используяSetDllDirectory при загрузке дополнительных библиотек DLL для разрешения перенаправленных символов.Если библиотека DLL, содержащая символ пересылки, зависит от целевой библиотеки DLL, она работает , но python3.dll такой зависимости не имеет.

Из отчета в выпуске Pythonвыше, похоже, что это поведение было исправлено в Windows 10, поэтому вам нужно быть в Windows 7, чтобы увидеть проблему.

Решение, по-видимому, заключается в обновлении Windows, или избегайте использования GetProcAddress сперенаправленные функции (если только экспедитор не зависит от цели).

...