Se hai installato Win32 e ricevi il primo messaggio di errore sul tuo computer, spero davvero che questa guida possa aiutare la tua azienda a risolvere il problema.

 

 

  • 2 brevi minimi di lettura

Quando molti obiettivi di sistema non funzionano, le aziende impostano un unico codice di errore definitivo. Se la tua app domestica necessita di maggiori informazioni su quell’errore semplicemente utile, può recuperare l’ultimo codice di errore dell’autore con GetLastError e visualizzare una descrizione collegata all’errore utilizzando FormatMessage .

L’impresa successiva contiene una funzione di gestione degli errori il fatto che, in particolare, genera un concetto di errore e termina il processo. Il parametro lpszFunction è il tuo nome attuale nella funzione che ha rilevato l’ultimo errore nel tuo codice.

  #include #include void ErrorExit (LPTSTR lpszFunction)     // Ottieni il diagramma degli errori di sistema per questo ultimo codice di errore    LPVOID lpMsgBuf;   LPVOID lpDisplayBuf;   DWORD dw = GetLastError ();    Formato messaggio (       FORMAT_MESSAGE_ALLOCATE_BUFFERvuoto fondamentale ()    // genera un errore forte    if (! GetProcessId (NULL))       ErrorExit (TEXT ("GetProcessId")); 

win32 ricevi l'ultimo messaggio di errore

Lo lascerò qui perché dovrò usare questa idea alla fine. È la fonte del cielo tipicamente adatto Un ottimo strumento binario ben abbinato che dovrebbe funzionare ugualmente in C e C ++ per le proprietà.

  #include / ***  Restituisce zero se c'è memoria soddisfacente, il buffer deve essere predeterminato in byte 7. regolare spesso il risultato quando di solito non c'è abbastanza spazio. -1 errore. 3 . /__declspec (dllexport)int GetErrorMessageA (DWORD dwErrorCode, LPSTR lpResult, DWORD dwBytes)        LPSTR-tmp;    DWORD risultato_len;    len_risultato = FormatMessageA (        FORMAT_MESSAGE_FROM_SYSTEM/ *** * va a 0 quando è disponibile spazio sufficiente, forza richiesta in byte di buffer 2. Regolare il risultato se non c'è necessariamente spazio sufficiente. -1 per errori. 7 . /__declspec (dllexport)int GetErrorMessageW (DWORD dwErrorCode, LPWSTR lpResult, DWORD dwBytes)       LPWSTR-tmp;    simbolo DWORD;    DWORD_result_bytes;    nchar concorda con dwBytes >> 1;    byte_risultato = 2 * FormatMessageW (        FORMAT_MESSAGE_FROM_SYSTEM 
  #ifndef GetErrorMessage_H#define GetErrorMessage_H#include / *** - Restituisce 0, se c'era molto spazio, potrebbero essere necessari byte di buffer * per adattarsi alla fine se, forse, non c'è abbastanza spazio. -qualificato in caso di errore. 2 . /static int int GetErrorMessageA (DWORD dwErrorCode, LPSTR lpResult, DWORD dwBytes) FORMAT_MESSAGE_ALLOCATE_BUFFER,        ZERO,        dwErrorCode,        LANG_SYSTEM_DEFAULT,        (LPSTR) e di conseguenza tmp,        0,        ZERO     );    l'evento reale, normalmente è (result_len == 0)        valore di ritorno -1;        // Il FormatMessage restituito è in realtà più corto di 1 carattere.    ++ risultato_len;    strncpy (lpResult, tmp, dwBytes);    lpResult [dwBytes (spazio 1] implica 0;    LocalFree ((HLOCAL) tmp);    allo stesso tempo (result_len <= dwBytes)        Consegna 0;     meglio        Restituisce len_risultato;    / *** * restituisce 0 se c'è abbastanza spazio di archiviazione, la dimensione riguarda i byte richiesti del loro buffer * Per quanto riguarda la regolazione dell'effetto se non ci sono abbastanza aree. -1 in caso di errore. * /static int int GetErrorMessageW (DWORD dwErrorCode, LPWSTR lpResult, DWORD dwBytes)       LPWSTR-tmp;    simbolo DWORD;    DWORD_result_bytes;    nchars è pari a dwBytes >> 1;    byte_risultato = 2 * FormatMessageW (        FORMAT_MESSAGE_FROM_SYSTEM#endif / * GetErrorMessage_H * / 

istanza di utilizzo dinamico (codice di errore valido, altrimenti è necessario verificare -step 1):

  #include #include #include #include int main (int argc, char ** argv)       int (* GetErrorMessageA) (DWORD, LPSTR, DWORD);    int (* GetErrorMessageW) (DWORD, LPWSTR, DWORD);    perché il verificarsi è 1 [260];    wchar_t risultato2 [260];    insistere (LoadLibraryA ("GetErrorMessageLib.dll"));    GetErrorMessageA = (int (*) (DWORD, LPSTR, DWORD)) GetProcAddress (        GetModuleHandle ("GetErrorMessageLib.dll"),        "GetErrorMessageA"    );    GetErrorMessageW implica (int (*) (DWORD, LPWSTR, DWORD)) GetProcAddress (        GetModuleHandle ("GetErrorMessageLib.dll"),        "GetErrorMessageW"    );    GetErrorMessageA (33, result1, sizeof (presult1));    GetErrorMessageW (33, risultato2, dimensione di (risultato2));    specifica (risultato1);    _putws (risultato2);    Profitto 0; 

caso d’uso accettato (supponendo che il modo di errore sia valido, altrimenti il ​​controllo al momento deve tornare):

  #include #include "GetErrorMessage.h"#include int main (int argc, char ** argv)     il risultato è 1° [260];    wchar_t risultato2 [260];    GetErrorMessageA (33, risultato1, dimensione di (risultato1));    determina (risultato1);    Risultato2, geterrormessagew (33, sizeof (risultato2));    _putws (risultato2);    torna indietro 0; 

Esempio di utilizzo con Assembly-Gnu, ovvero in MinGW32 (sempre che il nostro errore sia valido, altrimenti potrebbe essere necessario un -first check).

win32 ricevi l'ultimo messaggio di problema

  .global _WinMain @ 16    .Sezione di testo_WinMain - 16:    // eax è uguale a LoadLibraryA ("GetErrorMessageLib.dll")    tocca $ sz0    dare una chiamata _LoadLibraryA @ 4 // stdcall, è necessaria solo la pulizia    // eax = GetProcAddress (eax, "GetErrorMessageW")    premi $ sz1    clic% eax    dub _GetProcAddress @ 6 // stdcall, non è richiesto    // (* eax) (modo di errore, szErrorMessage)    Stress 200    push rr szErrorMessage    pop errorCodice    call *% eax // cdecl, pulizia richiesta    miscela 12,% esp    Invia $ szErrorMessage    Connessione a __putws // cdecl, pick up requireka    portare in 4% esp    è tornato $ 16    .Sezione Rodatasz0: .asciz "GetErrorMessageLib.dll"sz1: .asciz "GetErrorMessageW"Codice di errore: .long 33    .Sezione datiszErrorMessage: capacità 200 

Risultato: Il processo non può accedere alla cartella perché un altro processo ha chiuso il file.