Hook textout可能遇到的问题

一、因为TextOutA等函数还会调用ExtTextOutW之类函数,如果hook所有TextOut函数,则对同一次文本输出,会产生两次拦截。

事实上,所有文本输出函数最终都会调用ExtTextOutW。所以,如果仅仅是查看是否有文本输出,只hook这个函数就可以了。

二、ExtTextOutA(.......UINT c,.....)函数中,参数c表示输出字符串的个数。按API参手册,如果c为-1,则字符串必须以'\0'字符结束。这是一个陷阱,c 是UINT类型,不可能正确与-1比较。如果不仔细,很容易根据参考手册写出以下程序:

if((c-1))  //MAX_LEN原来buffer长度

    len=c;                //len表示需要处理的字符串长度。

这个条件永远不可能得到满足,所以,len不可能得到正确设置。如果以这个len作后续的字符串处理动作,将产生奇怪的结果(如得到一串乱码)或造成程序非正常终止。

三、多字节字符到16位unicode转换有多种函数可以用,经过实践证明,如下调用最为安全:

MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpString, b*2, txtbuffer, b);

你可能感兴趣的:(软件开发)