![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
VC++2010 でMFCアプリケーションを作成しているのですが、
DlgDirListComboBox関数によって一覧が表示されているコンボボックスから、
現在選択されている項目(ディレクトリ名、ドライブ名)を取得する処理で、
DlgDirSelectComboBoxExを使用するとアプリケーションが強制終了してしまいます。
何が悪いのかが解らず困っています。
詳しい方がいましたらご教授お願いします。
以下は私が作成したサンプルコードとなります。
BOOL CComboBoxTestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
CStringwork;
work = L"C:\\*.*";
DlgDirListComboBox( work.GetBuffer(), IDC_COMBO1, 0, DDL_DIRECTORY | DDL_DRIVES | DDL_EXCLUSIVE);
m_ComboBox.SetWindowText(L"C:\\");
}
void CComboBoxTestDlg::OnCbnSelchangeCombo1()
{
wchar_tstr[1024];
memset(str, 0x00, sizeof(str));
DlgDirSelectComboBoxExW( this->m_hWnd, (LPTSTR)str, 1024, IDC_COMBO1);
AfxMessageBox(str);
}
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
>XPビジュアルスタイルを設定すると DlgDirSelectComboBoxExを呼び出した後 スタックが壊れるようです
逆アセンブルリストは…見ても判りませんでした。
# っていうか68000のアセンブラしか勉強したことない。
現象的には…OS側のバグですよねぇ。
XPどころか7でも修正されていない不具合って一体……。
# 誰もレポート上げていない…とか??
DlgDirSelectComboBoxEx自体あまり使われていないのかもしれませんね。
今回はこのAPIを使わず、自前で関数を作成します。
ありがとうございました。
No.4
- 回答日時:
XPビジュアルスタイルを設定すると DlgDirSelectComboBoxExを呼び出した後 スタックが壊れるようです
インラインアセンブラで PUSH 0などを書き加えてやると 一般保護違反は起きなくなるのですが
今度は DlgDirSelectComboBoxExが失敗して WNDが無効とか Control IDが見つからないなどのエラーになってしまいました
AnsNo3の Wr5氏の回答を参考に 自前の関数を作成してみるとか …
No.3
- 回答日時:
追加で実験してみました。
No.2はWindows7 Professional SP1 64Bitでエアロスタイル有効でしたが、
今度はWindowsXP Professional SP3で。
・クラシックスタイル+ビジュアルスタイル使用のマニュフェストなし
正常に取得できました。(表示はクラシックスタイル)
・クラシックスタイル+ビジュアルスタイル使用のマニュフェストあり
一般保護違反で落ちました。(表示はクラシックスタイル)
・ビジュアルスタイル+ビジュアルスタイル使用のマニュフェストなし
一般保護違反で落ちました。(表示はビジュアルスタイル有効)
・ビジュアルスタイル+ビジュアルスタイル使用のマニュフェストあり
一般保護違反で落ちました。(表示はビジュアルスタイル有効)
なんというか……どうにもならないって感じですな。
ディレクトリ(フォルダ)選択にはSHBrowseForFolder()とかを使用する。
というのが一般的になりつつありますので、DlgDirSelectComboBoxEx()を使用している人自体が少ないのかも知れません。
# 新たなダイアログを開く必要がない。とかそういう利点はありますけど……。
DlgDirListComboBox()が掲示のオプションの場合、最初に設定したドライブ以外のディレクトリは選択できませんし。
取得した文字列もディレクトリ名だけでドライブ名や上位のディレクトリ名も取得出来ませんから……。
取得した結果が':'で終わっていればドライブを選択された。
ということで、フィルタ文字列を変更してDlgDirListComboBox()で再設定を行えば、該当ドライブのディレクトリ一覧に更新できますが……。
選択されたのがディレクトリの場合は、別に保存しておいた上位のディレクトリ名と結合していけばパス名は構築できるでしょう。
# SHBrowseForFolder()とかの方がお手軽ですけどね。
# GetOpenFileName()をディレクトリ名取得に使う。という変則技もありでしょう。
DlgDirSelectComboBoxEx()を使用せずに、そのままコンボボックスの文字列を取得して自前で処理する。
というのも、アリと言えばアリですかね。
ディレクトリ名に'['や']'を使われていると面倒ですが。
# C:\-x- なんてディレクトリがあった場合も。
取得した文字列のディレクトリが存在するか確認して、無ければ前後の'['と']'をカット。
その後の文字列でさらにディレクトリが存在するか確認して、先頭と最後の文字が'-'だったらドライブ名が選択された。として先頭と最後の文字が'-'を削除して':'を最後に追加。
ディレクトリが存在した場合は最後に'\'を追加。
サブディレクトリの一覧を出す場合はさらに手間…ですかね。
No.2
- 回答日時:
対処方法は不明ですが…
ビジュアルスタイルにしているとDlgDirSelectComboBoxEx()API内で死ぬようです。
DLL側の問題なんでしょうかねぇ?
# ググってもちょっと見つけられませんでした。
ところで……
>DlgDirListComboBox( work.GetBuffer(), IDC_COMBO1, 0, DDL_DIRECTORY | DDL_DRIVES | DDL_EXCLUSIVE);
はCWnd::DlgDirListComboBox()で、
>DlgDirSelectComboBoxExW( this->m_hWnd, (LPTSTR)str, 1024, IDC_COMBO1);
はWin32APIを使用。
というのはちぐはぐですね。
CWnd::DlgDirSelectComboBox()を使用するべきではありませんかね?
# まぁ、いずれにしろちゃんと実行できないのですが…。
>CWnd::DlgDirSelectComboBox()を使用するべきではありませんかね?
そうですね。
ご指摘ありがとうございました。
対処方法については、もう少し調べてみます。
No.1
- 回答日時:
実際試したわけでなく、問題点の確信があるわけでもありませんが、
コードを見てここを変えてみてはどうかと思う点について回答いたします。
DlgDirListComboBox() のほうは、CWndクラスのメンバ関数を利用しており、
DlgDirSelectComboBoxExW()のほうは、Windows APIを直接利用されているようですが、
取得のほうも CWnd クラスのメンバ関数である DlgDirSelectComboBox() を
利用してみてはどうでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【PHP】declare命令で”Fatal er...
-
CFileDialogの最初のディレクト...
-
バッチを用いたフォルダの自動移動
-
makefile でファイルをコピーす...
-
FTPコマンドでディレクトリごと...
-
コマンドプロントについて
-
現在位置より2つ上のディレク...
-
fopenでファイルが開かない場合...
-
絶対パス?絶対アドレス?意味...
-
Smartyのtemplatesとtemplates_...
-
拡張子を隠すのは良い事なので...
-
DlgDirSelectComboBoxEx
-
ファイルアップロードに関して...
-
Visual C++ 2005 Express Editi...
-
PHPにて所有者名を変更出来...
-
rmdirでフォルダが消せません
-
ファイル選択ダイアログで選択...
-
バッチファイルで特定ファイル...
-
空きでないディレクトリの削除
-
Subversionで、ファイルをリネ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチを用いたフォルダの自動移動
-
CFileDialogの最初のディレクト...
-
FTPコマンドでディレクトリごと...
-
Subversionのリポジトリの削除
-
【BAT(バッチ)ファイル】Web...
-
現在位置より2つ上のディレク...
-
makefile でファイルをコピーす...
-
fopenでファイルが開かない場合...
-
MkDir関数
-
visualstudioでc#のdllができない
-
絶対パス?絶対アドレス?意味...
-
DLL のロードの順序
-
includeが出来ない訳とは?
-
VB.NET 最下位のディレクトリ名...
-
rmdirでフォルダが消せません
-
ファイル選択ダイアログで選択...
-
C言語でのディレクトリ作成につ...
-
aspのページが表示できません
-
バッチファイルで特定ファイル...
-
ディレクトリの正規表現について
おすすめ情報