@ProCxx

Страница 579 из 2477
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
попробуй отловить через GetLastError()
Logger::instance().WindowsError это и пишет

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

который передаешь во вторую функу

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
не так, в этот момент, после вызова

она подгружается в память

а ты получаешь некий идентификатор её, как объекта ядра

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
проверь this_lib == INVALID_HANDLE_VALUE
если я проверю оно все сломается, вопрос то был, почему ошибка и почему оно работает как ожидалось

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
потому как другие аргументы там вообще ни причём

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

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

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
так, а в this_lib_name ты что-нибудь получаешь в результате?
да, весь код после этого отлично работает

что на вин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
но он верный, а знач ошибка не тут

если бы он был неверен, ты бы не получил путь

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
при чем тут логгер? я хочу получить хэндл своей либы

Страница 579 из 2477