ファイルオープンダイアログが呼び出されない

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
解散総選挙

ファイルオープンダイアログが呼び出されない

#1 投稿記事 by 解散総選挙 »

 Win32プログラミング講座Step8構造体とファイルオープンダイアログhttp://www.activebasic.com/help_center/index.html?win32の「OPENFILENAME構造体とGetOpenFileName関数」に掲載されているサンプルを実行したところ、ダイアログが表示されません。
 「If GetOpenFileName(ofn)=0 Then」の行でステップインを実行しても、GetOpenFileNameの中に入っていかずに、ExitProcess(0)に行ってしまいます。
 buffer=ZeroString(MAX_PATH)はコンパイルでエラーになったので、buffer=String$(MAX_PATH,"0")に書き換えました。
 ActiveBasic5.0.0.5、WindowXPHomeSP3です。よろしくお願いいたします。

コード: 全て選択


Dim ofn As OPENFILENAME
Dim FileFilter As String
Dim buffer As String

'OPENFILENAME構造体の初期化
FillMemory(VarPtr(ofn),Len(ofn),0)
ofn.lStructSize=Len(ofn)                '構造体のサイズ
ofn.hwndOwner=GetDesktopWindow()        '親ウィンドウ(ここではデスクトップ ウィンドウを指定)
FileFilter="テキスト ファイル(*.txt)" + Chr$(0) + "*.txt" + Chr$(0) + _
                "すべてのファイル(*.*)" + Chr$(0) + "*" + Chr$(0)
ofn.lpstrFilter=StrPtr(FileFilter)
ofn.nFilterIndex=1                      'ファイル フィルターの数
'buffer=ZeroString(MAX_PATH)             'パスを格納するための文字列バッファを確保
buffer=String$(MAX_PATH,"0")             'パスを格納するための文字列バッファを確保
ofn.lpstrFile=StrPtr(buffer)
ofn.nMaxFile=MAX_PATH                   'バッファのバイト数
ofn.lpstrTitle="ファイルを開く"         'タイトル
ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST

'「ファイルを開く」ダイアログ ボックスを表示
If GetOpenFileName(ofn)=0 Then
	'キャンセル ボタンが押されたとき(プロセス終了)
	ExitProcess(0)
End If

MessageBox(0,ofn.lpstrFile,"選択されたファイルのパス",MB_OK)

'プロセス終了
ExitProcess(0)
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

buffer = String$(MAX_PATH, Ex"\0")とすると動きました。String$にEx"\0"とするのが真にZeroStringと等しいです。
String$(MAX_PATH, "0")だと"00000000000000000000..."という文字列になり,そんな名前のファイルがないということでエラーになったのではないかと思います。

ところで,ZeroStringがエラーになるということですが,次のCPか何かではAB4で可能だった(今回のような)使い方ができるように戻そうかなと考えています。そのほうがAB4との互換性が保てますし。

あと,ofn.hwndOwnerはGetDesktopWindow()ではなく,単に0で十分です。むしろそっちのほうが好ましいです。
解散総選挙

#3 投稿記事 by 解散総選挙 »

 ありがとうございます。
 buffer = String$(MAX_PATH, Ex"\0")、ofn.hwndOwner=0にして、
If GetOpenFileName(ofn)=0 Thenの行でステップオーバーすると、
デバッグウィンドウで
例外処理(code:&H000006BA)
スレッド(&HF04)でアクセス違反がありました(EIP=&H77E6078A/ESP=&H0012E070)。
と表示され、
「"File.ab"が見つかりません。格納されているディレクトリを指定してください」というダイアログが出現しました。
解散総選挙

#4 投稿記事 by 解散総選挙 »

File.abというファイルを探したところ、ライブラリーの中にあったので、そのディレクトリを指定したところ、ファイルオープンダイアログは呼び出されず、
例外処理(code:&H000006BA)
スレッド(&H168)でアクセス違反がありました(EIP=&H77E6078A/ESP=&H0012FB9C)。

がデバッグウィンドウに表示されました。よろしくお願いいたします。
返信する