Traduction Exception win32
Bonjour,
Lors d'une opération sur les fichiers je génère une exception de type Win32Exception errorCode: 1326 (Echec d'ouverture de session).
Dans mon cas, cette erreur est normale.
Mon problème est que je n'arrive pas à faire traduire cette exception par le système en anglais même si CultureInfo est ("en-US")!!
D'autre part j'ai aussi essayé de traduire le message en important la fonction "FormatMessage" de l'api win32 mais ce n'est pas mieux!! (voir code si-dessous).
J'utilise un windows vista en français, et peut-être que ces ressources ne sont pas traduites en anglais??? Avez vous une idée? Une explication??
Y a-t-il des packs de langue??
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
private void btnGetMessage_Click(object sender, EventArgs e)
{
string strMessage;
strMessage = GetErrorMessage(1326);
MessageBox.Show(strMessage);
}
[DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private unsafe static extern int FormatMessage(int dwFlags, ref IntPtr pMessageSource, int dwMessageID, int dwLanguageID, ref string lpBuffer, int nSize, IntPtr* pArg);
private unsafe static string GetErrorMessage(int errorCode)
{
int FMT_ALLOCATE_BUFFER = 0x00000100;
int FMT_IGNORE_INSERTS = 0x00000200;
int FMT_FROM_SYSTEM = 0x00001000;
int minBufferSize = 0;
string messageBuffer = String.Empty;
string message = String.Empty;
int dwFlags = FMT_FROM_SYSTEM | FMT_ALLOCATE_BUFFER | FMT_IGNORE_INSERTS;
// Initialize pointers.
IntPtr pMessageSource = new IntPtr();
IntPtr pArgs = new IntPtr();
CultureInfo currentCulture = CultureInfo.CurrentCulture;
currentCulture = new CultureInfo("en-US");
int pid = PRIMARYLANGID(currentCulture.LCID);
int sid = SUBLANGID(currentCulture.LCID);
int langID = MAKELANGID(pid, sid);
int messageSize = 0;
messageSize = FormatMessage(dwFlags, ref pMessageSource, errorCode, langID, ref messageBuffer, minBufferSize, &pArgs);
if (messageSize == 0)
{
string messages = new Win32Exception(Marshal.GetLastWin32Error()).Message;
MessageBox.Show(messages);
}
message = String.Format("{0}", messageBuffer);
return message;
}
public static int MAKELANGID(int primary, int sub)
{
return (((ushort)sub) << 10) | ((ushort)primary);
}
public static int PRIMARYLANGID(int lcid)
{
return ((ushort)lcid) & 0x3ff;
}
public static int SUBLANGID(int lcid)
{
return ((ushort)lcid) >> 10;
} |
Remarque: Le code ci-dessus retourne une chaine vide avec (en-US):aie: et la bonne chaine avec (fr-FR):lol:
PS: Je sais que je peux traduire ces exceptions moi même en fonction du code d'erreur. Cependant je ne souhaite pas le faire, car je ne connais pas toutes les exceptions que peut retourné win32 dans ce cas précis.