您的位置:首页 > 其它

MFC创建快捷方式

2014-01-27 14:23 225 查看
//MyCommon.h
#pragma once

enum ShortcutType
{
BOTH_SHORTCUT = 0,
ONLY_DESKTOPSHORTCUT,
ONLY_MENUSHORTCUT,
NO_SHORTCUT
};

enum ExitType
{
EN_INITIALIZE_FAILED = -100,
};


 

//MyWinInstall.h
#pragma once
#include "MyCommon.h"

class CMyWinInstall
{
public:
CMyWinInstall(void);
virtual ~CMyWinInstall(void);
public:
int AddShortcut();
void SetExePath(CString t_strPathName);
void SetShortcutType(ShortcutType t_eShortcutType);
private:
void AddDesktopShortcut();
void AddMenuShortcut();
void GetLinkPath(char *&t_strPath);
void SaveShortcut(char *&t_strPath, wchar_t *&t_pWSZ);
void GetUniLinkName(char *&t_strPath, wchar_t *&t_pWSZ);
int InitializeCOM();
int UnInitializeCOM();
private:
ShortcutType m_eShortcutType;	//快捷方式类型
CString m_strFileName;			//文件名
CString m_strPathName;			//可执行文件路径
CString m_strLinkName;
int m_iCSIDL;
IShellLink *link;
IPersistFile *file;
};


 

//MyWinInstall.cpp
#include "StdAfx.h"
#include "MyWinInstall.h"

CMyWinInstall::CMyWinInstall(void)
{
m_eShortcutType = BOTH_SHORTCUT;
}

CMyWinInstall::~CMyWinInstall(void)
{
}

void CMyWinInstall::SetShortcutType(ShortcutType t_eShortcutType)
{
m_eShortcutType = t_eShortcutType;
}

void CMyWinInstall::SetExePath(CString t_strPathName)
{
m_strPathName = t_strPathName;
int pos = m_strPathName.ReverseFind('\\');
m_strFileName = m_strPathName.Right(m_strPathName.GetLength()-1-pos);
//m_strPathName = "D:\\Program\\MyLibrary\\Debug\\MyWindowsTest.exe";
}

int CMyWinInstall::AddShortcut()
{
int t_iReturn = 0;
t_iReturn = InitializeCOM();
if(0 != t_iReturn)
{
return t_iReturn;
}

char *t_pPath = new char[MAX_PATH];
wchar_t *t_pWSZ = new wchar_t[MAX_PATH];
memset(t_pPath, 0, MAX_PATH);
memset(t_pWSZ, 0, MAX_PATH);

switch(m_eShortcutType)
{
case NO_SHORTCUT:
break;
case ONLY_DESKTOPSHORTCUT:
{
AddDesktopShortcut();
GetUniLinkName(t_pPath, t_pWSZ);
SaveShortcut(t_pPath, t_pWSZ);
break;
}
case ONLY_MENUSHORTCUT:
{
AddMenuShortcut();
GetUniLinkName(t_pPath, t_pWSZ);
SaveShortcut(t_pPath, t_pWSZ);
break;
}
default:
{
AddDesktopShortcut();
GetUniLinkName(t_pPath, t_pWSZ);
SaveShortcut(t_pPath, t_pWSZ);
AddMenuShortcut();
GetUniLinkName(t_pPath, t_pWSZ);
SaveShortcut(t_pPath, t_pWSZ);
break;
}
}

delete t_pPath;
UnInitializeCOM();
return 0;
}

void CMyWinInstall::AddDesktopShortcut()
{
m_iCSIDL = CSIDL_DESKTOP;
}

void CMyWinInstall::AddMenuShortcut()
{
m_iCSIDL = CSIDL_PROGRAMS;
}

void CMyWinInstall::GetLinkPath(char *&t_strPath)
{
LPITEMIDLIST pid;
::SHGetSpecialFolderLocation(NULL, m_iCSIDL, &pid);
::SHGetPathFromIDList(pid, t_strPath);
}

void CMyWinInstall::GetUniLinkName(char *&t_strPath, wchar_t *&t_pWSZ)
{
CString name = "";
int pos = m_strFileName.Find(".");
name = m_strFileName.Left(pos);
GetLinkPath(t_strPath);
m_strLinkName.Format("%s\\%s.lnk", t_strPath, name);
MultiByteToWideChar(CP_ACP, 0, m_strLinkName, -1, t_pWSZ, MAX_PATH);
}

void CMyWinInstall::SaveShortcut(char *&t_strPath, wchar_t *&t_pWSZ)
{
file->Save(t_pWSZ, STGM_READWRITE);
::SHChangeNotify(SHCNE_CREATE|SHCNE_INTERRUPT, SHCNF_FLUSH|SHCNF_PATH, m_strLinkName, 0);
::SHChangeNotify(SHCNE_UPDATEDIR|SHCNE_INTERRUPT, SHCNF_FLUSH|SHCNF_PATH, t_strPath, 0);
}

int CMyWinInstall::InitializeCOM()
{
HRESULT res=::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (void **)&link);
if(FAILED(res))
return EN_INITIALIZE_FAILED;
link->SetPath(m_strPathName);
res=link->QueryInterface(IID_IPersistFile,(void**)&file);
if(FAILED(res))
return EN_INITIALIZE_FAILED;
return 0;
}

int CMyWinInstall::UnInitializeCOM()
{
file->Release();
link->Release();
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC 创建 快捷方式