2011-07-10 51 views
0

我正在從其他正在運行的進程中讀取內存,這是我沒有的源代碼,使用從非託管進程讀取內存時,類似於INotifyPropertyChanged

[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毫秒內更改幾次或在幾分鐘內更改一次,因此放置較少的間隔似乎有點過分。有更優雅的解決方案。謝謝。

+0

是你的問題關於如何實現INotifyPropertyChanged?看來你一部分的方式有...在這裏看到:http://msdn.microsoft.com/en-us/library/ms743695.aspx – 2011-07-10 16:16:11

+0

我知道如何使用託管代碼何時實施INPC,但是當值的變化在其他流程中,我想在我的流程中更新價值。誠實地說, – Marin

+1

並不真正瞭解這種情況。對我來說這是個好問題。現在的問題是不是實現INotifyPropertyChanged的(可能這是寫下這句話是錯誤),但問題就像他在資源消耗少的方式要如何實現通知機制。 +1。 @ user488819:恐怕您沒有其他解決方案,對您而言,那麼您自己提出了一個解決方案。 – Tigran

回答

2

沒有,有沒有辦法得到一個通知,當存儲在另一個進程的變化。如果您是調試器,則可以使用CPU數據斷點來了解一小部分位置中的更改。但是這會產生顯着的性能影響,而且如果您實際正在進行調試,則這只是正確的方法。

如果其他進程是你自己的東西,那麼最好的方法是拆卸和理解等過程中的代碼,並添加自己的代碼來發送通知。在沒有資源的情況下工作,做一個小小的改變可能不會比你想象的要困難。

Martyn

+0

問題是我沒有其他進程的代碼,但謝謝你的回覆。 – Marin

+0

您不需要其他進程的源代碼。 –

+0

嗯,是的,你是對的,我想我會嘗試。再次感謝。 – Marin