WinAPIでのファイル操作について

このQ&Aのポイント
  • WinAPIを使用したファイル操作について学んでいます。
  • 特定の参考書やWebサイトを参考にしていますが、ファイル作成のソースを実行するとエラーが発生します。
  • 他のソースも同様にファイル操作に失敗することがあります。
回答を見る
  • ベストアンサー

WinAPIでのファイル操作について教えて下さい。

現在参考書やwebサイトと参考にWindowsプログラミングを学んでいます。 下記のサイトにあるファイル作成のソースをコンパイルして実行したのですが http://wisdom.sakura.ne.jp/system/winapi/win32/win111.html #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { HANDLE hFile; hFile = CreateFile( lpCmdLine , GENERIC_READ , 0 , NULL , CREATE_NEW , FILE_ATTRIBUTE_NORMAL , NULL ); if (hFile == INVALID_HANDLE_VALUE) { MessageBox( NULL , TEXT("ファイルを作成できません") , TEXT("エラー") , MB_OK ); return 1; } CloseHandle(hFile); return 0; } コンパイルは成功するのですが実行すると必ずエラーになります。 他のソースも同様にファイル操作に失敗した場合の表示が行われます。 自分が持っている参考書にはファイル操作についてあまり詳しく書かれていないので他のソースも試せません。 どなたか教えて下さいよろしくお願いします。

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

  • ベストアンサー
回答No.2

#1です。 >hFile = CreateFile()内のlpCmdLine を"ファイル名.txt"にしたらできました。 ここで言う"lpCmdLine"とは、プロセスを起動する際の引数の事です。 > int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , > PSTR lpCmdLine , int nCmdShow) { の3つ目の"PSTR lpCmdLine"変数で、ここに引数が渡されてプロセスが始まります。 よって、このプロセスを起動する際に"hoge.exe ファイル名.txt"とすれば、 "ファイル名.txt"を作成する事になります。 ただし、このソースでは引数のチェックがされていない為、引数無しで起動された場合にはCreateFile()の第一引数(作成するファイル名)が空になり、 ここでエラーが発生します。 (前述したGetLastError()とFormatMessage()を使った場合、「指定されたパスが見つかりません。」と出たはずです。) arukanoidさんの行った変更では、lpCmdLineから"ファイル名.txt"に書き換えた事で、 引数を与えずに実行した場合でも失敗しなくなったのでしょう。

arukanoid
質問者

お礼

説明ありがとうございました。 また質問してるのを見かけた時はよろしくお願いします。

その他の回答 (1)

回答No.1

エラーとはどういったものでしょう?実行の失敗ですか?CreateFile()が失敗してMessageBox()が出る状態ですか? 実行の失敗の場合、どんなエラーメッセージが出力されていますか? CreateFile()に失敗する場合、CreateFile()の失敗の原因は調べましたか? GetLastError()とFormatMessage()を使ってみてください。

arukanoid
質問者

補足

即レスありがとうございます。 失敗した場合はファイル作成に失敗してメッセージボックスが出る状態です。 すみません作成できました。 hFile = CreateFile()内のlpCmdLine を"ファイル名.txt"にしたらできました。 普通の場合はlpCmdLineでも作成できるのでしょうか?

関連するQ&A

  • lpCmdLineについて

    #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL , lpCmdLine , TEXT("Kitty") , MB_ICONINFORMATION); return 0; } とやったのですが、lpCmdLineのパスが表示されません。なぜでしょうか?

  • exeファイルにドラッグすることで動作するプログラム再質問

    前回、exeファイルにドラッグすることで動作するプログラムというタイトルで質問したものです。いといろやっていたら上手くいったと勘違いし、質問を締め切ってしまいました。実は上手くいっておらず、再度質問させていただきます。お手数をお掛けし申し訳ございませんが宜しくお願い申し上げます。 現在上手くいかないプログラムは以下のようなものです(具体的処理は省いています) #include <windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ HANDLE hfile; hfile = CreateFile(lpCmdLine,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL); if(hfile == INVALID_HANDLE_VALUE){ MessageBox(NULL,_T("error"),NULL,MB_OK); return false; } //ここで処理をします(今回は省略させていただきました) return 0; } このプログラムのexeファイルのアイコンにデータファイルをドラッグし、処理を行いたいのですが、データファイル名に日本語が含まれると hfile が INVALID_HANDLE_VALUEとなります。 データファイル名が英字のみの場合は上手くいきます。文字セットはUnicode文字セットを使用しています。 どなたかご教授お願い申し上げます。

  • EXEでMessageBoxを作る方法

    Microsoft visual c++でメッセージボックスを作りました。 それをEXEの形にしたいのですが、どうすれば良いのでしょうか? 詳しく教えていただけるととても助かります。 ちなみに下記がVisual c++で作ったメッセージボックスのソースです。 #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL , TEXT("how are you?") , TEXT("メッセージボックス") , MB_OK); return 0; }

  • C++BuilderでHelloWorld

     『プログラミングWindows』に載っている以下のコードをC++Builder6で実行するにはどうすればいいですか? #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("Hello, Windows 98!"), TEXT("HelloMsg"), 0); return 0; }

  • 【Windowsアプリ】ファイルのドラッグ&ドロップについて

    C言語でのWindowsアプリの勉強をしています。(始めたばかりです) ***.exeにファイルをD&Dした際、 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 上記の"lpCmdLine"にファイルパスが入るのはわかったのですが、別のファイルパスの取得方法として、 1.***.exeを実行 2.ウィンドウ表示 3.ウィンドウ内にファイルをD&D 4.ファイルパスを取得 の方法がわかりません。 DragAcceptFiles()や、DragQueryFile()を使うと思うのですが、WinAPIの使い方がいまいち良くわかっていない状況です。 自分で勉強するべきというのは承知の上でのお願いしたいのですが、どなたか出来ればサンプルソースなど教えて頂けるとうれしいです。 環境はテキストエディタでソースを作成→Borland C++ Compiler 5.5でコンパイルしています。

  • ファイル名の半角スペースについて

    前回、exeファイルにドラッグすることで動作するプログラム再質問 をした者です。本当に何度もすみません。 前回から調べた結果「ファイル名に日本語を指定したとき」ではなく、「ファイル名に半角スペースを指定したとき」上手くいかないということが解りました。  DOSでは半角スペースが区切り記号になってしまうことが影響しているのでしょうか?  一般的にデスクトップにデータファイルを作成すると「Documents and Settings」の下部におかれます。この場合、どうしても半角スペースを含んでしまいます。しかし、MicroSoftWordでは、デスクトップにおかれた名前に半角スペースを含むdocファイルをWORD.exeのアイコン上にドラッグすることでファイルを開くことができます。と言うことは何か解決策があるはずなのですが・・・・・・  お手数をお掛けして申し訳ございませんが、何卒宜しくお願い申し上げます。参考のためにソースプログラムを載せておきます。 #include <windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ HANDLE hfile; hfile = CreateFile(lpCmdLine,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL); if(hfile == INVALID_HANDLE_VALUE){ MessageBox(NULL,_T("error"),NULL,MB_OK); return false; } //ここで処理をします(今回は省略させていただきました) return 0; } 開発環境はVisualC++2008ExpressEditionです。 このプログラムをビルド後、exeファイル上に 「a a」のように半角スペースを含むファイルをドラッグするとerrorになります。

  • WinAPIでの画像高速切り替え表示プログラム2

    1の続きです。これを先に見た方は1から見てください。 お願いします。 int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__," ", WS_POPUP | WS_VISIBLE, 0,0, 1024,768, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; // タイマを作成する SetTimer( hWnd, TIMER_ID, TIMER_ELAPSE, NULL ); BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } // タイマを破棄する KillTimer( hWnd, TIMER_ID ); return (int)msg.wParam; } 2つに分かれてしまって申し訳ありません。 よろしくお願いします。

  • HINSTANCEの型

    LPSTR は char* なので、 int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , LPSTR lpCmdLine ,int nCmdShow ) を int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , char* lpCmdLine ,int nCmdShow ) と書き換えてもコンパイルできます。 HINSTANCEはvoid *型だという記述を見たのですが、void *で書き換えてもエラーがでてしまいます。 どうしたらよいのでしょうか。

  • BccDeveloperでコマンドラインの引数を拾えない

    最近、新しいWindows XPマシンにBorland C++5.5とBcc Developerをインストールしました。 以下のような簡単なプログラムを入れて、コマンドラインの引数を拾えるかチェックしたのですが、長さ0の文字列が帰ってきてしまいます。 不思議なことに、TurboDebuggerだとうまく引数が拾えます。 実行ファイルを直接に実行すると拾えるので、BccDeveloperが実行する際に引数を渡していないように思います。 どなたか、原因として思いつく方はいらっしゃいますか? よろしくお願いいたします。 #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { MessageBox(HWND_DESKTOP, lpCmdLine, "Command Line", MB_OK); return 0L; }

  • VS2010 C++ エラーについて

    Visual Studio2010のC++を使用しているのですが、DLLにメッセージボックスを使用したいと思っています。 .cppに #include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance , LPSTR lpCmdLine, int cmdShow) { MessageBox(NULL,"○○○","△△△",MB_OK); return 0; } 上記のようなソースコードを使って見ると、○○○と△△△の部分でエラーを吐きます。 どのようにすれば改善されるか教えてください。

専門家に質問してみよう