コンソールアプリのFileIOフック

このQ&Aのポイント
  • コンソールアプリのFileIOフックについての質問です。Win7ProfessionalとVC++2010Expressの環境で、手持ちのC++プログラムを使用してコンソールアプリを実行させています。しかし、A.exeの中でのファイルの読み取り作業にかかる時間を短縮したいと思っています。実現する方法や参考になるウェブサイトについて教えていただけないでしょうか。
  • Win7ProfessionalとVC++2010Expressの環境でコンソールアプリのFileIOフックについて質問です。手持ちのC++プログラム(B.exe)からA.exeを実行させていますが、A.exeの中でのファイルの読み取り作業に時間がかかるため、処理時間を短縮したいと考えています。どのように実現すればよいか、また参考になるウェブサイトはありますか。
  • コンソールアプリのFileIOフックについて質問です。Win7ProfessionalとVC++2010Expressの環境で、手持ちのC++プログラムを使用してコンソールアプリを起動させています。A.exeの中でのファイルの読み取り作業に時間がかかるため、処理時間を短縮したいと考えています。どのようにすればファイルの読み込みをメモリ上で行えるようになるでしょうか。参考になるウェブサイトなどを教えていただけると助かります。
回答を見る
  • ベストアンサー

コンソールアプリのFileIOフック

環境はWin7ProfessionalとVC++2010Expressです。 市販のコンソールアプリ(A.exeとします)があります。ソースコードはありません。 実行させ,標準入力から使用する入力ファイル名の拡張子を除く部分を入力すると,その入力ファイルから必要な情報を読み取り,計算が行われます。 今は手持ちのC++プログラム(B.exeとします。ソースコードもあります。)の中でCreateProcessを用いて,A.exeを実行させています。 このときA.exeの中では,入力ファイルを開いて,ファイルの中身を読むといった作業が行われているはずですが,これをディスク上のファイルから読むのではなく,メモリから読ませたいと思っています。つまりB.exeの中でA.exeを起動される部分の前にいったんファイル出力をして,そのファイルをA.exeの入力ファイルとしているのを,何とかファイルの入出力を行わないでA.exeを実行させたいのです。 A.exeはループの中で実行させるため,FileIOにかかる時間がバカになりません。 このようなことは可能なのでしょうか? 参考になるWebSite等を紹介していただけたら幸いです。

  • f272
  • お礼率100% (8/8)

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

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

失礼致しました。 >CreateProcess 関数が返したハンドルには、プロセスオブジェクトに対する PROCESS_ALL_ACCESS アクセス権が割り当てられています。(MSDNより) との事なので、アプリケーションのサブクラス化は必要無いようです。 なので、必要な話としては、 1.メモリマップドファイルへのIO 2.モジュールのインポートセクションの操作によるAPIのフック ですね。実現性は自分で確かめてください。

f272
質問者

お礼

再度の回答をいただきありがとうございます。 いただいたキーワードをもとに検索して、適当にテストプログラムを作ってみることにします。

その他の回答 (6)

回答No.7

追加でもう一つ、自分は使った事ないけどクリップボードも便利かもしれません。

f272
質問者

お礼

回答ありがとうございます。 クリップボードはサイズが小さいというイメージがあるのですが、数百MBから数GBでも大丈夫なのかなと考えてしまいます。まあ、調べてみればわかるんでしょうけど...

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.6
f272
質問者

お礼

回答ありがとうございます。 この辺のことは初めて考えていることなので、みなさんどのようにやっているのかよくわからないのです。ご教示いただいたツールを使って何がどこまでできるのか、ちょっと遊んでみます。

回答No.4

B.exeの中でメモリマップドファイルへ書き込みを行い、 A.exeが使っているファイルIOのAPIをサブクラス化しメモリマップドファイルから読み込む様にする。 そんなこと出来るんですかね・・・。自分はやったこと無いです。 メモリマップドファイル、アプリケーションのサブクラス化、 APIのフック等を調べて見てください。 ただ、アプリケーションのサブクラス化をしようとしたことはあるのですが ウィンドウとダイアログを同一視できなかったりして、結構落とし穴は多い物 でしたので、課題リストを作って一つ一つ実現性を検証しておく必要がある かと思います。 もっとも簡単にパフォーマンスを改善する方法として、 “SSDドライブにする”というのが手っ取り早いですね。

f272
質問者

お礼

キーワードがあれば検索しやすくなります。ありがとうございました。 > 自分はやったこと無いです。 全く同じでなくても似たような実例があれば理解しやすいんですが...

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.3

>その簡単じゃないことをやりたいのですが,なにかヒントになる資料はありますでしょうか? ReadFileやReadFileExの仕様を見て「こういう処理が必要になるだろうしめんどくさそうだなぁ」と思っただけなので具体的な資料などは存じません。 WIN32 APIのファイルを扱うAPIには一通り目を通した方がよいとは思いますけど。

f272
質問者

お礼

引き続き回答していただきありがとうございます。 WIN32 APIのファイルを扱うAPIには一通り目を通した方がよいというのはその通りですね。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

ReadFile, ReadFileExやその他関係しそうなAPIをフックすればできなくはないと思いますけど簡単じゃないと思いますよ。

f272
質問者

お礼

回答していただきありがとうございます

f272
質問者

補足

その簡単じゃないことをやりたいのですが,なにかヒントになる資料はありますでしょうか?

回答No.1

メインメモリの一部をRAMDISKとして確保して、そこを使うようにしたほうが簡単じゃないかと思います。

f272
質問者

お礼

さっそくの回答をいただきありがとうございます。

f272
質問者

補足

RAMDISKを使用するのはテスト環境では簡単なのですが,実際に動作させようとしている環境は私の制御下にないため,そのような変更はできないのです。

関連するQ&A

  • VC++でコンソールアプリのパスの対応の問題

    今、VC++でコンソールアプリをやっていますが、アプリのイメージとして sample.exe -f C:\a.txt -d のコマンドで、C:\a.txtのファイルを削除し、 sample.exe -f C:\a.txt -s で、ファイルをコンソールに表示するようにしたいですが、問題は指定されたパスの問題ですが、内部でファイルのfopenとか、removeとは、C:\\a.txtしないといけないようですが、 コマンドから入力したパスに対する処理は、どうすればよろしいでしょうか?よろしくお願いします。

  • visual studio 2005 VB のコンソールアプリに関して

    やりたいこと: exeファイルを作成する。 そのexeファイルをダブルクリックすると、 コンソールが表示され、1,2,3,4,・・・・と表示を続ける。 キーボードの"q"が入力されると表示が停止する。 下記のソースコードで、コンソールが表示、1,2,3,4,・・・と表示、まではできたようです。 //////////////////// Module Module1 Sub Main() Dim number As Integer number = 1 Do Console.WriteLine(number) number = number + 1 Loop End Sub End Module //////////////////// できたというのは、VisualStudio上でF5キーを押してうまくいった、 ということです。 あとは、  ・キーボードの"q"の入力受付&停止処理  ・exeファイルを作成する ですが、コンソールアプリの情報がなかなかWEBから手に入りません。 有識者の方、ご教授いただけませんでしょうか。 プログラミング経験は、 PHPを半年ほどやっているだけです。 よろしくお願いします。 以上

  • コンソールアプリの入出力制御

    早速ですが、質問させていただきます。 現在、CUIのコンソールアプリケーションをキーボードの入力より、メニューの制御などを行っています。 コンソールアプリケーションは以下のようなメニュー・設定 などが表示され、それぞれ、キーボードより選択を行う形となっております。 ==== Menu ===== 1.test1 2.test2 3.test3 > テスト番号を入力してください: 上記のような入力がいたるところに存在し、大変手間となっております。 そこで、外部のソフトから、本コンソールアプリの入出力制御が出来ればと考えております。 この場合、バッチファイルなどでコンソールアプリへの制御が可能なのでしょうか?

  • Eclipseのコンソールを常に表示させておきたい。

    Eclipseでプログラムを実行すると、結果がコンソールに出る場合は、コンソールが出てそこに結果が出力されると思うのですが、出力された後に、ソースコードの部分をクリックするとコンソールが閉じてしまいます。 常に出しておく方法はあるでしょうか?

    • ベストアンサー
    • Java
  • コンソール

    実行ファイル(abc.exe)を実行した時に出るコンソール画面を非表示にすることは出来ますか? ちなみにC++言語を使っていて、cygwinでコンパイルしています。どなたか宜しくお願いします。

  • VC++(VS)でコンソールアプリ(複数ファイルからなる)を作成したい

    マイクロソフト社のVC++(Visual Studio 2008)で コンソールアプリケーションを作成しようとしております。 ファイルは複数ファイルからなり、 mainprogram.cpp -> 実行ファイル(mainprogram.exe) subprogram1.cpp -> オブジェクトファイル(subprogram1.obj) subprogram2.cpp -> オブジェクトファイル(subprogram2.obj) ・・・以下続く のように 1)サブプログラムをobjファイルとしてコンパイル 2)メインプログラムをコンパイルしてobjファイルとリンクし、   実行ファイルを作成する というような作業を行いたいと考えております。 以前はLinuxの環境でg++、makeを利用して このような構成のコンソールアプリケーションを作成しておりました。 が、VCに移行するに当り、どのようにプロジェクトファイル等を 構成して良いか分からず、出だしでつまづいております。 VCにもコマンドラインでコンパイルする方法 (cl, nmakeを使うんでしょうか。。。)があるみたいですが、 これらの手法について書かれている 書籍、サイト等を探すことが出来ないでおります。 VCに関して、このような使用法に対する解説がなされている書籍、 もしくはサイト等をお教え願えませんでしょうか? 宜しくお願い申し上げます。

  • CreateProcessでコンソールアプリケーションを起動するには

    コンソールアプリケーションの中で、CreateProcess関数を用いて、自分自身のアプリケーションを起動したところ、次の結果になりました。 ・CreateProcess関数自体は成功する ・タスクマネージャで確認すると自分自身が2つ起動されている ただし、コンソールアプリケーションのウィンドウは1つしか開かず、そのウィンドウを2つのアプリケーションで共有しているかのように動作します(printfによるメッセージが2重に表示されるなど)。 使用言語はVC++ .NET 2008で、デバッガによる動作をさせています。 詳しい方、宜しくお願いします。

  • バッチファイル、別窓でコンソールアプリを実行する方法

    バッチファイルの中で、コンソールアプリを呼びたいのですが、 それを別窓で実行するようにしたいです。 call abc.exe や cmd abc.exe 等やってみたのですが、新たに窓は開いてくれませんでした。 どうか、おわかりになる方、よろしくお願いいたします。

  • createprocessで起動させる別.exeをモーダルで起動したい

    createprocessで起動させる別.exeをモーダルで起動したい お世話になります。 VC++6.0 MFCで開発しております。 現在A.exeのあるボタンを押すとcreateprocessでB.exeを起動させるようにしております。 B.exeを起動後、A.exeの画面表示をクリックするとA.exeがアクティブになるのです。 それを、B.exeが終了しないとA.exeがアクティブにならないように変更したいのですがどのようにすればよいでしょうか? 現状は PROCESS_INFORMATION pi; STARTUPINFO si; si.cb=sizeof(si); CreateProcess(実行EXEパス,コマンドライン,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); で起動しております。 また、実現不可能というお答えでもいいので教えていただければと思います。 お手数ですが何卒よろしくお願いします。

  • VC++コンソールアプリでのインスタンスハンドルの取得

    VC++コンソールアプリでのインスタンスハンドルの取得 VC++コンソールアプリケーションでインスタンスハンドルを取得しようとしているのですが、 HINSTANCE hi = (HINSTANCE)GetWindowLong(HWND_DESKTOP, GWL_HINSTANCE); を実行すると、NULLが戻ってきます。 どこかまずい部分があるのでしょうか。 なお、第一引数のウィンドウハンドルは不明なため、 いくつかのWebサイトに習い、HWND_DESKTOPを指定しました。

専門家に質問してみよう