0

GetOpenFilename()ユーザーにファイルを選択させるために使用します。コードは次のとおりです。

  wchar_t buffer[MAX_PATH] = { 0 };

  OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };

  open_filename.hwndOwner   = handle_;
  open_filename.lpstrFilter = L"Video Files\0*.avi;*.mpg;*.wmv;*.asf\0"
                              L"All Files\0*.*\0";
  open_filename.lpstrFile   = buffer;
  open_filename.nMaxFile    = MAX_PATH; 
  open_filename.lpstrTitle  = L"Open media file...";
  open_filename.Flags       = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

  ::GetOpenFileNameW(&open_filename);

ファイルダイアログが表示されますが、

  • フィルタを変更するか
  • 「マイコンピュータ」をクリックします

ファイルリストが空になります。を押し[F5]ても効果はありませんが、親フォルダーに切り替えて元のフォルダーに戻ると(フィルターを変更した場合)、フィルターは正常に機能し、ファイルがリストに表示されます。

編集:私のシステムはWindows XP(SP3)32ビットです-特別なことは何もありません。これは、同じ構成を持つ他のマシンでも発生します。

4

3 に答える 3

1

問題を引き起こしている可能性のある、まだ行っていないことの1つは、OPENFILENAMEW構造、特にlStructSize要素を完全に初期化することです。私はこれが奇妙な効果を引き起こすのを見たことがあります。私は次のようなものを持っていることをお勧めします

  OPENFILENAMEW open_filename = { sizeof (OPENFILENAMEW) };
  ZeroMemory(&open_filename, sizeof (OPENFILENAMEW));
  open_filename.lStructSize = sizeof (OPENFILENAMEW);
于 2009-05-29T07:49:30.747 に答える
0

ありがとう、beef2k。できます。しかし、私の問題には少し違いがあります。SHBrowseForFolder 呼び出しを追加するまで、すべてが正常に機能していました。その瞬間以来、私は同じ効果を得ていました。ただし、CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); を追加します。問題を解決しました。

于 2010-02-02T04:29:01.797 に答える
0

さて、私は問題を理解しました。少なくとも、私にとってはうまくいく解決策があります。

コードの前半で、COM を初期化するために次の呼び出しがありました...

::CoInitializeEx(NULL, COINIT_MULTITHREADED);

さて、これを次のように変更します...

::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

...私のために問題を解決します! これで、ファイル ダイアログが再びフィルタリングされます。

私はこれをウェブで検索しましたが、同じ問題に直面している人はほとんどいないようですが、前述の解決策を公開した人はいません。誰でも私の調査結果を確認できますか?

于 2009-06-23T20:48:20.027 に答える