• ベストアンサー

CreateFile が ERROR_PATH_NOT_FOUND のエラーになる

VC++を使っています。OSは Windows2000 です。 CreateFile で指定するファイル名をフルパスで指定し、EXEを同じ ディレクトリに置いて実行したところエラーとなり、詳細コードが ERROR_PATH_NOT_FOUND でした。 プログラムは以下のようになっています。 #define AAA "c:winnt\\system32\\AAA.log" hOpen = CreateFile( AAA, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 上記プログラムの AAA.exe を system32下に置いて実行すると、 パスが不正だと怒られてしまいます。。。 AAA.exe を別ディレクトリで実行すると、sysytem32下にちゃんと ファイルが作成されます。 AAA.exe を CreateProcess する BBB.exe を造って試しましたが、 やはり BBB.exe が system32下にあると駄目でした。 どうやらカレントディレクトリが同じだと駄目みたいです。 「"AAA.log"」とせずにフルパスとしているのは以下の理由のためです。 ・ファイルは必ず system32下に作成したい。 ・AAA.exe は必ず system32下にある。 しかし、BBB.exe が必ず system32下にあるとは限らないため、 「"AAA.log"」とした場合、BBB.exe を実行したディレクトリに 作成されてしまう。 CreateFile には今回のような制限があるのでしょうか??? #ヘルプを見る限り、書いてないです。。。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> #define AAA "c:winnt\\system32\\AAA.log の c:winnt が c:\\winnt じゃなくちゃいけない、ってんじゃないですか?

nabezo-
質問者

お礼

早速の回答ありがとうございました。 ご指摘の通りです。 私のコーディングミスです。 #恥ずかしい。。。 別ディレクトリから実行した場合、正常に動作していたため、 define は問題ないと思い込んでいました。。。 #でも、何で正常なんだろう??? #ふしぎ、ふしぎ。。。

その他の回答 (1)

noname#30727
noname#30727
回答No.2

#define AAA "c:winnt\\system32\\AAA.log"     ↓ #define AAA "c:\\winnt\\system32\\AAA.log" ではないですか?

nabezo-
質問者

お礼

早速の回答ありがとうございました。 ご指摘の通りです。 私のコーディングミスです。 #恥ずかしい。。。 別ディレクトリから実行した場合、正常に動作していたため、 define は問題ないと思い込んでいました。。。 #でも、何で正常なんだろう??? #ふしぎ、ふしぎ。。。

関連するQ&A

  • 実行時にエラーが出ます(;。;)

    hFile = CreateFile("1.txt",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL); この文章で実行時エラーが出ます。初心者なのでよろしくお願いします。 C言語です。

  • CreateFileしてからtruncate

    ファイルデータを置換するプログラムを作っています。 短い文字に置換すると、ファイルサイズは小さくなります。 ところが、今のソースではファイルサイズ小さくなりません。 「abcdefg」のテスト中の「cde」を「H」に置換すると 「abHfgxx」になってしまいます。 ・hfile = CreateFile("test.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ・読む ・置換 ・上書き ・CloseHandle(hfile); というステップです。 ・読む の直後に、text.txtを0バイトにしたいんですが、 hfileを閉じないで、Perlのtruncateのようなことはできませんか?

  • CreateFileしてもうまくいきません・・。

    シリアルポートで通信するためのプログラミングを始めたばかりなのですが、COMポートのオープンが成功しません。 以下を実行しているのですが、何が間違いでしょうか? ちなみに、PCMCIAに挿入したPCカードから通信したいと考えています。単純に"COM1"というのであっているのかも分かりません・・。 よろしくお願いします。 void CMyDlg::OnReset() { HANDLE hCom; hCom = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED NULL ); if(hCom == INVALID_HANDLE_VALUE){ MessageBox("ポートオープン失敗"); } else{ MessageBox("ポートオープン成功"); } }

  • CreateFile関数を用いたファイル作成について

    VisualC++のCreateFile関数を用いて「作成日時が1週間前であれば ファイルをリネームして保存後、以前のファイル名で 空ファイルを作成する」という処理を作っています。 (作成中の関数の抜粋) /* リネーム処理 */ ret_code = MoveFile(logfile_path, rename_path); if(ret_code == API_NG){ return(NG); } /* 以前と同じ名前でファイルを新規作成 */ hfile = CreateFile(logfile_path, GENERIC_WRITE,FILE_SHARE_WRITE, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, FILE_FLAG_NO_BUFFERING); if( hfile == INVALID_HANDLE_VALUE ) { return(NG); } CloseHandle(hfile); } return(OK); } リネームする以前と同じ名前でファイルを作成すると ファイルの作成日時がリネームする以前の作成日時になってしまいます。 (例) 4月1日に「aaa.txt」を作成→ 4月8日に「aaa_0401.txt」にリネーム後、新規に「aaa.txt」を作成すると 作成日時が「4月1日」になってしまう。 Microsoftのページによると、キャッシュファイルの情報を取得しているために 以前の作成日時にてファイルが作成されてしまうようです。 http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_createfile.htm 原因は分かったのですが、対処方法が思い浮かびません。 上記問題を解決するにはどういった方法がありますでしょうか? ご教授をよろしくお願いします。

  • CreateFile関数によるCD/DVDへの書込み方法を教えて下さい

    VCプログラムで、操作履歴情報を出力先ドライブを選択してファイルに保存する機能を作成しています。(OS:Windows-XP) CD-ROM(RW)ドライブを選択すると、以下のエラーになってしまうのですが、 正しい引数または別の方法を教えて頂けませんでしょうか。 ◆エラー ERROR_INVALID_FUNCTION(0x00000001)「ファンクションが間違っています。」 ◆引数 handle = CreateFile( "\\\\.\\E:\\HISmmdd.TXT",// ファイル名 GENERIC_WRITE, // アクセスモード FILE_SHARE_WRITE, // 共有モード NULL, // セキュリティ記述子 CREATE_ALWAYS, // 作成方法 FILE_FLAG_WRITE_THROUGH,// ファイル属性 NULL // テンプレートファイルのハンドル ) ; 以上、宜しくお願い致します!

  • Setupで「Path or File Not Found」のエラー

    ディストリビューションウィザードで作成したSetup.exeを実行すると、   「Path or File Not Found」   「次のラベルのディスクを挿入してください。'ディスク 0' ドライブ F:」 というエラーが発生します。 過去ログなどを検索していても   「ログイン名に2バイト文字を使用している」 という原因しか見つけられなかったのですが、 ログイン名は半角英数字になっています。 ログイン名が2バイト文字、ということ以外に 何か原因は考えられますでしょうか? よろしくお願い致します。

  • メール本文からの引数付の実行ファイルの起動方法

    こんにちは。 メールの本文に http://okwave.jp とあれば、ここをクリックすれば、ブラウザが開いてページが 表示されますよね。 これと同じ方法で、メール本文から引数付のアプリを起動させたいのです。 file://aaa.exe のように引数なしでは起動するのですが、 file://aaa.exe bbb のように引数をつけると ファイル "aaa.exe bbb" が見つかりません。パスまたはインターネットアドレスが正しいことを確認してください。 のようになってしまいます。 よろしくお願いいたします。

  • SMART情報

    OS:Windows7 VS2008 SP1 http://www.usefullcode.net/2007/02/hdd.htmlをみて SMART情報を取得するプログラムを書いています http://www.usefullcode.net/2007/02/hdd.htmlの下の方からプロジェクトがDLできて 試しにビルドして(通りました) 実行してみたのですが、 //OSによってCreateFile処理を変える if(sVerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { hIoCtrl = ::CreateFile(_T("\\\\.\\SMARTVSD"), 0,0,0,CREATE_NEW, 0, 0); //Windows 9x } else { CAtlString strDevice; strDevice.Format(_T("\\\\.\\PhysicalDrive%d"),nDeviceNo); hIoCtrl = ::CreateFile(strDevice,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); int Error=0; Error=GetLastError(); char DebugStr[256]; wsprintf(DebugStr,"Error=%d",Error); MessageBox(NULL,DebugStr,"File Error",MB_OK); } if(hIoCtrl == INVALID_HANDLE_VALUE) { MessageBox(NULL,"hIoCtrl == INVALID_HANDLE_VALUE Error","hIoCtrl == INVALID_HANDLE_VALUE Error",MB_OK); return false;//********ここでfalseでreturnされてしまう。********* } ここでCreateFileエラーがでてしまい(GetLastError=2です。) falseでreturnされてしまい、うまくHDD情報が取得できません。 そもそもstrDevice.Format(_T("\\\\.\\PhysicalDrive%d"),nDeviceNo);の第一引数が_T("\\\\.\\PhysicalDrive%d")と指定されていますが、 ここには何を指定すべきなのでしょうか。これが分かればできそうな気がします。

  • DeviceIoControlを使って、フロッピーをフォーマットするには?

    初めて質問します。よろしくお願いします。 フロッピーをフォーマットするDLLを作っているのですが、DeviceIoControlを使ってフロッピーを 1.44M 512バイト/セクタにフォーマットするにはどうすればいいのでしょうか? 下記のようにコーディングしてみたのですがどうもうまくいきません。 DeviceIoControlは正常終了するのですが、フォーマットした(つもり)のフロッピーをエクスプローラで読もうとすると“このボリュームは認識可能なファイルシステムではありません。”と表示されてしまいます。 エクスプローラでフォーマットした時と比べ、DeviceIoControlが動作している時間が短いのでこの他に手順が必要なのかとも思ったのですが、それらしいのは見当たらず困っています。よろしくお願いします。 hFD = CreateFile( "\\\\.\\a:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); FormatPara.MediaType = F3_1Pt44_512; FormatPara.StartCylinderNumber = 0; FormatPara.EndCylinderNumber = 79; FormatPara.StartHeadNumber = 0; FormatPara.EndHeadNumber = 1; bRet = DeviceIoControl( hFD, IOCTL_DISK_FORMAT_TRACKS, &FormatPara, sizeof(FormatPara), NULL, 0, &dwTempSize, NULL );

  • VC++のCOMのデバッグ方法について

    VC++でつくられたCOMをデバッガを使ってデバッグしたいのですが どのようにすればいいのか、よい手段がわからず困っています。 いま担当しているプログラムの作りとしては、 2つの実行可能形式ファイル(AAA.exeとBBB.exe)があって、 AAA.exeは、 単独で動かした場合は自分のクラスをレジストリ登録/解除するプログラムで それ以外にもいくつかの関数(後述のfunCCC関数やログ出力関数)を実装しています。 BBB.exeは、CoCreateInstance関数を使用してAAA.exe内のクラスのオブジェクトを作成して その中で定義されている関数(funcCCC)にアクセスしています。 AAA.exeを実行してCOMがレジストリ登録されていることは レジストリエディタで確認できていて、 また、BBB.exe内でCoCreateInstance関数が成功していることも、 funcCCCが実行されて正常で結果が戻ってきていることもプログラムの実行結果からわかります。 この状態で BBB.exeからfuncCCCをコールしたときに AAA.exeのfuncCCCにステップインしてデバッグしたいのですが このようなことは、たとえばVisualStudio(2003)のデバッグ機能でできるのでしょうか。 デバッグしたい理由としては、AAA.exeの単体テストを行うためと、 あと、AAA.exe内のログ出力関数が AAA.exeを単独で起動したとき、つまり 自分のクラスをレジストリ登録するときは正常にログ出力されているのですが BBB.exeからfuncCCCを実行したときは、 funcCCC内で同じログ出力関数をコールしているのにログが出力されていないので デバッガを使って内部でどういう状態になっているのかを確認したいのです。 ログが出力されないので MessageBox関数を埋め込んでトレースや変数の内容を確認しているのですが その結果ではAAA.exeを単独で実行したときと同じように ログ出力関数がコールされているように見えます。 また DebugBreak関数を使う方法というのを見かけたので funcCCC内でDebugBreak()を実装してみたのですが その場合は、DebugBreakのところでプログラム(BBB.exe)が終了してしまいます。 COMについて認識違いがあればご容赦下さい。 よろしくお願いいたします。

専門家に質問してみよう