Anonymous
ага
Anonymous
сек
Anonymous
я полагаю ты получаешь после вызова первой апи INVALID_HANDLE_VALUE
Stanislav
Anonymous
который передаешь во вторую функу
Stanislav
Stanislav
а момент
Anonymous
значит ты ошибся в имени либы, либо её нет в PATH или текущей директории
Stanislav
это длл, this_lib = GetModuleHandleA("my_dll.dll"); получает свой путь тут
Anonymous
тут длл получает не путь а некий хэндл, число отвечающее за объект ядра
Anonymous
типа дескриптора
Stanislav
которая на основе этого получает путь где она лежит и грузит из подпапок нужные длл
Stanislav
и это работает
Stanislav
но в логах ошибка
Berkus
какая ошибка то
Anonymous
не так, в этот момент, после вызова
Anonymous
она подгружается в память
Anonymous
а ты получаешь некий идентификатор её, как объекта ядра
Stanislav
Stanislav
Stanislav
this_lib = GetModuleHandleA("my_dll.dll");
memset(this_lib_name, 0, MAX_PATH * sizeof(char));
memset(this_lib_name_long, 0, MAX_PATH * sizeof(char));
GetModuleFileNameA(this_lib, this_lib_name, MAX_PATH);
Logger::instance().WindowsError("GetModuleFileName");
DWORD length = GetLongPathNameA(this_lib_name, this_lib_name_long, MAX_PATH);
PathRemoveFileSpecA(this_lib_name_long);
StringCchCopyA(my_dll, MAX_PATH, this_lib_name_long);
StringCchCatA(my_dll, MAX_PATH, "\\");
StringCchCatA(my_dll, MAX_PATH, filename);
Logger::instance().info(fmt::format("Module filename: {}", this_lib_name_long));
Logger::instance().info(fmt::format("my_dll filename: {}", my_dll));
вот кусок кода
Anonymous
значит она не подгрузилась в память, если после первой апи INVALID_HANDLE_VALUE
Stanislav
на последней строчке я получаю что хочу
Anonymous
проверь this_lib == INVALID_HANDLE_VALUE
Berkus
Return value
If the function succeeds, the return value is a handle to the specified module.
If the function fails, the return value is NULL.
Anonymous
т.е. функа из либы срабатывает, а в лог идёт ошибка?
Anonymous
твой логер работает в отдельном потоке?
Stanislav
причем тут это?
Stanislav
для других функций системных он 0 показывает
Anonymous
GetLastError() выдает ошибку последней вызванной апи
Berkus
GetModuleFileNameA(this_lib, this_lib_name, MAX_PATH);
а почему ты не проверяешь возвращаемое значение у этой функции
Anonymous
он говорит это что-то сломает
Berkus
а в примере МСДН проверяют это раз https://msdn.microsoft.com/en-us/library/windows/desktop/ms683500(v=vs.85).aspx а в доке на функцию написано что она возвращает 0 в случае ошибки это два
Anonymous
два мы говорили о функе которая возвращает хэндл
Anonymous
GetModuleHandleA
Berkus
проверяете то вы не ее
Berkus
логгер вызывается после GetModuleFileNameA
Anonymous
да, но эта ошибка идёт через GetLastError()
Berkus
на которую GetModuleFileNameA тоже влияет
Anonymous
разумеется
Berkus
ну и причем тут GetModuleHandleA если вы пытаетесь ошибку от GetModuleFileNameA проверить, не проверяя на самом деле ее return value
Anonymous
очевидно что INVALID_HANDLE_VALUE в этом случае может быть только тогда когда INVALID_HANDLE_VALUE == this_lib
Berkus
который не может быть, т.к. GetModuleHandleA возвращает NULL а не INVALID_HANDLE_VALUE
Anonymous
потому как другие аргументы там вообще ни причём
Stanislav
this_lib = GetModuleHandleA("my_dll.dll");
memset(this_lib_name, 0, MAX_PATH * sizeof(char));
memset(this_lib_name_long, 0, MAX_PATH * sizeof(char));
GetModuleFileNameA(this_lib, this_lib_name, MAX_PATH);
Logger::instance().WindowsError("GetModuleFileName");
DWORD length = GetLongPathNameA(this_lib_name, this_lib_name_long, MAX_PATH);
PathRemoveFileSpecA(this_lib_name_long);
StringCchCopyA(my_dll, MAX_PATH, this_lib_name_long);
StringCchCatA(my_dll, MAX_PATH, "\\");
StringCchCatA(my_dll, MAX_PATH, filename);
Logger::instance().info(fmt::format("Module filename: {}", this_lib_name_long));
Logger::instance().info(fmt::format("my_dll filename: {}", my_dll));
еще раз, тут я получаю путь где лежит моя длл, в подпапке лежит другая длл, которую я гружу
Stanislav
и это отлично все работает
Anonymous
смотри, первая функа возвращает NULL, на вход второй подается неверный хэндл о чём и говорит GetLastError()
Stanislav
кроме момента с ошибкой
Berkus
Berkus
Anonymous
либо второй вариант, GetLastError() в другом потоке
Anonymous
т.е. ошибка может быть от другой апи
Berkus
ну логгер вызывается вроде в том же потоке
Stanislav
брр, щас вытащу все эти куски кода на гитхаб
Anonymous
я других вариантов не вижу честно говоря
Stanislav
https://gist.github.com/crackedmind/4d7ff0eca65e13d17600fcef546bb0cf
Anonymous
стоп, а зачем ты в this_lib потом тыкаешь строку?
Anonymous
GetModuleFileNameA(this_lib, this_lib_name, MAX_PATH);
Anonymous
а нет
Stanislav
вот тоже который день думаю
Berkus
так, а в this_lib_name ты что-нибудь получаешь в результате?
Anonymous
путь дальше верно определяется?
Stanislav
Stanislav
что на вин10 и на таргете в виде ХП ембед
Stanislav
вопрос то такой был, какого х это работает если ошибку хэндла показывает?
Anonymous
пробани без логера просто в stdout тыкнуть GetLastError() вместо вызова логера
Stanislav
Anonymous
самое вероятное, это происходит просто не тут
Anonymous
логер в потоке?
Stanislav
открывает файл, пишет туда, и закрывает
Stanislav
на каждый вызов
Stanislav
плохо, но такая специфика
Anonymous
а есои файл не открывается?
Anonymous
по сути ты когда открываешь файл - тоже получаешь его хэндл
Stanislav
файл логгера? это бывает только под вин10 из за новых прав
Stanislav
мне похер
Stanislav
а вот заказчки волнуется