WCE的[Windows]-[Start Menu]下有很多的LNK文件,这些是AP的快捷方式。很多程序都喜欢遍历出PPC上的AP,然后进行设置操作,在该目录下进行遍历是很常见的一种做法。
LNK文件中的内容类似:0#peghelp.exe?ceshell.dll,-8212,其中有编号和供SHELL调用的运行参数,该运行参数有些指明了EXE文件的详细地址,例如:34#"\Program Files\Camera\Camera.exe";有些根本就无法识别,例如:21#:MSPPT,这个是Power Point的LNK文件的内容。如何通过LNK文件来获得AP的名称呢?下面是我的心得:
首先获取LNK文件的运行参数,使用函数
SHGetShortcutTarget,该函数为WCE所特有,并且MSDN本地版上没有关于该函数的介绍,MSDN ONLINE上有这个函数的使用说明:
Platform Builder for Microsoft Windows CE 5.0
SHGetShortcutTarget
Send Feedback
This function retrieves the shortcut's target path. A remote application interface (RAPI) version of this function exists, CeSHGetShortcutTarget (RAPI).
Syntax
BOOL SHGetShortcutTarget(
LPTSTR szShortcut,
LPTSTR szTarget,
int cbMax
);
Parameters
szShortcut
[in] Null-terminated string that contains the name of the shortcut.
szTarget
[in] Null-terminated string that gets the target path of the shortcut. The buffer must be at least cbMax characters long.
cbMax
[in] Maximum number of characters that can be copied to the buffer.
Return Values
TRUE indicates success. FALSE indicates failure.
Requirements
OS Versions: Windows CE 1.0 and later.
Header: Shellapi.h.
Link Library: Coredll.lib.
拿PPT的LNK文件为例,SHGetShortcutTarget("\Windows\Start Menu\Office Mobile\PowerPointMobile.lnk", szTarget, MAX_PATH); 即可在szTarget字符串BUFFER中获得:MSPPT这个结果,需要注意的是,
有些Target字符串结尾有一些特殊的不显示的字符,例如这个:MSPPT字符串后面就跟这数值为13和5的字符,由于后面要使用到该字符串,所以需要引起注意。
对于:MSPPT这个字符串,无法直接解析AP的实际名称。通过调查注册表,我发现在[HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\Rai\]位置存在关于名为:MSPPT等的子键,:MSPPT的子键数值如下:
Name
|
Value
|
4
|
00 00 00 00 00 00 00 00
|
3
|
0
|
2
|
0
|
1
|
ppt.exe
|
0
|
BlackWindow
|
虽然无法解读这些以数值为名称的键值有什么含义,但至少可以看出,键值为1的子键数值指明了名为:MSPPT的AP名称。关于这些键值的含义,希望有知道的大虾能够告知,或者提供相关资料的链接,因为我找了好久没有找到。
这里有两点需要注意:
1. 键值为1的子键数值有些并没有直接提供AP名称,例如:MSTASKS的子键1的数值为“:MSPOUTLOOK tasks”,因此,需要继续遍历以获取实际的AP名称。
2. 前面提到的通过SHGetShortcutTarget得到的Target字符串结尾有些不显示的隐藏字符,对于这些字符应该剔除掉,否则无法定位成功注册表中的正确位置。
通过上述两步即可得到LNK文件对应的AP名称,希望这篇总结可以对大家有所帮助,也希望CPPBLOG中的大虾们能够参与讨论,给予指导。
PS: 通过查阅资料发现,PC上可以使用IShellLink接口对LNK文件进行很复杂的操作,但貌似WCE上对该接口不支持,因为关于IShellLink的GUID和UUID定义都被MARK掉了。