5

別のプロセスのプロセスメモリに特定の値を含む場所へのポインタのリストを作成したいと思います。値は、short、int、long、string、bool、またはその他の値にすることができます。

私の考えは、これにジェネリックを使用することです。私はそれを作ることに1つの問題があります、どうすればコンパイラにバイト配列を変換するために必要なタイプを伝えることができますか?

これは私が作ったものです:

    public List<IntPtr> ScanProccessFor<T>(T ItemToScanFor)
    {
        List<IntPtr> Output = new List<IntPtr>();

        IntPtr StartOffset = SelectedProcess.MainModule.BaseAddress;
        int ScanSize = SelectedProcess.MainModule.ModuleMemorySize;

        for (int i = 0; i < ScanSize; i++)
            if (ReadMemory(SelectedProcess, StartOffset + i, (UInt16)Marshal.SizeOf(ItemToScanFor)) == ItemToScanFor)
                Output.Insert(Output.Count,StartOffset + i);

        return Output;
    }

byte []をタイプTに変換する必要があることをコンパイラーにどのように伝えることができますか?

4

2 に答える 2

2

あなたの質問は少し紛らわしいですが、私はできる限り答えようとします

ジェネリック型を使用する代わりに、インターフェイスのインスタンスを使用するメソッドなどを作成する可能性がありますIConvertableToByteArray

public IConvertableToByteArray
{    
    public byte[] ToByteArray();
}

次に、特定の型がそのメソッドと互換性を持つようにする必要がある場合は、カプセル化クラスを作成できます

public IntConvertableToByteArray : IConvertableToByteArray
{
    public int Value{get; set;}

    public byte[] ToByteArray()
    {
        insert logic here
    }
}
于 2012-08-13T18:23:46.663 に答える
1

Marshal.StructureToPtrを使用して、構造の管理されていない表現を取得できます (これは「単純な」構造でなければなりません)。ただし、文字列を特殊なケースにする必要があるかもしれません。

また、検索対象のアラインメントの制約についても考慮する必要があります。項目が 4 または 8 バイト アラインされている必要がある場合、メモリを一度に 1 バイトずつ進めるのは非常に遅く、無駄になります。

于 2012-08-13T18:24:45.210 に答える