0

プロセスメモリを読み取り、そのプロセスから情報を取得する操作を実行するライブラリを作成しています。

私が抱えている問題は、関数を呼び出すには、値が変更されていなくても、毎回多くの変数を渡す必要があることです。

たとえば、ReadProcessMemory渡す必要があります。

  • プロセス ハンドル
  • メモリアドレス
  • メイン モジュールのベース アドレス
  • 読み取るバイト数

読み取りごとに変更されるのはメモリ アドレスだけなので、関数を呼び出すたびに残りの変数を渡す必要はありません (実際には、この方法で削減できる 3 つの関数があり、すぐにもっと増えるかもしれません)。

これについてどうすればいいのか、簡単な説明を誰かに教えてもらえますか? 実行時に変数が存在するので、関数を呼び出して DLL ファイルから直接使用できますか?

4

4 に答える 4

2

オプションのパラメーターを使用してメソッドを呼び出すときに、名前付きパラメーターを使用できます。

public void MyMethod(string s = null, int i = 0, MyType t = null)
{ 
    /* body */ 
}

次のように呼び出します。

MyMethod(i: 10, t: new MyType());
MyMethod("abc");
MyMethod("abc", t: new MyType());

または、オーバーロードを使用することもできます。

public void MyMethod(string s)
{
    MyMethod(s, 0, null);
}
public void MyMethod(int i)
{
    MyMethod(null, i, null);
}
public void MyMethod(MyType t)
{
    MyMethod(null, 0, t);
}
public void MyMethod(string s = null, int i = 0, MyType t = null)
{ 
    /* body */ 
}

さらに別のオプションは、次のようにパラメーター クラスを使用することです。

public class MyParametersClass
{
    public string s { get; set; }
    public int i { get; set; }
    public MyType t { get;set; }

    public MyParametersClass()
    {
        // set defaults
        s = null;
        i = 0;
        MyType = null;
    }
}

public void MyMethod(MyParametersClass c)
{ 
    /* body */ 
}

次のように呼び出します。

MyMethod(new MyParametersClass 
{
    i = 25,
    t = new MyType()
});

parameters クラスを使用することは、おそらく推奨されるアプローチです。パラメータクラスは、処理しているものを処理するときに持ち運ぶことができます。:) それに加えられた変更は失われません...

var parameters = new MyParametersClass();
MyMethod(parameters);
parameters.i = 26;
MyMethod(parameters);
于 2013-01-18T23:17:06.743 に答える
1

このためのラッパークラスを作成します...変数を「新しいもの(...)」のプロパティまたはパラメーターとして設定し、その後の呼び出しはthing.Read(MemoryAddress)です

于 2013-01-18T23:21:00.043 に答える
1

名前付きパラメーターを使用することに加えて、変更されない値を何らかの形でライブラリに保存する必要があります。

これらが単なるランタイム変数である場合は、クラス変数 (ライブラリがクラスの場合) または静的変数 (そうでない場合) を使用できます。ただし、これは、ライブラリがシステムの状態を保存していることを意味し、すべての呼び出しで状態がまだ有効であることを確認する必要があります。

各呼び出しで値を渡すように要求することは、実際にははるかにクリーンなインターフェイスであり、ライブラリのユーザーは一貫した方法で作業する必要があります。

于 2013-01-18T23:21:31.863 に答える
1

1 つの方法は、メソッド呼び出しをオブジェクトに変換し、そのようなオブジェクトに引数をキャッシュすることです。「メソッドオブジェクト」へのリファクタリングと呼ばれます。

おおよそのサンプル (Tx - いくつかのタイプがあります):

 int My.ReadProcessMemory(T1 a1, T2 a2, T3 variable)
 {...}


 class ReadProcessMemory
 {
      T1 a1;
      T2 a2;
      public ReadProcessMemory(T1 a1, T2 a2)
      {
         this.a1 = a1;
         this.a2 = a2;
      }
      public int Run(T3 variable)
      {
         return My.ReadProcessMemory(a1, a2, variable);
      }
 }
于 2013-01-18T23:19:13.017 に答える