この動作を説明する方法はほとんど分かりません。このため、私自身は答えを見つけることができません - この問題の名前を付ける方法はわかりません。返信時にC++のwin32api値のエンコーディングが壊れる
OPENFILENAME GuiUtils::ChooseFileDialog(HWND hwnd)
{
OPENFILENAME ofn;
char szFile[260];
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = (LPWSTR)szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrFilter = TEXT("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0");
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
HANDLE hf;
// Display the Open dialog box.
if (GetOpenFileName(&ofn) == TRUE)
{
hf = CreateFile(ofn.lpstrFile,
GENERIC_READ,
0,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL);
}
return ofn;
}
I:私は、ファイルを開いて、ファイル名を取得するクラスメソッドを持っているいくつかの方法で、タイトルがmissleadingされるか質問が間違っているのであればお待ちくださいが、ここでは
が来ます
私は、デバッガでの移動と呼び出し元の関数に戻ってジャンプすると何かがめちゃくちゃますエンコードされたように見えofn.lpstrFile
を見て呼び出すクラスメソッド:
INT_PTR CALLBACK FormCreator::Callback(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_COMMAND:
if (LOWORD(wParam) == IDCHOOSEFILE)
{
GuiUtils *guiUtils = new GuiUtils();
OPENFILENAME ofn = guiUtils->ChooseFileDialog(hwnd);
ORMFactory* db = new ORMFactory(); // value in debugger changes here
AbstractORM* sqlite = db->GetORMProvider(TEXT("SQLITE"));
this->databaseFileName = (wstring)ofn.lpstrFile;
}
break;
return 0;
}
は、誰かが私はこの問題を解決するためにここで間違っofn.lpstrFile
、どのようにして聞かせていただけますか?あなたは、ファイル名を格納するスタックアレーszFile
を使用している
http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc – Ajay
あなたが嘘をつきましたコンパイラはここで '(LPWSTR)szFile'となり、その嘘の避けられない結果が得られました。コンパイラに嘘をつけないでください。 –