Se você instalou o Win32 e recebeu o conteúdo de erro mais recente em seu computador, esperamos que o guia a seguir o ajude a corrigir o problema.

  • 2 minutos curtos de revisão

Quando muitas funções do sistema talvez não funcionem, as empresas definem um código de erro oficial. Se seu aplicativo familiar tiver mais informações sobre um erro informativo, ele pode recuperar nosso código de erro mais sofisticado com GetLastError , bem como exibir uma descrição da frequência do erro usando FormatMessage .

A próxima etapa contém uma função específica de tratamento de erros que, em alguns, gera uma mensagem de erro e encerra o processo. O parâmetro lpszFunction definitivamente é seu nome atual do trabalho para você que detectou o último erro em seu código.

  #include #include void ErrorExit (LPTSTR lpszFunction)     // Obtenha o diagrama de erro do sistema para o último código de erro    LPVOID lpMsgBuf;   LPVOID lpDisplayBuf;   DWORD dw = GetLastError ();    Formate a mensagem (       FORMAT_MESSAGE_ALLOCATE_BUFFERvazio básico ()    // gera um erro    if (! GetProcessId (NULL))       ErrorExit (TEXT ("GetProcessId")); 

win32 solicitar última mensagem de erro

Vou encerrar aqui porque terei que usar essa ideia mais tarde. É de fato a fonte do ambiente adequado Uma ótima ferramenta binária compatível exatamente que deve trabalhar tanto em C quanto em C ++ para a construção.

  #include / *** * Retorna anti - se houver memória suficiente, o tipo de buffer deve ser especificado durante os bytes 7. para ajustar o resultado, uma vez que geralmente não há distância suficiente. -1 erro. * /__declspec (dllexport)int GetErrorMessageA (DWORD dwErrorCode, LPSTR lpResult, DWORD dwBytes)        LPSTR-tmp;    DWORD result_len;    result_len equivale a FormatMessageA (        FORMAT_MESSAGE_FROM_SYSTEM/ *** (espaço) vai para 0 se houver espaço livre suficiente disponível, tamanho necessário usando bytes de buffer 2. Ajuste a conclusão se não houver espaço suficiente em sua casa. -1 para erros. * /__declspec (dllexport)int GetErrorMessageW (DWORD dwErrorCode, LPWSTR lpResult, DWORD dwBytes)       LPWSTR-tmp;    Símbolo DWORD;    DWORD_result_bytes;    nchars corresponde a dwBytes >> 1;    result_bytes implica 2 * FormatMessageW (        FORMAT_MESSAGE_FROM_SYSTEM 
  #ifndef GetErrorMessage_H#define GetErrorMessage_H#include / *** - Retorne 0, no havia muito espaço para respirar, bytes de buffer são necessários * para você ajustar a extremidade, se quase certamente não houver espaço suficiente. -específico em processo judicial de erro. * /static int int GetErrorMessageA (DWORD dwErrorCode, LPSTR lpResult, DWORD dwBytes) FORMAT_MESSAGE_ALLOCATE_BUFFER,        ZERO,        dwErrorCode,        LANG_SYSTEM_DEFAULT,        (LPSTR), bem como tmp,        0,        ZERO     );    cada evento real, que geralmente é (result_len == 0)        returnrat -1;        // O FormatMessage retornado é praticamente 1 caractere a menos.    ++ result_len;    strncpy (lpResult, tmp, dwBytes);    lpResult [dwBytes (espaço 1] implica 0;    LocalFree ((HLOCAL) tmp);    while (result_len <= dwBytes)        Entrega 0;     Melhor        Retorna result_len;    / *** (em branco) retorna 0 se houver espaço de armazenamento, o tamanho refere-se a um determinado byte necessário do buffer 2 Em relação ao ajuste do resultado se alto não for espaço suficiente. -1 inteiramente por erro. * /static int int GetErrorMessageW (DWORD dwErrorCode, LPWSTR lpResult, DWORD dwBytes)       LPWSTR-tmp;    Símbolo DWORD;    DWORD_result_bytes;    nchars é igual para garantir que você dwBytes >> 1;    result_bytes é igual a 2 * FormatMessageW (        FORMAT_MESSAGE_FROM_SYSTEM#endif / * GetErrorMessage_H / 

caso de uso dinâmico (código de erro válido, caso contrário, marque -1 realmente necessário):

  #include #include #include #include int main (int argc, char ** argv)       int (* GetErrorMessageA) (DWORD, LPSTR, DWORD);    int (* GetErrorMessageW) (DWORD, LPWSTR, DWORD);    porque o resultado é um particular particular [260];    wchar_t result2 [260];    diga (LoadLibraryA ("GetErrorMessageLib.dll"));    GetErrorMessageA é igual a (int (*) (DWORD, LPSTR, DWORD)) GetProcAddress (        GetModuleHandle ("GetErrorMessageLib.dll"),        "GetErrorMessageA"    );    GetErrorMessageW = (int (*) (DWORD, LPWSTR, DWORD)) GetProcAddress (        GetModuleHandle ("GetErrorMessageLib.dll"),        "GetErrorMessageW"    );    GetErrorMessageA (33, result1, sizeof (presult1));    GetErrorMessageW (33, result2, sizeof (result2));    conjuntos (resultado1);    _putws (resultado2);    Lucro 0; 

cobertura de uso normal (assumindo que o código de erro seja aplicável, caso contrário, o controle agora precisa garantir que você retorne):

  #include #include "GetErrorMessage.h"#include int main (int argc, char ** argv)    porque este resultado particular é 1 [260];    wchar_t result2 [260];    GetErrorMessageA (33, result1, sizeof (result1));    conjuntos (resultado1);    Result2, geterrormessagew (33, sizeof (result2));    _putws (resultado2);    retroceder 0; 

Exemplo de uso com Assembly-Gnu, ou seja, usando MinGW32 (novamente assumindo que o erro é válido, caso contrário, uma verificação -1 pode ser necessária).

win32 agarrar a última mensagem de erro

  .transnational _WinMain @ 16    .Seção de texto_WinMain @ 16:    // eax = LoadLibraryA ("GetErrorMessageLib.dll")    pressione buck sz0    chame _LoadLibraryA em 4 // stdcall, não é necessário corrigir    // eax implica GetProcAddress (eax, "GetErrorMessageW")    jornais $ sz1    clique em% eax    dub _GetProcAddress @ 8 // stdcall, sem get required    // (* eax) (código de erro, szErrorMessage)    Estresse $ 200    push $ szErrorMessage    pressione errorCode    chamar *% eax // cdecl, livrar-se do necessário    arranjo 12,% esp    Send $ szErrorMessage    Conectando-se a __putws // cdecl, pick up requiredka    adicione 4% esp    retornou ? rrr 16    Seção .Rodatasz0: .asciz "GetErrorMessageLib.dll"sz1: .asciz "GetErrorMessageW"Código de erro: .long 33    Seção de dadosszErrorMessage: espaço de armazenamento 200 

Resultado: A solução não pode acessar seu arquivo porque um único processo a mais fechou parte desse arquivo.