
Orphey
14.02.2017
17:11:03
смотри, если ты получаешь от GetModuleHandleA - INVALID_HANDLE_VALUE
то дальше нет смысла

Stanislav
14.02.2017
17:11:36
еще раз, оно работает, вопрос то как раз почему оно работает и почему ошибка

Orphey
14.02.2017
17:12:02
я полагаю у тебя не порядок с логами, если всё работает

Google

Orphey
14.02.2017
17:12:13
попробуй отловить через GetLastError()
в нужном месте

Stanislav
14.02.2017
17:12:22
void WindowsError(const char* lpszFunction)
{
// Retrieve the system error message for the last-error code
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
if (dw == ERROR_SUCCESS)
return;
FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR)&lpMsgBuf,
0, NULL);
// Display the error message and exit the process
std::string message;
Utils::Convert::charToOem((LPSTR)lpMsgBuf, message);
error(fmt::format("{} failed with error {}: {}", lpszFunction, dw, message));
LocalFree(lpMsgBuf);
}

Orphey
14.02.2017
17:13:42
ага
сек

James Moriarty
14.02.2017
17:14:41

Orphey
14.02.2017
17:15:12
я полагаю ты получаешь после вызова первой апи INVALID_HANDLE_VALUE
который передаешь во вторую функу

Stanislav
14.02.2017
17:15:45
а момент

Orphey
14.02.2017
17:16:10
значит ты ошибся в имени либы, либо её нет в PATH или текущей директории

Google

Stanislav
14.02.2017
17:16:29
это длл, this_lib = GetModuleHandleA("my_dll.dll"); получает свой путь тут

Orphey
14.02.2017
17:17:02
тут длл получает не путь а некий хэндл, число отвечающее за объект ядра
типа дескриптора

Stanislav
14.02.2017
17:17:15
которая на основе этого получает путь где она лежит и грузит из подпапок нужные длл
и это работает
но в логах ошибка

Berkus
14.02.2017
17:17:38
какая ошибка то

Orphey
14.02.2017
17:17:39
не так, в этот момент, после вызова
она подгружается в память
а ты получаешь некий идентификатор её, как объекта ядра

Stanislav
14.02.2017
17:18:08
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));
вот кусок кода

Orphey
14.02.2017
17:18:44
значит она не подгрузилась в память, если после первой апи INVALID_HANDLE_VALUE

Stanislav
14.02.2017
17:18:59
на последней строчке я получаю что хочу

Orphey
14.02.2017
17:19:03
проверь this_lib == INVALID_HANDLE_VALUE

Berkus
14.02.2017
17:19:27
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.

Orphey
14.02.2017
17:19:37
т.е. функа из либы срабатывает, а в лог идёт ошибка?

Stanislav
14.02.2017
17:19:42

Orphey
14.02.2017
17:20:27
твой логер работает в отдельном потоке?

Google

Stanislav
14.02.2017
17:20:40
причем тут это?
для других функций системных он 0 показывает

Orphey
14.02.2017
17:21:13
GetLastError() выдает ошибку последней вызванной апи

Berkus
14.02.2017
17:22:29
GetModuleFileNameA(this_lib, this_lib_name, MAX_PATH);
а почему ты не проверяешь возвращаемое значение у этой функции

Orphey
14.02.2017
17:22:55
он говорит это что-то сломает

Berkus
14.02.2017
17:23:57
а в примере МСДН проверяют это раз https://msdn.microsoft.com/en-us/library/windows/desktop/ms683500(v=vs.85).aspx а в доке на функцию написано что она возвращает 0 в случае ошибки это два

Orphey
14.02.2017
17:24:28
два мы говорили о функе которая возвращает хэндл
GetModuleHandleA

Berkus
14.02.2017
17:24:41
проверяете то вы не ее
логгер вызывается после GetModuleFileNameA

Orphey
14.02.2017
17:25:09
да, но эта ошибка идёт через GetLastError()

Berkus
14.02.2017
17:25:19
на которую GetModuleFileNameA тоже влияет

Orphey
14.02.2017
17:25:28
разумеется

Berkus
14.02.2017
17:26:00
ну и причем тут GetModuleHandleA если вы пытаетесь ошибку от GetModuleFileNameA проверить, не проверяя на самом деле ее return value

Orphey
14.02.2017
17:26:17
очевидно что INVALID_HANDLE_VALUE в этом случае может быть только тогда когда INVALID_HANDLE_VALUE == this_lib

Berkus
14.02.2017
17:26:48
который не может быть, т.к. GetModuleHandleA возвращает NULL а не INVALID_HANDLE_VALUE

Orphey
14.02.2017
17:26:49
потому как другие аргументы там вообще ни причём

Stanislav
14.02.2017
17:27:41
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));
еще раз, тут я получаю путь где лежит моя длл, в подпапке лежит другая длл, которую я гружу
и это отлично все работает

Orphey
14.02.2017
17:27:58
смотри, первая функа возвращает NULL, на вход второй подается неверный хэндл о чём и говорит GetLastError()

Google

Stanislav
14.02.2017
17:27:59
кроме момента с ошибкой

Berkus
14.02.2017
17:28:26

Orphey
14.02.2017
17:28:52
либо второй вариант, GetLastError() в другом потоке
т.е. ошибка может быть от другой апи

Berkus
14.02.2017
17:29:08
ну логгер вызывается вроде в том же потоке

Stanislav
14.02.2017
17:29:18
брр, щас вытащу все эти куски кода на гитхаб

Orphey
14.02.2017
17:30:02
я других вариантов не вижу честно говоря

Admin
ERROR: S client not available

Stanislav
14.02.2017
17:34:07
https://gist.github.com/crackedmind/4d7ff0eca65e13d17600fcef546bb0cf

Orphey
14.02.2017
17:34:13
стоп, а зачем ты в this_lib потом тыкаешь строку?
GetModuleFileNameA(this_lib, this_lib_name, MAX_PATH);
а нет

Stanislav
14.02.2017
17:35:28
вот тоже который день думаю

Berkus
14.02.2017
17:35:57
так, а в this_lib_name ты что-нибудь получаешь в результате?

Orphey
14.02.2017
17:35:58
путь дальше верно определяется?

Stanislav
14.02.2017
17:36:35
что на вин10 и на таргете в виде ХП ембед
вопрос то такой был, какого х это работает если ошибку хэндла показывает?

Orphey
14.02.2017
17:38:05
пробани без логера просто в stdout тыкнуть GetLastError() вместо вызова логера

Google

Stanislav
14.02.2017
17:38:21

Orphey
14.02.2017
17:38:24
самое вероятное, это происходит просто не тут
логер в потоке?

Stanislav
14.02.2017
17:38:32
открывает файл, пишет туда, и закрывает
на каждый вызов
плохо, но такая специфика

Orphey
14.02.2017
17:39:18
а есои файл не открывается?
по сути ты когда открываешь файл - тоже получаешь его хэндл

Stanislav
14.02.2017
17:40:06
файл логгера? это бывает только под вин10 из за новых прав
мне похер
а вот заказчки волнуется

Orphey
14.02.2017
17:41:01
но он верный, а знач ошибка не тут
если бы он был неверен, ты бы не получил путь

Stanislav
14.02.2017
17:41:26

Orphey
14.02.2017
17:41:49
может файл открываться не с первого раза? скажем потому что уже открыт?
и в правах на открытие у тебя не указан SHARE_DENY_NONE
или нечто подобное

Stanislav
14.02.2017
17:42:22
вот у меня есть подозрения что винда не оч себя ведет если изнутри пытаться взять хэндл на себя же

Orphey
14.02.2017
17:42:45
файл может не открываться, если уже открыт другим логером

Stanislav
14.02.2017
17:43:08
при чем тут логгер? я хочу получить хэндл своей либы