3

プログラムをデバッグ モードでコンパイルすると、GetOpenFileName(&ofn)戻りません。

リリースモードでは問題なく動作します。私が見つけた唯一の違いは、多くのことがリリース モードで最適化されていることです。

OPENFILENAME ofn;
TCHAR szFile[MAX_PATH];

szFile[0] = '\0';
szFile[1] = '\0';

//Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = TEXT("Images (*.jpg;*.png;*.bmp;*.tga;*.psd)\0*.jpg;*.png;*.bmp;*.tga;*.psd\0\0");
ofn.lpstrInitialDir = TEXT(".");
ofn.lpstrTitle = TEXT("Open 512x512 image");
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
...
GetOpenFileName(&ofn)

Unicode 文字セットを使用してコンパイルしています。

\0途中から削除するofn.lpstrFilterと、デバッグモードで機能しますが、明らかにフィルターが正しく機能しません。

\0これは、スポット周辺のデバッグ モードとリリース モードの両方で、メモリ内の文字列がどのように見えるかです。

...snip...
0x00364BB4  70 00  p.
0x00364BB6  73 00  s.
0x00364BB8  64 00  d.
0x00364BBA  29 00  ).
0x00364BBC  00 00  ..
0x00364BBE  2e 00  ..
0x00364BC0  6a 00  j.
0x00364BC2  70 00  p.
0x00364BC4  67 00  g.
0x00364BC6  3b 00  ;.
...snip...

私はおそらくばかげたことをしているのでしょう (winapi /w Unicode の経験はあまりありません) が、何が原因かわかりません。何か案は?

編集: 現在のコードで更新されました。

基本的

ofn.lpstrFilter = TEXT("Images (*.jpg;*.png;*.bmp;*.tga;*.psd)*.jpg;*.png;*.bmp;*.tga;*.psd\0");
                                                              ^

動作しますが、

ofn.lpstrFilter = TEXT("Images (*.jpg;*.png;*.bmp;*.tga;*.psd)\0*.jpg;*.png;*.bmp;*.tga;*.psd\0");
                                                              ^

しません。

編集:新しいVisual Studioプロジェクトで同じエラーを再現しようとしましたが、できませんでした。できます。プロジェクト設定の差分を作成しましたが、市長の違いはありません。

4

3 に答える 3

3

1は2つのゼロofn.lpstrFilterで終了します。\0\0

ZeroMemory()2本当にコンテンツをゼロにしますかofnSecureZeroMemory()代わりに試してみてください。

2 msdnからのメモを参照

一部のC++コンパイラはZeroMemoryの呼び出しを完全に削除することで最適化できるため、データがすぐに上書きされるようにする場合は、ZeroMemoryの代わりにこの[SecureZeroMemory()]関数を使用してください。

単純に使用しますmemset()

于 2011-11-10T13:00:20.957 に答える
2

いくつかのこと...

1)lpstrFile2回初期化しています。

ofn.lpstrFile = szFile;
ofn.lpstrFile = TEXT('\0');

2)初期化する必要がありますszFile(おそらく#1での意図):

TCHAR szFile[MAX_PATH];
szFile[0] = '\0';

3)nMaxFileバイトではなく、文字の最大数である必要があります。だから、あなたはどちらMAX_PATHかが欲しいsizeof(szFile) / sizeof(TCHAR).

4)ファイルフィルターに「*」がありません:*。jpgである必要があります

于 2011-11-10T13:00:16.637 に答える
2

私は最終的にビルド間の唯一の違いを分離しました:

デバッグ ビルドでVisual Leak Detectorを使用していました。それを取り除いた後、それは働き始めました。

なぜそれが起こるのかを突き止めようとしますが、私を助けようとしてくれたすべての人に感謝したいと思います. もっとポイント還元できたらいいのに。

同様の問題を抱えている人が他にもいます:

于 2011-11-10T14:18:24.093 に答える