情况永远没有想象中那么简单,由于微软给出的SDK帮助永远是为VC定做的,我们常常没有办法了解到某一个DLL到底有什么函数。今天就有位写程序的兄弟问我SHSendBackToFocusWindow的声明方式,他称根据SDK的说明在声明中VS一直提示无法在DLL中找到该方法。
我按他所说的情况查询了微软的SDK,其中说明是这样的:
Smartphone: Smartphone 2002 and later.
OS Versions: Windows CE 3.0 and later.
Header: tpcshell.h.
Library: Aygshell.lib.
按照常规,库Aygshell.lib改了lib为dll后即为函数的调用DLL名字,但根据这种方法声明,运行时果然出现了函数不存在的报错。
我第一反应是用VS自带的depends工具来查看Aygshell.dll的内容,depends是一个极好的工具,他可以显示指定DLL内的函数和DLL依存关系。
但不幸的事,VS2005无法在模拟器中将此文件复制出来,看来这个DLL属系统的核心组件。
所有的一切又回复到了原点,手工的资本依然只有SDK中指出的Aygshell.lib。但兴幸的是,从dos黑暗时代走来的程序员中,我的猫脑依稀还存在一些神秘的记忆,dumpbin命令!这个命令可以列出DLL中的信息,但不知它用于lib时有什么效果?
一个重定向符>可以使Dos命令的输出导入到一个文件中,于是在VS的命令窗口我输入:
dumpbin aygshell.lib /all>Luck.txt
在这个luck.txt的Exports节中我找到了函数的入口点:
97 SHSendBackToFocusWindow
接下来一切迎刃而解,函数声明如下
[DllImport("Aygshell.dll", EntryPoint = "#97")]
private static extern void SHSendBackToFocusWindow(uint uMsg, uint wp, uint lp);
本blog文档不经作者许可,谢绝转载!