这仍然是在学习字符编码的时候引出来的。
原意是感觉字符编码既然这么普遍地存在,那么操作系统又是如何做的呢?所以想到要调试一下TextOutA函数,看看它输出文本的时候是怎样对付字符编码问题的。最后的结果是:
TextOutA实际上是封装了一个另外的函数调用。TextOutA的流程大概是这个样子:
BOOL TextOutA(
HDC hdc, // handle to DC
int nXStart, // x-coordinate of starting position
int nYStart, // y-coordinate of starting position
LPCTSTR lpString, // character string
int cbString // number of characters
) {
if(cbString <= 0) {
jmp 77F0FD46h
}
if(lpString == NULL) {
jmp 77F0FD46h
}
PROC lpFunc = (PROC) 0x77EF8E4E;
lpFunc(hdc, nXStart, nYStart, 0, 0, lpString, cbString, 0, 1);
}
在上述伪代码中的lpFunc中,又依次调用了GdiGetCodePage函数和MultiByteToWideChar函数,然后调用了一个地址(在我的电脑上是77EF664F)处的代码,接下来是其它的工作,而TextOutW则是直接调用了77EF664F地址处的代码。
以上就是调试好几个小时的结论。实际上,这些东西都可以通过静态分析看出来,那样的话更简单。这个结论到后来没有任何意义了。但为几个小时的调试,还是暂且记下来。
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow