自己实现快捷方式文件的创建

最近写个程序需要创建快捷方式,可是烦人的杀软,每次都会拦截,尤其是程序使用的时候,要创建快捷方式就拦截,真是一肚子火啊。
找了很久的资料,终于找到了一篇关于快捷方式文件的数据结构分析的文章:

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

经过阅读分析,编码测试,终于搞定了不用IShellLink接口来创建快捷方式


首先复习下快捷方式文件的数据结构(在原先的基础上增加了注释)

 

[cpp]  view plain copy
  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是怎么分析得到快捷方式文件的这些数据结构的,是不是有什么工具?或者什么方法?

你可能感兴趣的:(数据结构,工作,优化,网络,测试,工具)