当前位置: 代码迷 >> C++ >> VC++兑现解析快捷方式
  详细解决方案

VC++兑现解析快捷方式

热度:8450   发布时间:2013-02-26 00:00:00.0
VC++实现解析快捷方式


桌面上那些五颜六色的图标可能大家非常熟悉吧?不知大家注意到没有,这些图标都有一个共同的特点,在每个图标的左下角都有一个非常小的箭头。这个箭头就是用来表明该图标是一个快捷方式的。快捷方式是Windows提供的一种快速启动程序、打开文件或文件夹的方法。他是应用程序的快速连接。 他的扩展名为.lnk。
一般来说快捷方式就是一种用于快速启动程序的命令行。它和程序既有区别又有联系。打个简单的比方,如果把程序比作一台电视机的话,快捷方式就像是一只遥控板。通过遥控板我们可以轻松快捷地控制电视的开关、频道的选择等。没有了遥控板我们还可以走到电视机面前进行操作,只是没有遥控那么方便罢了,并不会影响到电视机的使用。但没有了电视机,遥控板显然是无所作为。快捷方式也是一样,当快捷方式配合实际安装的程序时,非常便利。删除了快捷方式我们还可以通过“我的电脑”去找到目标程序,去运行它。而当程序被删除后,光有一个快捷方式就会毫无用处。自己桌面上的快捷方式复制到别人的计算机上,可能无法正常使用。

//#include "stdafx.h"#include <stdlib.h>#include <windows.h>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];}LOCALVOLUMETAB, *PLOCALVOLUMETAB;typedef struct _NETWORKVOLUMETAB{	DWORD		dwSize;	DWORD		dwUnknown1;	DWORD		dwOffsetOfNetShareName;	DWORD		dwUnknown2;	DWORD		dwUnknown3;	char		strNetShareName[0];}NETWORKVOLUMETAB, *PNETWORKVOLUMETAB;#define LNK_HASIDLIST	0x1#define LNK_FILEDIR		0x2#define LNK_HASDES		0x4#define LNK_HASPATH		0x8#define LNK_HASWORKDIR	0x10#define LNK_HASCMD		0x20#define LNK_LOCALVOLUME	0x1#define LNK_NETSHARE	0x2void AnalyseShortCut(const char *pFileName){	FILE			*file;	unsigned short	usLenTemp;	int				iSize;	LNKHEAD			head;	FILELOCATIONINFO	fileLocationInfo;	char			szDescription[1024]; //快捷方式所指向的文件描述	char			szFilePath[1024];    //快捷方式所指向的文件	char			szCommand[1024];	WCHAR			wszTemp[512];	char*			pDest;	DWORD			dwFlags;	int				p;		if((file = fopen(pFileName, "rb")) == NULL)    {		return;    }	// head	iSize = sizeof(LNKHEAD);	if (fread(&head, 1, iSize, file) != iSize)    {		goto errorExit;    }	dwFlags = head.dwFlags;		if(dwFlags & LNK_HASIDLIST)	{		// The Shell Item Id List		if(fread(&usLenTemp, 2, 1, file) != 1)		{			goto errorExit;		}		//fread(&szCommand, usLenTemp, 1, file);		fseek(file, usLenTemp, SEEK_CUR);	}		p = ftell(file);	// file location info	if(fread(&fileLocationInfo, sizeof(fileLocationInfo), 1, file) != 1)	{		goto errorExit;	}	//fread(&szCommand, fileLocationInfo.dwSize - sizeof(fileLocationInfo), 1, file);	fseek(file, fileLocationInfo.dwOffsetOfBasePath +  p, SEEK_SET);			if(fileLocationInfo.dwFlags & LNK_NETSHARE)	{		iSize = fileLocationInfo.dwOffsetOfNetworkVolume - fileLocationInfo.dwOffsetOfBasePath;	}	else	{		iSize = fileLocationInfo.dwOffsetOfRemainingPath - fileLocationInfo.dwOffsetOfBasePath;	}			if(fread(&szCommand, 1, iSize, file) != iSize)	{		goto errorExit;	}	pDest = strupr(szCommand);	if(NULL == strstr(pDest, ".EXE"))	{		goto errorExit;	}	sprintf(szFilePath, "\"%s\"", szCommand);		fseek(file, fileLocationInfo.dwSize +  p, SEEK_SET);	if(dwFlags & LNK_HASDES)	{		// skip Description string		if(fread(&usLenTemp, 2, 1, file) != 1)		{			goto errorExit;		}		if(fread(&wszTemp, sizeof(WCHAR), usLenTemp, file) != usLenTemp)		{			goto errorExit;		}		wszTemp[usLenTemp] = '\0';		WideCharToMultiByte( CP_ACP, 0, wszTemp, -1,			szDescription, 512, NULL, NULL );		//fseek(file, usLenTemp*2, SEEK_CUR);	}	if(dwFlags & LNK_HASPATH)	{		// skip Relative path		if(fread(&usLenTemp, 2, 1, file) != 1)		{			goto errorExit;		}		if(fread(&wszTemp, sizeof(WCHAR), usLenTemp, file) != usLenTemp)		{			goto errorExit;		}		wszTemp[usLenTemp] = '\0';		WideCharToMultiByte( CP_ACP, 0, wszTemp, -1,			szCommand, 512, NULL, NULL );		//fseek(file, usLenTemp*2, SEEK_CUR);	}		if(dwFlags & LNK_HASWORKDIR)	{		// skip Working directory		if(fread(&usLenTemp, 2, 1, file) != 1)		{			goto errorExit;		}		if(fread(&wszTemp, sizeof(WCHAR), usLenTemp, file) != usLenTemp)		{			goto errorExit;		}		wszTemp[usLenTemp] = '\0';		WideCharToMultiByte( CP_ACP, 0, wszTemp, -1,			szCommand, 512, NULL, NULL );		//fseek(file, usLenTemp*2, SEEK_CUR);	}	if(dwFlags & LNK_HASCMD)	{		// Command line arguments		if(fread(&usLenTemp, 2, 1, file) != 1)		{			goto errorExit;		}		if(fread(&wszTemp, sizeof(WCHAR), usLenTemp, file) != usLenTemp)		{			goto errorExit;		}		wszTemp[usLenTemp] = '\0';		WideCharToMultiByte( CP_ACP, 0, wszTemp, -1,			szCommand, 512, NULL, NULL );		strcat(szFilePath, " ");		strcat(szFilePath, szCommand);	}	_splitpath(pFileName,NULL,NULL,szDescription,NULL);errorExit:	fclose(file);}int main(int argc, char* argv[]){	AnalyseShortCut("C:\\Documents and Settings\\Administrator\\Desktop\\Windows Media Player.lnk");	printf("Hello World!\n");	return 0;}