ファイルを開くダイアログ使用後にファイルが開けない – プログラミング – Home

ファイルを開くダイアログ使用後にファイ...
 
通知
すべてクリア

[解決済] ファイルを開くダイアログ使用後にファイルが開けない


ウニコード
 ウニコード
(@ウニコード)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

環境 VS2005 SDK

現在GetOpenFileName使用後にファイルが開けないという症状に
悩まされています。

具体的にはGetOpenFileNameが成功すると後続でCreateFileが
失敗するという現象です。

ただ後にGetOpenFileNameで開いた場合は成功するようです。
以下に該当部分をあげます。

まず
OPENFILENAME ofn = {0};
static TCHAR strFile[256];
static TCHAR FileTitle[256];
HANDLE hFile;

ofn.lStructSize = sizeof (OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = TEXT(All files (*.*)\0*.*\0\0);
ofn.lpstrFile = strFile;
ofn.lpstrFileTitle = FileTitle;
ofn.nMaxFile = sizeof(strFile);
ofn.nMaxFileTitle = sizeof(FileTitle);
ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
GetOpenFileName(&ofn);
hFile= CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ , NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if(hFile==INVALID_HANDLE_VALUE){return 1;}

CreateFile(strFile, GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL );
CloseHandle(hFile);
としてファイルを開き閉じます。
その後に
hFile = CreateFile(TEXT(test.txt), GENERIC_READ, FILE_SHARE_READ , NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile == INVALID_HANDLE_VALUE){return 1;}
CloseHandle(hFile);
とするとtest.txtのファイルがまったく開けない。
GetOpenFileNameが失敗したらtest.txtが正常に開けるというところから
GetOpenFileNameが関係しているようなのは分かりましたが
原因は分からない状況です。またGetOpenFileNameを再設定し
後続のtest.txtファイルを開いた場合はうまくいきますが、
やはりCreateFile(strFile, ~のstrFile部分をTEXT(test.txt)のように
ファイルへのパスを記述した場合は失敗してしまいます。

あとWindows XP SP2 + Adobe Reader 7でファイルを開くダイアログが
正常に機能しないバグにはすでに遭遇したためAdobe Reader 7は削除してあります。


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 21年前
投稿: 320
 

CreateFileの失敗時にはGetLastErrorで原因が取得可能ですが,どうなっていますか?


返信引用
ウニコード
 ウニコード
(@ウニコード)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

DWORD a0;
TCHAR a1[128]={0};
//
//~
hFile = CreateFile(TEXT(test.txt), GENERIC_READ, FILE_SHARE_READ , NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile == INVALID_HANDLE_VALUE){
a0=GetLastError();
wsprintf(a1, TEXT(%d) ,a0);
MessageBox(NULL , a1,TEXT(メッセージ) , MB_OK);
return 1;
}
のようにGetLastErrorを使用した所、数字の2が帰ってきました。
Error.hを調べてみたところERROR_FILE_NOT_FOUNDと記述してありました。


返信引用
isshi
 isshi
(@isshi)
ゲスト
結合: 20年前
投稿: 41
 

>hFile = CreateFile(TEXT(test.txt), GENERIC_READ, FILE_SHARE_READ , NULL,
フルパスで指定してもだめですか?

GetOpenFileName に成功すると、カレントディレクトリが変更されます。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

単に、GetOpenFileNameを使ったときにカレントディレクトリが移動してしまうから
今までフルパスして出でなくても動いていたものが動かないようになっただけでしょ
う。

対策としては、

・test.txtフルパス指定に変える

exeから相対的に見えるファイルであれば、GetModuleFileName からパスを作成する。
もしくは、カレントディレクトリをGetOpenFileNameの前に覚えておいて
そこからフルパスを作成する。
それができなければべた書きにする。
(べた書きにもiniファイルやレジストリ等を使っておくとよいかな)

・カレントディレクトリを元に戻す

カレントディレクトリをGetOpenFileNameの前に覚えておいて
SetCurrentDirectoryで元に戻す

・GetOpenFileNameでカレントディレクトリが移動しないようにする

OPENFILENAME構造体のFlagにOFN_NOCHANGEDIRを追加する。

・test.txtをパスが通っているディレクトリに置く(システムフォルダ)

のいずれかになるでしょう。


返信引用
ウニコード
 ウニコード
(@ウニコード)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

■isshiさん
 
情報提供ありがとうございます。
指摘されたようにGetOpenFileNameでカレントディレクトリの
移動が原因だったようです。

■Blueさん

>OPENFILENAME構造体のFlagにOFN_NOCHANGEDIRを追加する。
でうまくいきました。
多数の解決法の情報提供に感謝します。


返信引用
補足
 補足
(@補足)
ゲスト
結合: 20年前
投稿: 4
 

>GetOpenFileName に成功すると、カレントディレクトリが変更されます。
GetOpenFileNameのカレントディレクトリ変更動作ですが、ダイアログ開いている
最中で既に変更されていたりします。
マルチスレッドのときには注意が必要だったりします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました