什么方法能得到系统向地址写值时的触发事件? 比如:int *pA = new int;*pA = 10; //此时捕获事件?有方法吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 或许做一个对象在类里面加一个消息重载=的时候SendMessage 学习。我一般在做某个东西的设置对话框时,都是先把这个东西整个duplicate一个,然后在对话框中随意操作这个东西,如果点了确定,则相当于commit,整个再Copy回去。点了cancel,则相当于rollback,啥也不执行,反正不是在真的操作原始数据。不知对搂住有帮助么。glgl 好象有方法的,看看<windows核心编程> To superS(super慢):这种方式可行,但会super慢,如果这段代码被频繁执行。这样应该是最好的,我记录下来我做了哪些事,等我回滚的时候我在将其复原。但是监控的方法应该是怎么样的呢? 其实可以程序开始时分配一些内存作cache,因为赋值操作还是比较快的。只有cache满了才分配内存。另外在构造数据结构时尽量构造成能用memcpy来赋值的结构。这样赋值的速度也能提高了,甚至考虑内存对齐什么的进一步提高。比起跟踪写操作什么的,我觉得这应该是比较合理的办法。 e.g.我有一批内存(我由new来分配的,我记录了他们的大小起始地址),现在我要模拟一个事务的过程,我只对其中的3个值进行操作,如果不成功我要回滚,将内存恢复到原来的值。如果用memcpy,假设这一批内存占据了20M的空间并且频繁操作,首先要备份,然后再判断失败的话恢复,这样可行,但肯定会很慢,速度上不允许。理想的方法就是我只备份我修改的那3个值,失败了也只要恢复3个值就可以了,前提是要把设置一个系统的事件对指定的内存地址进行监控,在修改之前做备份。这种方法是最好的,但我不知道怎么实现? 这个可就复杂了,如果你能象 SoftICE 一样具有调试能力就行不过可不是那么容易的事情 如果想要通过事件来处理那就别想了对于内存地址的话是肯定行不通的了,我只见 SoftICE 这样的软件能够处理如果是通过 API 函数访存的话也许能够通过全局钩子处理如果单单是象 *a = 5; 这样编译成 MOV 语句的就不可能了,连 SoftICE 也做不到,除非通过单步调试,这样你的程序就不知道运行到猴年马月了对于 IO 地址的话不是太清楚,不过好象过滤层驱动也不能拦截 IO 访问 另外,如果这个东西有上千万的收益的话倒也不是完全不可行,给你一个方案:把通过 CPU 数据引脚出来的数据全部通过自设计的硬件中转记录用这种方法你想破USB狗都可以,不过离猴年马月也不远了,呵呵开个玩笑而已 "现在我要模拟一个事务的过程,我只对其中的3个值进行操作,如果不成功我要回滚"......不明白----------- 一切都是你操作的,那你怕什么.只要在操作前记录一下进行了什么操作就行了呗!struct Operation{ int * pAddress; int iOldVal;}std::list<Operation> m_listOp; 谢谢大家的关注!现在我把我的情况跟大家说一下,看看大家有什么办法没?我们的系统原来使用的是国外的ObjectStore,这是一个面向对象的数据库系统,这个数据库做得非常好,但就是版税太贵了,我们现在就模拟了我们的系统用到的ObjectStore的所有接口,实现了一个面向对象的数据库存储系统,把原来的ObjectStore替代了,现在正常操作都没有问题,但就是事务没有很好的解决。数据库系统中重载了new操作符,所有的数据相关的对象分配都会被分配在预定大小的内存块中,在事务传输过程中如果发生了意外,系统会调用abort回滚内存记忆而保证程序的正常运行进行的容错处理。我们也实现了这些,我们现在实现的方法是事务开始前将整个记忆体全部备份了一份,abort后返回。这样做效率特别低,这就是我在前面提出的问题,有没有方法我只恢复我修改了的数据?这样大家明白了吗?:) 你说的那个数据库我每听说过(见笑),不过对数据库回滚我可以给你的思路。我在用oralce我觉得他的实现原理说这样的:先将要处理的记录读到缓存中做一拷贝,然后对拷贝做修改。如果程序没报错,则用拷贝更新实际地址中的值。这不就实现了你说得功能了吗。因此,不要直接将指针指向实际值,才是解决问题的关键。 Dll中调用模态对话框 为什么主程序还可以进行其它操作!急!急!急! 如何检查线程的状态,标题要够长~~~ 如何在工程A中使用工程B中定义好的类? 请问怎么获取字符串的一部分进行比较,谢谢! 一个ActiveX Control的使用问题 如何使用VC进行自动初始化赋值:用AFX_DATA_INIT 对话框背景重画闪烁的问题。 各位兄弟姐妹,谁可以帮帮我……急急急!!! 如何得到字符串数组的上限 关于CFile类的问题,如何将缓冲区的内容强制写入磁盘文件? 真得好惨!atl7.1(vs2003的atl)写的组件不能注册! 我有一个写好的类,怎么把他用dll包装呢?然后,怎么使用?
在类里面加一个消息
重载=的时候SendMessage
点了cancel,则相当于rollback,啥也不执行,反正不是在真的操作原始数据。不知对搂住有帮助么。glgl
这种方式可行,但会super慢,如果这段代码被频繁执行。这样应该是最好的,我记录下来我做了哪些事,等我回滚的时候我在将其复原。但是监控的方法应该是怎么样的呢?
另外在构造数据结构时尽量构造成能用memcpy来赋值的结构。这样赋值的速度也能提高了,甚至考虑内存对齐什么的进一步提高。比起跟踪写操作什么的,我觉得这应该是比较合理的办法。
不过可不是那么容易的事情
对于内存地址的话是肯定行不通的了,我只见 SoftICE 这样的软件能够处理
如果是通过 API 函数访存的话也许能够通过全局钩子处理
如果单单是象 *a = 5; 这样编译成 MOV 语句的就不可能了,连 SoftICE 也做不到,除非通过单步调试,这样你的程序就不知道运行到猴年马月了
对于 IO 地址的话不是太清楚,不过好象过滤层驱动也不能拦截 IO 访问
把通过 CPU 数据引脚出来的数据全部通过自设计的硬件中转记录
用这种方法你想破USB狗都可以,不过离猴年马月也不远了,呵呵
开个玩笑而已
----------- 一切都是你操作的,那你怕什么.只要在操作前记录一下进行了什么操作就行了呗!
struct Operation
{
int * pAddress;
int iOldVal;
}
std::list<Operation> m_listOp;
我觉得他的实现原理说这样的:先将要处理的记录读到缓存中做一拷贝,然后对拷贝做修改。
如果程序没报错,则用拷贝更新实际地址中的值。这不就实现了你说得功能了吗。
因此,不要直接将指针指向实际值,才是解决问题的关键。