LoadLibrary failed на виртуалке
От: turbocode  
Дата: 29.08.17 11:55
Оценка:
Под виртуальной машиной VMWare — Windows10 отказывается грузится одна из моих DLL по 126 ошибке.
Путь к DLL правильный судя по логу.
Dependency Walker не видит пропущенных DLL на самом верхнем уровне (кроме вида API-MS-WIN-CORE-*.DLL в системных DLL типа KERNEL32.DLL но другие DLL c такой же картиной грузятся — так что это не должно влиять).
Что еще может быть?
Re: LoadLibrary failed на виртуалке
От: rumit7  
Дата: 29.08.17 12:05
Оценка:
Здравствуйте, turbocode, Вы писали:

T>Под виртуальной машиной VMWare — Windows10 отказывается грузится одна из моих DLL по 126 ошибке.

T>Путь к DLL правильный судя по логу.
T>Dependency Walker не видит пропущенных DLL на самом верхнем уровне (кроме вида API-MS-WIN-CORE-*.DLL в системных DLL типа KERNEL32.DLL но другие DLL c такой же картиной грузятся — так что это не должно влиять).
T>Что еще может быть?

может ProcMon-ом прогнать?
Re[2]: LoadLibrary failed на виртуалке
От: turbocode  
Дата: 29.08.17 12:50
Оценка:
R>может ProcMon-ом прогнать?

Точно, оказалось что она подчиненную DLL ищет рядом с .EXE, а не в той же папке где основная DLL находится.
Это можно как то регулировать? Хочу чтобы все DLL были в Bin, а не рядом с EXE?
То есть так:
Root
   Bin
      test.dll
      test2.dll
   test.exe

А сейчас оно требует так:
Root
   Bin
      test.dll      
   test.exe
   test2.dll
Re: LoadLibrary failed на виртуалке
От: IID Россия  
Дата: 29.08.17 12:50
Оценка:
Здравствуйте, turbocode, Вы писали:

T>Под виртуальной машиной VMWare — Windows10 отказывается грузится одна из моих DLL по 126 ошибке.

T>Что еще может быть?

Киворд "windbg loader snaps" в гугле.
kalsarikännit
Re[3]: LoadLibrary failed на виртуалке
От: IID Россия  
Дата: 29.08.17 12:52
Оценка: +1
Здравствуйте, turbocode, Вы писали:

T>Это можно как то регулировать?


MSDN "LoadLibrary" -> Remarks -> Dynamic-Link Library Search Order
kalsarikännit
Re[3]: LoadLibrary failed на виртуалке
От: rumit7  
Дата: 29.08.17 12:55
Оценка:
Здравствуйте, turbocode, Вы писали:

R>>может ProcMon-ом прогнать?


T>Точно, оказалось что она подчиненную DLL ищет рядом с .EXE, а не в той же папке где основная DLL находится.

T>Это можно как то регулировать? Хочу чтобы все DLL были в Bin, а не рядом с EXE?
T>То есть так:
T>
T>Root
T>   Bin
T>      test.dll
T>      test2.dll
T>   test.exe
T>

T>А сейчас оно требует так:
T>
T>Root
T>   Bin
T>      test.dll      
T>   test.exe
T>   test2.dll
T>


LoadLibrary function

The first directory searched is the directory containing the image file used to create the calling process (for more information, see the CreateProcess function). Doing this allows private dynamic-link library (DLL) files associated with a process to be found without adding the process's installed directory to the PATH environment variable. If a relative path is specified, the entire relative path is appended to every token in the DLL search path list. To load a module from a relative path without searching any other path, use GetFullPathName to get a nonrelative path and call LoadLibrary with the nonrelative path. For more information on the DLL search order, see Dynamic-Link Library Search Order.
The search path can be altered using the SetDllDirectory function. This solution is recommended instead of using SetCurrentDirectory or hard-coding the full path to the DLL.


UPD.

SetDllDirectory function

After calling SetDllDirectory, the standard DLL search path is:
The directory from which the application loaded.
The directory specified by the lpPathName parameter.
The system directory. Use the GetSystemDirectory function to get the path of this directory. The name of this directory is System32.
The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System.
The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
The directories that are listed in the PATH environment variable.


получается в Вашем случае самое то
Отредактировано 29.08.2017 12:58 rumit7 . Предыдущая версия .
Re[4]: LoadLibrary failed на виртуалке
От: turbocode  
Дата: 29.08.17 12:57
Оценка:
IID>MSDN "LoadLibrary" -> Remarks -> Dynamic-Link Library Search Order
SetDllDirectory нужно звать в .EXE или в главной .DLL?
Re[5]: LoadLibrary failed на виртуалке
От: rumit7  
Дата: 29.08.17 13:02
Оценка:
Здравствуйте, turbocode, Вы писали:

IID>>MSDN "LoadLibrary" -> Remarks -> Dynamic-Link Library Search Order

T>SetDllDirectory нужно звать в .EXE или в главной .DLL?

насколько я понимаю, в Вашем случае достаточно вызвать в любом месте ДО вызова LoadLibrary для подчиненной dll:

The SetDllDirectory function affects all subsequent calls to the LoadLibrary and LoadLibraryEx functions. It also effectively disables safe DLL search mode while the specified directory is in the search path.

Re: LoadLibrary failed на виртуалке
От: ononim  
Дата: 29.08.17 13:17
Оценка:
T>Что еще может быть?
Например, проблемы с манифестом. Надо посмотреть в системные логи, не уверен насчет нынешних виндов, но семерка раньше писала в логи такие проблемы.
Как много веселых ребят, и все делают велосипед...
Re[6]: LoadLibrary failed на виртуалке
От: turbocode  
Дата: 29.08.17 13:39
Оценка:
R>

R>The SetDllDirectory function affects all subsequent calls to the LoadLibrary and LoadLibraryEx functions. It also effectively disables safe DLL search mode while the specified directory is in the search path.


Функция SetDllDirectory определена в Windows 8.1 SDK, а сборщик у меня под Windows7 и она не видит определения такой функции, ессно.
А нужно чтобы работало от Windows7 до Windows 10.
Как такое обойти?
Re[7]: LoadLibrary failed на виртуалке
От: rumit7  
Дата: 29.08.17 13:42
Оценка:
Здравствуйте, turbocode, Вы писали:

R>>

R>>The SetDllDirectory function affects all subsequent calls to the LoadLibrary and LoadLibraryEx functions. It also effectively disables safe DLL search mode while the specified directory is in the search path.


T>Функция SetDllDirectory определена в Windows 8.1 SDK, а сборщик у меня под Windows7 и она не видит определения такой функции, ессно.

T>А нужно чтобы работало от Windows7 до Windows 10.
T>Как такое обойти?

Minimum supported client
Windows Vista, Windows XP with SP1 [desktop apps only]


Header
Winbase.h (include Windows.h)


все должно работать от XP до 10
не забывайте про SetDllDirectoryW/A

UPD.

SetDllDirectory function

UPD2.
даже если включить режим "не верю МСДН", то на моей 7-ке в kernel32.dll есть эксп функции SetDllDirectoryW и SetDllDirectoryA
что-то вы делаете не так
Отредактировано 29.08.2017 13:45 rumit7 . Предыдущая версия . Еще …
Отредактировано 29.08.2017 13:43 rumit7 . Предыдущая версия .
Re[7]: LoadLibrary failed на виртуалке
От: Jack128  
Дата: 29.08.17 13:45
Оценка:
Здравствуйте, turbocode, Вы писали:

R>>

R>>The SetDllDirectory function affects all subsequent calls to the LoadLibrary and LoadLibraryEx functions. It also effectively disables safe DLL search mode while the specified directory is in the search path.


T>Функция SetDllDirectory определена в Windows 8.1 SDK,

Хм, https://msdn.microsoft.com/en-us/library/windows/desktop/ms686203(v=vs.85).aspx

Minimum supported client
Windows Vista, Windows XP with SP1 [desktop apps only]
Minimum supported server
Windows Server 2003 [desktop apps only]

Re[8]: LoadLibrary failed на виртуалке
От: turbocode  
Дата: 29.08.17 13:47
Оценка:
R>SetDllDirectory function

Незнаю как такое может быть но секцию внутри _WIN32_WINNT на Windows7:
#if _WIN32_WINNT >= 0x0502

WINBASEAPI
BOOL
WINAPI
SetDllDirectoryA(
    _In_opt_ LPCSTR lpPathName
    );
WINBASEAPI
BOOL
WINAPI
SetDllDirectoryW(
    _In_opt_ LPCWSTR lpPathName
    );
#ifdef UNICODE
#define SetDllDirectory  SetDllDirectoryW
#else
#define SetDllDirectory  SetDllDirectoryA
#endif // !UNICODE


показывает серым цветом.
Re[9]: LoadLibrary failed на виртуалке
От: rumit7  
Дата: 29.08.17 13:55
Оценка:
Здравствуйте, turbocode, Вы писали:

R>>SetDllDirectory function


T>Незнаю как такое может быть но секцию внутри _WIN32_WINNT на Windows7:

T>
T>#if _WIN32_WINNT >= 0x0502

T>WINBASEAPI
T>BOOL
T>WINAPI
T>SetDllDirectoryA(
T>    _In_opt_ LPCSTR lpPathName
T>    );
T>WINBASEAPI
T>BOOL
T>WINAPI
T>SetDllDirectoryW(
T>    _In_opt_ LPCWSTR lpPathName
T>    );
T>#ifdef UNICODE
T>#define SetDllDirectory  SetDllDirectoryW
T>#else
T>#define SetDllDirectory  SetDllDirectoryA
T>#endif // !UNICODE

T>


T>показывает серым цветом.


версия VS? на крайняк можно в наглую через GetProcAddress (или с помощью такой обертки
Автор: rumit7
Дата: 10.04.17
) подрубить нужную SetDllDirectory из kernel32.dll

UPD. может Вы его сами вручную где-то определили _WIN32_WINNT как 0x0501 для boost::asio например?
Отредактировано 29.08.2017 14:03 rumit7 . Предыдущая версия . Еще …
Отредактировано 29.08.2017 14:01 rumit7 . Предыдущая версия .
Re[10]: LoadLibrary failed на виртуалке
От: turbocode  
Дата: 29.08.17 14:03
Оценка:
R>версия VS?
2015
R>на крайняк можно в наглую через GetProcAddress подрубить нужную SetDllDirectory из kernel32.dll
не хотелось бы.
R>UPD. может Вы его сами вручную где-то определили _WIN32_WINNT как 0x0501 для boost::asio например?
Ничего не менял, boost-а нету.
Re[11]: LoadLibrary failed на виртуалке
От: rumit7  
Дата: 29.08.17 14:09
Оценка:
Здравствуйте, turbocode, Вы писали:

R>>версия VS?

T>2015
может Platform Toolset выбрали для XP?

R>>на крайняк можно в наглую через GetProcAddress подрубить нужную SetDllDirectory из kernel32.dll

T>не хотелось бы.

а мне часто только так и приходится делать т.к. частенько завишу только от ntdll
Re[11]: LoadLibrary failed на виртуалке
От: zou  
Дата: 29.08.17 14:17
Оценка:
Здравствуйте, turbocode, Вы писали:

R>>UPD. может Вы его сами вручную где-то определили _WIN32_WINNT как 0x0501 для boost::asio например?

T>Ничего не менял, boost-а нету.

Вставьте #pragma message и посмотрите чему равен _WIN32_WINNT.
https://stackoverflow.com/questions/1562074/how-do-i-show-the-value-of-a-define-at-compile-time

Кроме того, возможно, поможет флаг LOAD_WITH_ALTERED_SEARCH_PATH:

Note that the standard search strategy and the alternate search strategy specified by LoadLibraryEx with LOAD_WITH_ALTERED_SEARCH_PATH differ in just one way: The standard search begins in the calling application's directory, and the alternate search begins in the directory of the executable module that LoadLibraryEx is loading.

Re[12]: LoadLibrary failed на виртуалке
От: turbocode  
Дата: 29.08.17 15:50
Оценка:
T>>2015
R>может Platform Toolset выбрали для XP?
Нет, Visual Studio 2015 (v140)
Re[13]: LoadLibrary failed на виртуалке
От: rumit7  
Дата: 29.08.17 15:53
Оценка:
Здравствуйте, turbocode, Вы писали:

T>>>2015

R>>может Platform Toolset выбрали для XP?
T>Нет, Visual Studio 2015 (v140)

ну не знаю, если только минимальный проект скинете сюда, можно повтыкать.. а то гадание на кофейной гуще какое-то
Отредактировано 29.08.2017 15:54 rumit7 . Предыдущая версия .
Re[12]: LoadLibrary failed на виртуалке
От: turbocode  
Дата: 29.08.17 16:02
Оценка:
zou>Вставьте #pragma message и посмотрите чему равен _WIN32_WINNT.
zou>https://stackoverflow.com/questions/1562074/how-do-i-show-the-value-of-a-define-at-compile-time

#define _WIN32_WINNT 0x0501

Кажется нашел проблему в stdafx.h:
#ifndef _WIN32_WINNT        // Allow use of features specific to Windows XP or later.                   
   #define _WIN32_WINNT 0x0501    // Change this to the appropriate value to target other versions of Windows.
#endif


Поменял на 0x0502 и все скомпилилось.
Видимо сам проект еще был создан во времена WindowsXP.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.