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掉了。