你是否正在寻找关于outputdebugstring的内容?让我把最实在的东西奉献给你:

调试某些程序时用outputdebugstring打印,用debugview输出打印比较方便,例如windows服务程序。但debugview会输出任何windows软件程序的打印信息,如迅雷和flashget。虽然debugview提供了输出过滤功能,但每次观察其输出都要过滤也很不方便,
于是就想自己模拟实现OutputDebugString函数,然后写个对应的debugview来打印输出,这样用自己的outputdebugstring来打印用自己的debugview来输出打印就方便多了。
我封装的lib接口Myoutputdebugstring和对应的Mydebugview下载地址:
网上早有人对outputdebugstring原理做过研究,这里我借花献佛,以下为转载。
在应用程序和调试器之间传递数据是通过一个 4KB 大小的共享内存块完成的,并有一个互斥量和两个事件对象用来保护对他的访问,。下面就是相关的四个内核对象:
对象名称 对象类型
DBWinMutex Mutex
DBWIN_BUFFER Section (共享内存)
DBWIN_BUFFER_READY Event
DBWIN_DATA_READY Event
互斥量通常一直保留在系统中,其他三个对象仅当调试器要接收信息才出现。事实上 - 如果一个调试器发现后三个对象已经存在,它会拒绝运行。
当 DBWIN_BUFFER 出现时,会被组织成以下结构。进程 ID 显示信息的来源,字符串数据填充这 4K 的剩余部分。按照约定,信息的末尾总是包括一个 NULL 字节。
struct dbwin_buffer { DWORD dwProcessId; char data[4096-sizeof(DWORD)]; };当 outputdebugstring() 被应用调用时,它执行以下步骤。注意在任意位置的错误都将放弃整个事情,调试请求被认为是什么也不做(不会发送字符串)。
在调试器端会简单一点。互斥量根本不需要,如果事件对象和/或共享内存对象已经存在,则假定其他调试器已经在运行。系统中任意时刻只能存在一个调试器。
这使我们认为这决不是一种低消耗的发送信息的方法,应用程序的运行速度会受到调试器的左右。
以上就是关于outputdebugstring的全部内容,相信你一定会非常满意。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shenmilingyu/article-10298-1.html
对歌曲中的“爱你不后悔
楼上丢脸