2011-07-10 6 views
0

のメモリを読んで、私は、ソースコードは、私が何か非管理プロセスから

[DllImport("kernel32.dll")] 
public static extern int ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, uint size, out IntPtr lpNumberOfBytesRead); 

を使用していないと、すべてが正常に動作し、他の実行中のプロセスからメモリを読んでいます。私は私が必要とする値を取得し、今私は私のプログラムでINotifyPropertyChangedのようなものを実装したいので、その非管理プロセスの変化の値が、私のコードは、それを登録していることを私の変数Xを更新するとき

は、これまでのところ私は

を持っています
private string x; 
public string X { get { return x; } } 
.... 
Threading.Timer timerX = new Timer(x => UpdateX(), null, 0, 500) 
.... 
private void UpdateX() 
{ 
    //Read value from unmanaged process 
    OnPropertyChanged("X"); 
} 

は、管理されていないプロセスメモリを500msごとに読み取ってXを更新しますが、ハッキングのように感じます。また、管理されていないプロセスのメモリは、500msで数回、または数分で1回変化する可能性があるため、間隔を短くすることは過度の方法です。より洗練されたソリューションがありますか?ありがとう。

+0

INotifyPropertyChangedの実装方法に関するご質問はありますか?あなたがそこにいる方法の一部であるようです... http://msdn.microsoft.com/en-us/library/ms743695.aspx –

+0

マネージコードを使用するときにINPCを実装する方法を知っていますが、値が変更されたとき他のプロセスでは、私のプロセスで価値を更新したい。 – Marin

+1

本当に、このdownvoteを正直に理解していない。私にとってそれは良い質問です。問題は、INotifyPropertyChanged(これは間違いかもしれませんが、この言葉を書き留めることです)を実装することではありませんが、資源消費量の少ない方法で通知メカニズムを実装する方法についての質問です。 +1。 @ user488819:私はあなたのケースでは、他の解決策を持っていないと思います。 – Tigran

答えて

2

いいえ、別のプロセスのメモリが変更されたときに通知を受け取る方法はありません。デバッガの場合は、CPUデータブレークポイントを使用して、小さな場所の変更を確認することができます。しかし、これは重要なパフォーマンスに影響し、実際にデバッグしている場合にのみ正しいアプローチになります。

他のプロセスが自分のものである場合は、他のプロセスのコードを逆アセンブルして理解し、独自のコードを追加して通知を送信するのが最善の方法です。ソースのない作業と小さな変更を行うことは、おそらくあなたが思っているよりも難しくありません。

Martyn

+0

問題は私が他のプロセスのコードを持っていないことですが、返信に感謝します。 – Marin

+0

他のプロセスのソースコードは必要ありません。 –

+0

ええ、そうです、私はそれを試してみると思います。再度、感謝します。 – Marin