3

これはおそらくロングショットですが、とにかく聞いてみようと思いました. ドキュメント管理システムの API を使用しています。これらは、特定のドキュメントをディスクに保存するための「WriteFile」メソッドを提供します。ただし、ライブラリには、ドキュメントをメモリに単純に読み込む方法がありません。私の唯一の選択肢は、ディスクに書き込んでから再度読み込むことです。この明らかな制限を回避するためのより良い方法があるかどうか疑問に思っています。

このメソッドは、結果のファイル パスの文字列を受け取ります。メソッドの署名:

void ImageInfo.WriteFile(string Filename);
4

3 に答える 3

3

理論的には、.NET や C++ など、任意のプロセスの WriteFile win32 API 呼び出しをインターセプトすることが可能です。インポート アドレス テーブル フックと呼ばれるものを使用します。これは、実際には Windows でのソフトウェア テストの貴重なツールです。

基本的に、インポート アドレス テーブルの WriteFile,kernel32.dll エントリを上書きしてメソッドを指定し、書き込みを試みたバイトをインターセプトすることができます。

上記のレイヤーにはおそらく他の方法があります。.NET では、サードパーティ アプリ dll の ILASM コードを変更できる可能性があります。または、標準の .NET クラスの一部を置き換える独自のバージョンの .NET dll を用意してください。

たとえば、API が明示的にファイルをディスクにフラッシュしない場合、その後の読み取りは OS ファイル キャッシュから行われる可能性があり、それほど大きなパフォーマンスの問題にはなりません。ファイルを作成し、WriteFile を呼び出す前に開いたままにしておくことで、おそらくこれを実現できます (単なる推測です)。

もちろん、すでにプロファイリングと測定を行っていると思います。

于 2010-05-27T17:07:58.747 に答える
2

マネージ コードのコールバックを呼び出すことができる Windows API フック ライブラリが必要です。 Easyhookはそのようなライブラリの 1 つです。ファイル システム キャッシュは、ファイル データへの直接メモリ アクセスを既に提供しています。

于 2010-05-27T17:10:30.673 に答える
0

APIは、.NET Frameworkですでに利用可能な方法よりも優れた(よりパフォーマンスの高い)方法を提供できないため、読み取り部分を提供していないようです。

于 2010-05-27T16:44:58.127 に答える