最近写个程序需要创建快捷方式,可是烦人的杀软,每次都会拦截,尤其是程序使用的时候,要创建快捷方式就拦截,真是一肚子火啊。
找了很久的资料,终于找到了一篇关于快捷方式文件的数据结构分析的文章:
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是怎么分析得到快捷方式文件的这些数据结构的,是不是有什么工具?或者什么方法?