Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18672149
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-27 11:33:16

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 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: 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掉了。
阅读(482) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~