从非托管进程读取内存时,类似于INotifyPropertyChanged

时间:2011-07-10 16:12:22

标签: c# winapi

我正在使用

从其他正在运行的进程中读取内存,这是我没有的源代码
[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");
}

通过每500毫秒读取一次非托管进程内存来更新X,但这感觉就像是黑客攻击。此外,非托管进程中的内存可以在500毫秒内更改几次或在几分钟内更改一次,因此减少间隔似乎有点过分。有更优雅的解决方案。感谢。

1 个答案:

答案 0 :(得分:2)

不,当另一个进程中的内存发生更改时,无法获取通知。如果您是调试器,则可以使用CPU数据断点来了解一小组位置的更改。但是这会产生很大的性能影响,如果你实际调试的话,它只是正确的方法。

如果其他进程是您拥有的,那么最好的方法是反汇编并理解其他进程的代码,并添加您自己的代码以发送通知。没有来源工作并进行小的改动可能不像你想象的那么难。

马丁