Что-то вроде INotifyPropertyChanged при чтении памяти из неуправляемого процесса - PullRequest
0 голосов
/ 10 июля 2011

Я читаю память из другого запущенного процесса, исходный код которого у меня отсутствует, используя

[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");
}

, который обновляет X, читая эту неуправляемую память процесса каждые 500 мс, но это похоже на взлом. Кроме того, память в неуправляемом процессе может изменяться несколько раз за 500 мсек или один раз в несколько минут, поэтому использование меньшего интервала кажется избыточным. Есть ли более элегантное решение. Спасибо.

1 Ответ

2 голосов
/ 10 июля 2011

Нет, нет способа получить уведомление об изменении памяти в другом процессе. Если бы вы были отладчиком, вы могли бы использовать точку останова данных ЦП, чтобы узнать об изменениях в небольшом наборе мест. Но это может оказать существенное влияние на производительность, и это только правильный подход, если вы на самом деле отлаживаете.

Если другой процесс принадлежит вам, тогда лучше всего разобрать и понять код другого процесса и добавить собственный код для отправки уведомления. Работать без источника и вносить небольшие изменения, вероятно, не так сложно, как вы думаете.

Martyn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...