Я решил изучить недокументированную функцию WinAPI, потому что некоторые из них все еще могут использоваться и могут делать то, что без них невозможно (например: GetConsoleCommandHistory
или MessageBoxTimeout
).
Когда Я попытался импортировать GetConsoleCharType
из kernel32.dll с объявлением, которое я нашел в inte rnet. Когда я запустил его, я получил код ошибки 16385
от GetLastError
. Я попытался запустить его в FormatMessage
, чтобы получить сообщение об ошибке, но затем FormatMessage
не удалось с кодом 15100
из GetLastError
. Я ввел страницу windows с кодами ошибок и увидел, что они поддерживают только коды ошибок от 0 до 15999. Кто-нибудь может помочь мне понять эту ошибку?
Объявление функции от https://doxygen.reactos.org/df/d28/dll_2win32_2kernel32_2client_2console_2console_8c.html
Мой код:
HMODULE hModule = LoadLibraryA("kernel32.dll");
if (hModule)
{
puts("Kernel32 loaded!");
BOOL(WINAPI * GetConsoleCharType)(HANDLE hConsole, COORD Coord, PDWORD Type);
GetConsoleCharType = (decltype(GetConsoleCharType))GetProcAddress(hModule, "GetConsoleCharType");
if(GetConsoleCharType)
{
puts("Function loaded!");
DWORD type = 0;
if (GetConsoleCharType(GetStdHandle(STD_OUTPUT_HANDLE), { 0, 0 }, &type))
puts("Function worked!");
else
{
printf("Function failed with code %lu\n", GetLastError());
char* msg;
if(FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR)&msg, 0, NULL))
{
printf("Error: %s", msg);
LocalFree(msg);
}
else
{
printf("FormatMessage failed with code %lu\n", GetLastError());
}
}
FreeLibrary(hModule);
}
}
Выход:
Kernel32 loaded!
Function loaded!
Function failed with code 16385
FormatMessage failed with code 15100