GetOpenFileName ändert einstellung von setlocale()

13/02/2008 - 12:45 von Billy the Kid | Report spam
Hallo,
wir verwenden Visual Studio 2005 UNICODE. Wenn ein Filedialog geöffnet wird,
dann àndert sich die Einstellung von setlocale. Dies war mit Visual Studio
2003 nicht unicode nicht so.

Code Example:

void C_L10N::TraceLocale(const T_STRING &TraceText)
{
TRACE_NOCHECK(TraceText << L"Aktuelle Einstellung für locale" <<
_wsetlocale(LC_ALL, 0));
TRACE_NOCHECK(L"Aktuelle Einstellung für mbcp" << _getmbcp());
}

C_WINTOOL::GetL10N().TraceLocale(L"Vor: Test");

CFileDialog Dialog(TRUE, L"ELE", NULL, OFN_HIDEREADONLY |
OFN_ENABLESIZING | OFN_NOCHANGEDIR, GetDateLine().Str());
Dialog.m_ofn.lpstrTitle = L"Meiner !!!!";
Dialog.DoModal();

C_WINTOOL::GetL10N().TraceLocale(L"Nach: Test");

Output:

[12:04:40] Vor: Test
Aktuelle Einstellung für locale
LC_COLLATE=C;LC_CTYPE=C;LC_MONETARY=C;LC_NUMERIC=English_United
States.1252;LC_TIME=German_Germany.1252
[12:04:40] Aktuelle Einstellung für mbcp
0
[12:05:11] Nach: Test
Aktuelle Einstellung für locale
German_Germany.1252
[12:05:11] Aktuelle Einstellung für mbcp
0

Warum wird die Einstellung beim SDK-Aufruf geàndert? Ein geànderter Code der
zwischen den beiden Ausgaben nur ein ::GetOpenFileName() enthàlt àndert das
locale ebenfalls.

Was ist zu tun um diesen Unsinn abzustellen?
 

Lesen sie die antworten

#1 Jochen Kalmbach [MVP]
13/02/2008 - 13:22 | Warnen spam
Hallo Billy!

wir verwenden Visual Studio 2005 UNICODE. Wenn ein Filedialog geöffnet wird,
dann àndert sich die Einstellung von setlocale. Dies war mit Visual Studio
2003 nicht unicode nicht so.

Code Example:



Du solltest einvollstàndiges Beispiel liefern...


Warum wird die Einstellung beim SDK-Aufruf geàndert? Ein geànderter Code der
zwischen den beiden Ausgaben nur ein ::GetOpenFileName() enthàlt àndert das
locale ebenfalls.



Kann ich nicht nachvollziehen. Hier mein Beispiel-Code:

#include <windows.h>
#include <stdio.h>
#include <locale.h>
#include <mbctype.h>
#include <tchar.h>

int _tmain()
{
_tprintf(_T("MB-CP: %d"), _getmbcp());
_tprintf(_T("Locale: %s"), setlocale(LC_ALL, NULL));


OPENFILENAME ofn; // common dialog box structure
TCHAR szFile[260]; // buffer for file name

// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
//
// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
// use the contents of szFile to initialize itself.
//
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = _T("All\0*.*\0Text\0*.TXT\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

// Display the Open dialog box.

if (GetOpenFileName(&ofn)==TRUE)
{
_tprintf(_T("FN: %s"), ofn.lpstrFile);
}

_tprintf(_T("MB-CP: %d"), _getmbcp());
_tprintf(_T("Locale: %s"), setlocale(LC_ALL, NULL));
}

PS: Eine bessere Gruppe für "unmanaged" Fragen ist "microsoft.public.de.vc"

Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/

Ähnliche fragen