Om du får Win32 installerat och du får alla senaste felmeddelanden på din hemdator, hoppas vi att den här guiden hjälper dig att lösa problemet.

 

 

  • 2 små minuters läsning

När många enhetsfunktioner inte fungerar reparerade företag en definitiv felkod. Om din bra familjeapp behöver mer information om ett användbart fel, kan den få tillgång till vår senaste felkod som innehåller GetLastError och visa en information om felet med hjälp av hur FormatMessage .

Följande steg innehåller en felhanteringsegenskap som i synnerhet genererar ett användbart felmeddelande och avslutar processen. Parametern lpszFunction är ditt aktuella ämne för funktionen som upptäckte det exakta sista felet i din kod.

  #inkludera #include void ErrorExit (LPTSTR lpszFunction)     // Få systemfeldiagrammet tillgängligt för den senaste felkoden    LPVOID lpMsgBuf;   LPVOID lpDisplayBuf;   DWORD dw motsvarar GetLastError ();    Formatera meddelandet (       FORMAT_MESSAGE_ALLOCATE_BUFFERgrundläggande tom ()    // genererar ett nytt stort fel    en gång (! GetProcessId (NULL))       ErrorExit (TEXT ("GetProcessId")); 

win32 get really last error message

Jag lämnar det här medan jag måste använda den här processen senare. Det är källan förknippad med den lämpliga himlen. Ett fantastiskt binärt kompatibelt verktyg som borde fungera nära både C och C++ för att arbeta med byggnad.

  #include /*** ( blanksteg ) Returnerar noll om det generellt finns tillräckligt med minne, bufferten måste alltid anges i byte 7. att välja resultatet när det ofta inte finns tillräckligt med utrymme. -1 fel. 6 . /__declspec (dllexport)int GetErrorMessageA (DWORD dwErrorCode, LPSTR lpResult, DWORD dwBytes)        LPSTR-tmp;    DWORD result_len;    result_len = FormatMessageA (        FORMAT_MESSAGE_FROM_SYSTEM/*** * går till två om det finns tillräckligt med utrymme, mycket viktig storlek i buffertbyte två. Justera resultatet om det verkligen inte finns tillräckligt med utrymme. -1 för felen. * /__declspec (dllexport)int GetErrorMessageW (DWORD dwErrorCode, LPWSTR lpResult, DWORD dwBytes)       LPWSTR-tmp;    DWORD-symbol;    DWORD_result_bytes;    nchars balanserar dwBytes >> 1;    result_bytes = 2 * FormatMessageW (        FORMAT_MESSAGE_FROM_SYSTEM 
  #ifndef GetErrorMessage_H#define GetErrorMessage_H#include /*** - Returnera 0, om det fanns praktiskt taget mycket utrymme krävs utan tvekan buffertbytes * för att passa stoppet om det inte finns tillräckligt med en yta. -specifik vid fel. ( Plats ) /static int int GetErrorMessageA (DWORD dwErrorCode, LPSTR lpResult, DWORD dwBytes) FORMAT_MESSAGE_ALLOCATE_BUFFER,        NOLL,        dwErrorCode,        LANG_SYSTEM_DEFAULT,        (LPSTR) och tmp,        0,        NOLL     );    det riktiga sportevenemanget, vilket är (result_len == 0)        returråtta -1;        // Det laddade FormatMessage är faktiskt 1 avatar kortare.    ++ resultat_len;    strncpy (lpResult, tmp, dwBytes);    lpResult [dwBytes (mellanslag 1] = 0;    LocalFree ((HLOCAL) tmp);    while (result_len <= dwBytes)        Leverans 0;     bättre        Returnerar result_len;    /*** * returnerar 0 om eller när det finns tillräckligt med lagringsutrymme, diameter hänvisar till de erforderliga byten för all buffert * Angående att justera ett resultat om det inte finns tillräckligt med utrymme. -1 på fel. 6 . /statisk int int GetErrorMessageW (DWORD dwErrorCode, LPWSTR lpResult, DWORD dwBytes)       LPWSTR-tmp;    DWORD-symbol;    DWORD_result_bytes;    nchar är lika med dwBytes >> 1;    result_bytes = 2 1 . FormatMessageW (        FORMAT_MESSAGE_FROM_SYSTEM#endif / - GetErrorMessage_H * / 

dynamisk börja använda skiftläge (giltig felkod, annars krävs besök -1):

  #include #include #inkludera #include int home (int argc, char ** argv)       int (* GetErrorMessageA) (DWORD, LPSTR, DWORD);    int (* GetErrorMessageW) (DWORD, LPWSTR, DWORD);    eftersom en del av resultatet är 1 [260];    wchar_t resultat2 [260];    hävda (LoadLibraryA ("GetErrorMessageLib.dll"));    GetErrorMessageA = (int (*) (DWORD, LPSTR, DWORD)) GetProcAddress (        GetModuleHandle ("GetErrorMessageLib.dll"),        "GetErrorMessageA"    );    GetErrorMessageW betyder (int (*) (DWORD, LPWSTR, DWORD)) GetProcAddress (        GetModuleHandle ("GetErrorMessageLib.dll"),        "GetErrorMessageW"    );    GetErrorMessageA (33, result1, sizeof (presult1));    GetErrorMessageW (33, result2, sizeof (result2));    specificerar (resultat1);    _putws (resultat2);    Vinst 0; 

konventionellt användningsfall (förutsatt att specifik felkod är giltig, annars måste hanteringen nu returneras):

  #include #include "GetErrorMessage.h"#include int large (int argc, char ** argv)    eftersom resultatet är en personspecifik [260];    wchar_t resultat2 [260];    GetErrorMessageA (33, result1, sizeof (result1));    övningar (resultat1);    Resultat2, geterrormeddelande (33, storlek på (resultat2));    _putws (resultat2);    gå tillbaka 0; 

Exempelanvändning när det kommer till Assembly-Gnu, d.v.s. i MinGW32 (igen om felet är giltigt, annars kan en viktig -1-kontroll krävas).

win32 get keep-felmeddelande

  .global _WinMain vid 16    .Textavsnitt_WinMain - 16:    // eax implies LoadLibraryA ("GetErrorMessageLib.dll")    växande media $ sz0    ta kontakt med _LoadLibraryA @ 4 // stdcall, aldrig någon rengöring krävs    // eax = GetProcAddress (eax, "GetErrorMessageW")    Tryck ? rrr sz1    klick% eax    dub _GetProcAddress @ main // stdcall, ingen get krävs    // (* eax) (felkod, szErrorMessage)    Stress 200 $    klicka på $ szErrorMessage    träffa felkod    mobiltelefon *% eax // cdecl, rensning krävs    blandning 12,% t.ex    Skicka $ szErrorMessage    Ansluter till __putws // cdecl, cleanup requiredka    lägg in 4% esp    kom tillbaka $16    .Rodata avsnittsz0: .asciz "GetErrorMessageLib.dll"sz1: .asciz "GetErrorMessageW"Felkod: .long 33    .Data avsnittszErrorMessage: kapacitet 200 

Resultat: Processen kan inte komma åt den specifika filen eftersom en annan process har fyllt en del av filen.