Исправьте эту ошибку: GetLastError 0x13d - PullRequest
0 голосов
/ 27 февраля 2012

В этом примере dwerror равен 10045L. Но этот код возвращает значение 0x13d как ошибку. Как получить сообщение в формате? Пожалуйста, ознакомьтесь с ним.

TCHAR lpMsgBuf[512];
if(!FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    dwError,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR) &lpMsgBuf,
    0, NULL ))
{
    wprintf(L"Format message failed with 0x%x\n", GetLastError());
    return;
}

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

0x13d == 317 == ERROR_MR_MID_NOT_FOUND. Сообщение об ошибке, которую вы пытаетесь найти, не существует в SYSTEM. Возможно, ваша ошибка произошла из определенного dll или драйвера . Если вы знаете, какой dll \ драйвер пытается обойти его дескриптор, укажите FORMAT_MESSAGE_FROM_HMODULE вместо FORMAT_MESSAGE_FROM_SYSTEM и укажите дескриптор в качестве источника при вызове FormatMessage.

И, кроме того, если вы используете FORMAT_MESSAGE_ALLOCATE_BUFFER, вы должны объявить переменную типа LPTSTR, такую ​​как LPTSTR pMsg; и передать ее в FormatMessage как (LPTSTR)&pMsg, и когда вы закончите с этим, используйте LocalFree(pMsg) для освобождения выделенной памяти.

1 голос
/ 27 февраля 2012

Прежде всего, когда вы говорите FORMAT_MESSAGE_ALLOCATE_BUFFER, вам не нужно выделять больше, чем указатель.Затем вы передаете указатель на этот указатель в lpBuffer.Поэтому попробуйте это:

TCHAR* lpMsgBuf;
if(!FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    dwError,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR) &lpMsgBuf,
    0, NULL ))
{
    wprintf(L"Format message failed with 0x%x\n", GetLastError());
    return;
}

И не забудьте позвонить в LocalFree

или вы выделите буфер самостоятельно:

TCHAR lpMsgBuf[512];
if(!FormatMessage(
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    dwError,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR) lpMsgBuf,
    512, NULL ))
{
    wprintf(L"Format message failed with 0x%x\n", GetLastError());
    return;
}

Также попробуйте это:

#include <cstdio>
#include <cstdlib>

int alloc(char** pbuff,unsigned int n)
{
*pbuff=(char*)malloc(n*sizeof(char));
}

int main()
{
char buffer[512];

printf("Address of buffer before: %p\n",&buffer);

//  GCC sais: "cannot convert char (*)[512] to char** ... "
//  alloc(&buffer,128);

//  if i try to cast:   
alloc((char**)&buffer,128);
printf("Address of buffer after:  %p\n",&buffer);

// if i do it the right way:
char* p_buffer;
alloc(&p_buffer,128);
printf("Address of buffer after:  %p\n",p_buffer);


return 0;
}

Нет смысла пытаться изменить адрес переменной.Вероятно, поэтому ваш код не работает.

...