关于GetProcAddress函数的思考

作者:朱金灿

来源:http://www.cnblogs.com/clever101

 

GetProcAddress是一个有点奇怪的Win32 API函数。一般而言,在涉及到字符串参数的Win32 API函数在内部使用是有两个版本的,一个ANSI版本,一个unicode版本,而给用户使用的版本往往使用LPCTSTR这种字符串类型来兼容多字节字符集和unicode字符集。

但是你看看GetProcAddress的第二个参数LPCSTR lpProcName,它明明白白告诉你这是一个多字节字符串。而在GetProcAddress所在的声明头文件中我们也看到它只有一个版本。

这是为什么呢?以前我为此事迷惑过

 

之前我给同事解释什么叫静态库和导入库,突然心意一动,对GetProcAddress的设计有了一点新理解。我们知道DLL文件本质是一个pe文件。而pe文件内部使用什么字符集呢?据我之前的研究,它是使用多字节字符集的。因此GetProcAddress的作用是通过函数名字查找它在DLL中的地址,使用多字节字符输入参数就是一件很自然的事。《Windows核心编程》告诉我们,在所有的核心的Win API函数中涉及到字符串操作,假如你传入一个多字节字符串,系统要它转化为unicode字符串再传给操作系统,GetProcAddress怕是少有的传入多字节字符串不用转化为unicode字符串的API函数。再想深一层,其实如果熟悉了pe文件结构,这个GetProcAddress我们自己也能实现。

posted @ 2011-08-21 09:28  是金子就会灿烂  阅读(1835)  评论(2编辑  收藏  举报