2010-04-30 8 views
1

J'ai une fonction qui renvoie une valeur DWORD différente pour chaque cas, il y a une erreur. J'ai donc les définitions suivantes:Combinaison de la valeur de GetLastError et d'un message d'erreur personnalisé

#define ERR_NO_DB_CONNECTION 0x90000 
#define ERR_DB_NOT_OPEN   0x90001 
#define ERR_DB_LOCKED   0x90002 
#define ERR_DB_CONN_LOST  0x90003 

Maintenant, je renvoie ces valeurs lorsqu'une erreur se produit. Je dois également retourner la valeur de GetLastError dans le même retour.

Non, je ne peux pas le lire plus tard.

J'ai essayé combinant différentes façons, par exemple:

return ERR_DB_NOT_OPEN + GetLastError(); 

puis extraire l'erreur en soustrayant la valeur de ERR_DB_NOT_OPEN mais comme je dois l'utiliser dans des fonctions où il peut y avoir plusieurs retour des valeurs qu'il peut obtenir assez complexe pour le faire.

Y a-t-il un moyen d'y parvenir? Je veux dire, combiner la valeur + GetLastError et les extraire plus tard? Le code est apprécié.

Merci

Jess.

Répondre

1

Selon Microsoft's documentation, les codes d'erreur système atteignent un maximum de 15999 (0x3E7F). Cela signifie que vous avez tout le mot supérieur pour jouer avec. Vous aurez besoin de réduire vos codes d'erreur pour entrer dans 4 chiffres hexadécimaux, vous pouvez utiliser des macros Windows pour combiner et de les diviser:

return MAKELPARAM(GetLastError(), ERR_DB_NOT_OPEN); 

int lasterror = LOWORD(result); 
int code = HIWORD(result); 
+0

Ce n'est pas tout à fait vrai. Les bits supérieurs sont utilisés pour coder la gravité, la facilité et ainsi de suite. Voir winerror.h. –

+0

Ce ne sont que les codes d'erreur existants; Microsoft se réserve le droit d'ajouter de nouveaux codes d'erreur dans le futur. – Luke

0

Vous pouvez les combiner en une chaîne (tableau de caractères), puis les séparer de l'appelant.

1

Je sais que ce poste est vieux, mais juste au cas où ... En complément de la réponse de Mark. La région de code suivante est disponible pour vous permettre de définir vos propres erreurs.

Les codes d'erreur sont des valeurs de 32 bits (le bit 31 est le bit le plus significatif). Le bit 29 est réservé aux codes d'erreur définis par l'application; aucun code système n'a ce bit défini. Si vous définissez un code d'erreur pour votre application, définissez ce bit pour indiquer que le code d'erreur a a été défini par votre application et que le code d'erreur n'est pas en conflit avec les codes d'erreur définis par le système.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms680627%28v=vs.85%29.aspx