自己實現快捷方式文件的創建

最近寫個程序需要創建快捷方式,可是煩人的殺軟,每次都會攔截,尤其是程序使用的時候,要創建快捷方式就攔截,真是一肚子火啊。
找了很久的資料,終於找到了一篇關於快捷方式文件的數據結構分析的文章:

http://www.vckbase.com/document/viewdoc/?id=1411

經過閱讀分析,編碼測試,終於搞定了不用IShellLink接口來創建快捷方式



首先複習下快捷方式文件的數據結構(在原先的基礎上增加了註釋)

 

  1. ///////////快捷方式文件格式部分結構/////////////  
  2. //文件頭段  
  3. typedef struct _LNKHEAD  
  4. {  
  5.      DWORD  dwID;  
  6.      DWORD  dwGUID[4];  
  7.      DWORD  dwFlags;  
  8.      DWORD  dwFileAttributes;  
  9.      FILETIME dwCreationTime;  
  10.      FILETIME dwModificationTime;  
  11.      FILETIME dwLastaccessTime;  
  12.      DWORD  dwFileLen;  
  13.      DWORD  dwIconNum;  
  14.      DWORD  dwWinStyle;  
  15.      DWORD  dwHotkey;  
  16.      DWORD  dwReserved1;  
  17.      DWORD  dwReserved2;  
  18. }LNKHEAD, *PLNKHEAD;  
  19. //文件位置信息段  
  20. typedef struct _FILELOCATIONINFO  
  21. {  
  22.      DWORD  dwSize;  
  23.      DWORD  dwFirstOffset;  
  24.      DWORD  dwFlags;  
  25.      DWORD  dwOffsetOfVolume;  
  26.      DWORD  dwOffsetOfBasePath;  
  27.      DWORD  dwOffsetOfNetworkVolume;  
  28.      DWORD  dwOffsetOfRemainingPath;  
  29. }FILELOCATIONINFO, *PFILELOCATIONINFO;  
  30. //本地卷信息表段  
  31. typedef struct _LOCALVOLUMETAB  
  32. {  
  33.      DWORD  dwSize;  
  34.      DWORD  dwTypeOfVolume;  
  35.      DWORD  dwVolumeSerialNumber;  
  36.      DWORD  dwOffsetOfVolumeName;  
  37.      char  strVolumeName[0];//這個是可變長度因此爲  0,不包含在這個結構裏  
  38. }LOCALVOLUMETAB, *PLOCALVOLUMETAB;  
  39. //網絡卷信息表段  
  40. typedef struct _NETWORKVOLUMETAB  
  41. {  
  42.     DWORD  dwSize;  
  43.     DWORD  dwUnknown1;  
  44.     DWORD  dwOffsetOfNetShareName;  
  45.     DWORD  dwUnknown2;  
  46.     DWORD  dwUnknown3;  
  47.     char  strNetShareName[0];//這個是可變長度因此設爲0,不包含在這個結構裏  
  48. }NETWORKVOLUMETAB, *PNETWORKVOLUMETAB;  
  49. //主要宏  
  50. #define LNK_HASIDLIST     0x1   //是否有Shell item ID list段  
  51. #define LNK_FILEDIR       0x2   //指向文件或文件夾,如果此位爲0表示指向其他。  
  52. #define LNK_HASDES        0x4   //是否存在描述字符串   
  53. #define LNK_HASPATH       0x8   //是否存在相對路徑  
  54. #define LNK_HASWORKDIR    0x10  //是否存在工作路徑  
  55. #define LNK_HASCMD        0x20  //是否存在命令行參數  
  56. #define LNK_HASICO        0x40  //是否存在自定義圖標  
  57. #define LNK_LOCALVOLUME   0x1   //表示本地卷有效,反之無效  
  58. #define LNK_NETSHARE      0x2   //表示網絡卷有效,反之無效  
  59. //  
  60. #define LNK_LOCVOLTAB     0x10 //本地卷信息表段固定大小16位(不包含可變部分)  
  61. #define LINK_URL         "http://www.bai.com"  //  


接下來就是主要的編碼實現了

其中主要的函數是:PackageShortCut
該函數基本與Cuick給的程序是一樣的,只不過Cuick那邊是fread讀取分析,而這裏是fwrite寫數據,同時將需要轉換爲寬字節的地方轉換,其他的就差不多一樣了,好了,廢話少說,下面給出主要的實現代碼(這個只是測試代碼,具體的還有很多地方需要判斷優化的,需要的話,可以自己改改^_^)

 

 

好了,基本的代碼就是這樣了,

幾個問題:
1、就是我們的正常的快捷方式右鍵屬性裏有個兼容性的屬性頁,而我創建的這個是沒有的
     不知道如何填充這個數據,

2、最重要的是刪除快捷方式被殺軟攔截這個如何避免呢,誰知道的,希望給予指導

3、不知道像Cuick是怎麼分析得到快捷方式文件的這些數據結構的,是不是有什麼工具?或者什麼方法?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章