如何在程序中创建快捷方式?

这里给出一个创建快捷方式的例子,是使用IShellLink和IPersistFile两个COM接口实现的。

例子代码如下:

 CFileDialog openDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER );
 if (IDCANCEL==openDlg.DoModal())
 {
  return;
 }

 CString csFile, csFileLnk, csDirectory;
 csFile = openDlg.GetPathName();
 
 csFileLnk = csFile.Left(csFile.GetLength()-openDlg.GetFileExt().GetLength()-1);
 csFileLnk += _T(".lnk");

 csDirectory = csFile.Left(csFile.GetLength()-openDlg.GetFileName().GetLength());

 HRESULT hres=NULL;
 IShellLink* psl;
    // Get a pointer to the IShellLink interface.
 hres = CoInitialize(NULL);
 if (!SUCCEEDED(hres))
 {
  AfxMessageBox(_T("COM initialized failed."));
  return;
 }

    hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);

 if (!SUCCEEDED(hres))
 {
  AfxMessageBox(_T("Create instance failed."));
  CoUninitialize();
  return;
 }

 psl->SetDescription(_T("测试快捷方式"));
 psl->SetIconLocation(csFile, 0);
 psl->SetPath(csFile);
 psl->SetShowCmd(SW_SHOWNORMAL);
 psl->SetWorkingDirectory(csDirectory);

 IPersistFile* ppf;
 hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);

 if (!SUCCEEDED(hres))
 {
  AfxMessageBox(_T("Query interface failed."));
  CoUninitialize();
  return;
  
 }

 WCHAR wsz[MAX_PATH];
 MultiByteToWideChar(CP_ACP,
      0,
      _T(csFileLnk),
      -1,
      wsz,
      MAX_PATH);

 hres = ppf->Save(wsz, FALSE);
 if (!SUCCEEDED(hres))
 {
  AfxMessageBox(_T("Save failed."));
 
 }

 ppf->Release();

psl->Release();

 CoUninitialize();

 AfxMessageBox(_T("创建成功!"));


 -------------------------------------------------Other------------------------------------------------------

void CCsdn9Dlg::OnOK() 
{
	// TODO: Add extra validation here
	//CreateStreamOnHGlobal
	//IPicture::Save
	LPBYTE lpBits=NULL;
	long size=0;
	HICON hicon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
	PICTDESC pdiconsrc;
	pdiconsrc.cbSizeofstruct=sizeof(PICTDESC);
	pdiconsrc.icon.hicon=hicon;
	pdiconsrc.picType=PICTYPE_ICON;
	IPicture* pIPicture=NULL;
    HRESULT hr;
	IDispatch* pDisp=NULL;
    hr = OleCreatePictureIndirect(&pdiconsrc, 
                                   IID_IDispatch, 
                                   TRUE, 
                                   (void**)&pDisp);
	if(SUCCEEDED(hr))
	{
		hr = pDisp->QueryInterface(&pIPicture);
		if(SUCCEEDED(hr))
		{
			lpBits = (LPBYTE) GlobalAlloc(GMEM_MOVEABLE|GMEM_NODISCARD, 64*1024);
			IStream* pStream;
			CreateStreamOnHGlobal(lpBits,false,&pStream);
			hr=pIPicture->SaveAsFile(pStream,false,&size);
			if(pStream)
				pStream->Release();
			if(SUCCEEDED(hr)&&size>0)
			{
				//you can use 
				char* pchar=(char*)lpBits;
				//icon is stored in pchar, length is size
				//to create another hicon
				//use OleLoadPicture(pStream,...)
				//IPicture::get_Handle to get the icon handle
			}
			pIPicture->Release();
			if(lpBits)
				GlobalFree((HGLOBAL)lpBits);
		}
		pDisp->Release();
	}
}


void SaveIcon(HICON hIconToSave, LPCTSTR sIconFileName)
{
	if(hIconToSave==NULL || sIconFileName==NULL)
		return;
	//warning: this code snippet is not bullet proof.
	//do error check by yourself [masterz]
	PICTDESC picdesc;
	picdesc.cbSizeofstruct = sizeof(PICTDESC);
	picdesc.picType = PICTYPE_ICON ;            
	picdesc.icon.hicon = hIconToSave;
	IPicture* pPicture=NULL;
	OleCreatePictureIndirect(&picdesc, IID_IPicture, TRUE,(VOID**)&pPicture);
	LPSTREAM pStream;
	CreateStreamOnHGlobal(NULL,TRUE,&pStream);
	LONG size;
	HRESULT hr=pPicture->SaveAsFile(pStream,TRUE,&size);
	char pathbuf[1024];
	strcpy(pathbuf,sIconFileName);
	CFile iconfile;
	iconfile.Open(pathbuf, CFile::modeCreate|CFile::modeWrite);
	LARGE_INTEGER li;
	li.HighPart =0;
	li.LowPart =0;
	ULARGE_INTEGER ulnewpos;
	pStream->Seek( li,STREAM_SEEK_SET,&ulnewpos);
	ULONG uReadCount = 1;
	while(uReadCount>0)
	{

		pStream->Read(pathbuf,sizeof(pathbuf),&uReadCount);
		if(uReadCount>0)
			iconfile.Write(pathbuf,uReadCount);
	}
	pStream->Release();
	iconfile.Close();
}

你可能感兴趣的:(Stream,validation,null,Integer,Path,interface)