最近寫個程序需要創建快捷方式,可是煩人的殺軟,每次都會攔截,尤其是程序使用的時候,要創建快捷方式就攔截,真是一肚子火啊。
找了很久的資料,終於找到了一篇關於快捷方式文件的數據結構分析的文章:
http://www.vckbase.com/document/viewdoc/?id=1411
經過閱讀分析,編碼測試,終於搞定了不用IShellLink接口來創建快捷方式
首先複習下快捷方式文件的數據結構(在原先的基礎上增加了註釋)
- ///////////快捷方式文件格式部分結構/////////////
- //文件頭段
- typedef struct _LNKHEAD
- {
- DWORD dwID;
- DWORD dwGUID[4];
- DWORD dwFlags;
- DWORD dwFileAttributes;
- FILETIME dwCreationTime;
- FILETIME dwModificationTime;
- FILETIME dwLastaccessTime;
- DWORD dwFileLen;
- DWORD dwIconNum;
- DWORD dwWinStyle;
- DWORD dwHotkey;
- DWORD dwReserved1;
- DWORD dwReserved2;
- }LNKHEAD, *PLNKHEAD;
- //文件位置信息段
- typedef struct _FILELOCATIONINFO
- {
- DWORD dwSize;
- DWORD dwFirstOffset;
- DWORD dwFlags;
- DWORD dwOffsetOfVolume;
- DWORD dwOffsetOfBasePath;
- DWORD dwOffsetOfNetworkVolume;
- DWORD dwOffsetOfRemainingPath;
- }FILELOCATIONINFO, *PFILELOCATIONINFO;
- //本地卷信息表段
- typedef struct _LOCALVOLUMETAB
- {
- DWORD dwSize;
- DWORD dwTypeOfVolume;
- DWORD dwVolumeSerialNumber;
- DWORD dwOffsetOfVolumeName;
- char strVolumeName[0];//這個是可變長度因此爲 0,不包含在這個結構裏
- }LOCALVOLUMETAB, *PLOCALVOLUMETAB;
- //網絡卷信息表段
- typedef struct _NETWORKVOLUMETAB
- {
- DWORD dwSize;
- DWORD dwUnknown1;
- DWORD dwOffsetOfNetShareName;
- DWORD dwUnknown2;
- DWORD dwUnknown3;
- char strNetShareName[0];//這個是可變長度因此設爲0,不包含在這個結構裏
- }NETWORKVOLUMETAB, *PNETWORKVOLUMETAB;
- //主要宏
- #define LNK_HASIDLIST 0x1 //是否有Shell item ID list段
- #define LNK_FILEDIR 0x2 //指向文件或文件夾,如果此位爲0表示指向其他。
- #define LNK_HASDES 0x4 //是否存在描述字符串
- #define LNK_HASPATH 0x8 //是否存在相對路徑
- #define LNK_HASWORKDIR 0x10 //是否存在工作路徑
- #define LNK_HASCMD 0x20 //是否存在命令行參數
- #define LNK_HASICO 0x40 //是否存在自定義圖標
- #define LNK_LOCALVOLUME 0x1 //表示本地卷有效,反之無效
- #define LNK_NETSHARE 0x2 //表示網絡卷有效,反之無效
- //
- #define LNK_LOCVOLTAB 0x10 //本地卷信息表段固定大小16位(不包含可變部分)
- #define LINK_URL "http://www.bai.com" //
接下來就是主要的編碼實現了
其中主要的函數是:PackageShortCut
該函數基本與Cuick給的程序是一樣的,只不過Cuick那邊是fread讀取分析,而這裏是fwrite寫數據,同時將需要轉換爲寬字節的地方轉換,其他的就差不多一樣了,好了,廢話少說,下面給出主要的實現代碼(這個只是測試代碼,具體的還有很多地方需要判斷優化的,需要的話,可以自己改改^_^)
好了,基本的代碼就是這樣了,
幾個問題:
1、就是我們的正常的快捷方式右鍵屬性裏有個兼容性的屬性頁,而我創建的這個是沒有的
不知道如何填充這個數據,
2、最重要的是刪除快捷方式被殺軟攔截這個如何避免呢,誰知道的,希望給予指導
3、不知道像Cuick是怎麼分析得到快捷方式文件的這些數據結構的,是不是有什麼工具?或者什麼方法?