Я постараюсь объяснить мою проблему как можно лучше. Итак, у меня есть приложение, написанное на C / C ++ (язык в клиентском приложении не имеет значения), которое импортирует одну функцию из DLL, например, uint32_t * GetMemoryPointer (). Затем он записывает последовательности в этот указатель памяти следующим образом:
uint32_t* ptr = (uint32_t*)GetMemoryPointer();
*ptr = 3;
*ptr = 4;
*ptr = 1050;
Это делает эту последовательность без какой-либо информации для DLL, что значение было изменено. Можно ли посмотреть это значение в DLL? Я пытался создать поток и в цикле искать изменения, но это не надежно. Есть ли лучшее решение? Я заинтересован в том, чтобы делать это следующим образом: приложение пишет, DLL обнаруживает, что значение было изменено, приложение HOLDS выполняет интерпретацию этого значения, а затем ПОЗВОЛЯЕТ приложению продолжить выполнение. Другим способом без удержания приложения может быть добавление в стек нового значения, но мне нужно знать о каждом изменении. Платформа, в которой я заинтересован — это Windows. Язык не имеет значения, может быть C или C ++. Можно ли этого добиться? Это действительно важно для меня, и у меня нет идей. Я не хочу код, но я хотел бы, чтобы мне сообщили, если это возможно и каким образом мне нужно идти. Заранее спасибо.
На мой взгляд, если вы можете пометить память как доступную только для чтения, и когда кто-нибудь попытается записать в нее ОС, будет выдано исключение / ошибка, вы должны ее перехватить. Я не знаю, существуют ли какие-либо библиотеки для этого, так что попробуйте поискать в Google.
Один из вариантов заключается в реализации Value
тип, который содержит фактические данные для мониторинга и использовать схема наблюдателя отправлять уведомления при изменении значения. Начнем с простой реализации, которая содержит значение нужного типа (uint32_t
в этом случае) вместе с оператором присваивания, который вызывает обратные вызовы каждый раз, когда оператор изменяет значение.
Пример ниже делает именно это и включает в себя оператор преобразования, чтобы позволить достаточное количество операций быть выполненными с другими uint32_t
ценности. Вы можете расширить это, чтобы удовлетворить ваши требования, включая предоставление полного набора операторов (operator+
, operator/
и т. д.), чтобы сделать его немного более надежным.
#include <iostream>
#include <vector>
#include <cstdint>class Value
{
uint32_t value;
std::vector<void(*)()> observers;
public:
Value() : value(0) {}
// Allows you to register a observer that gets called when
// the value changes
void RegisterListener(void (*f)())
{
observers.push_back(f);
}
// Conversion operator that allows implicit conversions
// from Value to uint32_t.
operator uint32_t() const
{
return value;
}
Value& operator=(uint32_t newValue)
{
// Only alert observers if the value is actually changing.
if (value != newValue)
{
value = newValue;
for (std::vector<void(*)()>::const_iterator it = observers.begin();
it != observers.end();
++it)
{
// Call the observer
(*it)();
}
}
return *this;
}
};
void Callback()
{
std::cout << "value changed\n";
}
int main()
{
Value value;
value.RegisterListener(Callback);
// Value held in object can be assigned to a uint32_t due to the
// conversion operator.
uint32_t original = value;
// Change the value see the callback get invoked
value = value + 1;
// Restore the value to it's original and see the callback get invoked.
value = original;
}