少し前に、ファイル選択ダイアログの使い方について質問し、
教えてもらったのですが、その時、
詳しく説明してくださっているサイトを紹介してもらいました。
少し見て理解できるかな?と思い解決にしてしまったのですが、
全然何とかなりませんでした、自分が甘かったです。
GetOpenFileName()を使うのは分かったのですが、
OPENFILENAME構造体が良く分かりません。
とりあえずサイトを参考にして書いてみたのですが、構造体の理解が足りないと思います。
とりあえずエラーを載せておきます。
error C2664: 'GetOpenFileNameW' : 1 番目の引数を 'OPENFILENAME' から 'LPOPENFILENAMEW' に変換できません。
どのようなエラーなのでしょう?構造体の宣言を間違えたのでしょうか?
よろしくお願いします。
ファイルの取得? 2
Re:ファイルの取得? 2
関数にOPENFILENAME構造体へのポインタを渡さなければならないのに、
OPENFILENAME構造体そのものを渡していませんか?
OPENFILENAME構造体そのものを渡していませんか?
OPENFILENAME ofn; GetOpenFileName( &ofn ); // OK GetOpenFileName( ofn ); // NG
Re:ファイルの取得? 2
ぽこさん、ありがとうございました。
エラーはなくなりとりあえず実行出来ました。
ダイアログが出るかどうかのテストで作ってデバッグで実行してみたのですが、
一瞬コマンドプロンプト?が出て閉じてしまいました。
ソースは、ほぼダイアログを表示するところと、その初期化情報のところ
くらいしか書いていません。これだけではだめなんですかね?
あとlpstrTitleとかって、文字列を入れるんじゃないんですかね?
ofn.lpstrTitle = "開く"
とかでエラーが出るのですが、どうしたら?
そもそも構造体がどうなっているのか良く分からないのですが……
良く分からない質問ですいません。
エラーはなくなりとりあえず実行出来ました。
ダイアログが出るかどうかのテストで作ってデバッグで実行してみたのですが、
一瞬コマンドプロンプト?が出て閉じてしまいました。
ソースは、ほぼダイアログを表示するところと、その初期化情報のところ
くらいしか書いていません。これだけではだめなんですかね?
あとlpstrTitleとかって、文字列を入れるんじゃないんですかね?
ofn.lpstrTitle = "開く"
とかでエラーが出るのですが、どうしたら?
そもそも構造体がどうなっているのか良く分からないのですが……
良く分からない質問ですいません。
Re:ファイルの取得? 2
> ダイアログが出るかどうかのテストで作ってデバッグで実行してみたのですが、
> 一瞬コマンドプロンプト?が出て閉じてしまいました。
> ソースは、ほぼダイアログを表示するところと、その初期化情報のところ
> くらいしか書いていません。これだけではだめなんですかね?
おそらく,ダイアログを開くことに失敗したのでしょう。
GetOpenFileName APIの戻り値を検証してください。
戻り値が0であるならば,エラーです。
CommDlgExtendedError APIを呼び出して,エラー原因を調べてみてください。
MSDN: GetOpenFileName Function ()
http://msdn.microsoft.com/en-us/library/ms646927.aspx
MSDN: CommDlgExtendedError Function ()
http://msdn.microsoft.com/en-us/library/ms646916.aspx
> あとlpstrTitleとかって、文字列を入れるんじゃないんですかね?
> ofn.lpstrTitle = "開く"
> とかでエラーが出るのですが、どうしたら?
lpstrTitleはLPCTSTR型,つまりconst TCHAR *型なので,
・UNICODEマクロが定義されていない場合はconst char *型
・UNICODEマクロが定義されている場合はconst wchar_t *型
を渡す必要があります。
ただし,Windows API関連で文字定数や文字列リテラルを使う場合は,
・charではなくTCHARを使う
・文字定数・文字列リテラルはTEXTマクロを使う
ことで,UNICODEを気にせず組むことが (ある程度) できます。
例示のコードは,
ofn.lpstrTitle = TEXT("開く");
のようになります。
なお,公式の資料はここになります。
MSDN: Unicode and Character Sets (Windows)
http://msdn.microsoft.com/en-us/library/dd374083.aspx
> そもそも構造体がどうなっているのか良く分からないのですが……
MSDNに載っていますよ。
MSDN: OPENFILENAME Structure ()
http://msdn.microsoft.com/en-us/library/ms646839.aspx
> 一瞬コマンドプロンプト?が出て閉じてしまいました。
> ソースは、ほぼダイアログを表示するところと、その初期化情報のところ
> くらいしか書いていません。これだけではだめなんですかね?
おそらく,ダイアログを開くことに失敗したのでしょう。
GetOpenFileName APIの戻り値を検証してください。
戻り値が0であるならば,エラーです。
CommDlgExtendedError APIを呼び出して,エラー原因を調べてみてください。
MSDN: GetOpenFileName Function ()
http://msdn.microsoft.com/en-us/library/ms646927.aspx
MSDN: CommDlgExtendedError Function ()
http://msdn.microsoft.com/en-us/library/ms646916.aspx
> あとlpstrTitleとかって、文字列を入れるんじゃないんですかね?
> ofn.lpstrTitle = "開く"
> とかでエラーが出るのですが、どうしたら?
lpstrTitleはLPCTSTR型,つまりconst TCHAR *型なので,
・UNICODEマクロが定義されていない場合はconst char *型
・UNICODEマクロが定義されている場合はconst wchar_t *型
を渡す必要があります。
ただし,Windows API関連で文字定数や文字列リテラルを使う場合は,
・charではなくTCHARを使う
・文字定数・文字列リテラルはTEXTマクロを使う
ことで,UNICODEを気にせず組むことが (ある程度) できます。
例示のコードは,
ofn.lpstrTitle = TEXT("開く");
のようになります。
なお,公式の資料はここになります。
MSDN: Unicode and Character Sets (Windows)
http://msdn.microsoft.com/en-us/library/dd374083.aspx
> そもそも構造体がどうなっているのか良く分からないのですが……
MSDNに載っていますよ。
MSDN: OPENFILENAME Structure ()
http://msdn.microsoft.com/en-us/library/ms646839.aspx
Re:ファイルの取得? 2
YuOさん、回答ありがとうございます。
どうやらエラーのようです。
それで、CommDlgExtendedError APIが、コモンダイアログボックスのエラーを調べるもの
なのは調べて分かったのですが、使い方が良く分からなくて……
文字列の方は、コンパイルの方のエラーはなくなりました。
ダイアログがエラーなので確かめようがないのですが…。
URLの方も見てみたのですが、英語でわけが分からず……。
翻訳サイトを使って少しづつ理解していきたいと思います。
どうやらエラーのようです。
それで、CommDlgExtendedError APIが、コモンダイアログボックスのエラーを調べるもの
なのは調べて分かったのですが、使い方が良く分からなくて……
文字列の方は、コンパイルの方のエラーはなくなりました。
ダイアログがエラーなので確かめようがないのですが…。
URLの方も見てみたのですが、英語でわけが分からず……。
翻訳サイトを使って少しづつ理解していきたいと思います。