----老妖注:偶在Windows ADV 2000,C++ Builder 6.0下编译通过. :D API提供了一个叫做IShellLink的COM接口允许我们创建快捷方式。为在桌面创建快捷方式,我们创建一个IShellLink对象,设置它的属性,然后把这个link保存到desktop目录。 下面的例子代码演示了怎样创建一个快捷方式。在这个例子里,这个快捷方式保存在C:/根目录下。 //---------------------------------------------------------------------- #define NO_WIN32_LEAN_AND_MEAN #include <shlobj.h> #include <vcl.h> #pragma hdrstop
#include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if(OpenDialog1->Execute()) CreateShortCut(OpenDialog1->FileName); } //--------------------------------------------------------------------------- void TForm1::CreateShortCut(const AnsiString &file) { IShellLink* pLink; IPersistFile* pPersistFile; if(SUCCEEDED(CoInitialize(NULL))) { if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER, IID_IShellLink, (void **) &pLink))) { pLink->SetPath(file.c_str()); pLink->SetDescription("哈哈,你看到我了吧."); pLink->SetShowCmd(SW_SHOW); if(SUCCEEDED(pLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile))) { WideString strShortCutLocation("C://bcbshortcut.lnk"); pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE); pPersistFile->Release(); } pLink->Release(); } } } //---------------------------------------------------------------------- 上面的例子只是把快捷方式文件保存到了c:/根目录下,但没保存到desktop目录下。要让快捷方式出现在桌面上,只须把快捷方式文件保存到desktop目录下。首先我们要找到windows的desktop目录。一旦我们知道了desktop所在的目录,我们就能将快捷方式文件保存到desktop目录下。然后windows就能将快捷方式图标显示到桌面上。下面是经过改进了的例子: //---------------------------------------------------------------------- void TForm1::CreateShortCut(const AnsiString &file) { IShellLink *pLink; IPersistFile *pPersistFile; LPMALLOC ShellMalloc; LPITEMIDLIST DesktopPidl; char DesktopDir[MAX_PATH]; if(FAILED(SHGetMalloc(&ShellMalloc))) return; if(FAILED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOPDIRECTORY,&DesktopPidl))) return; if(!SHGetPathFromIDList(DesktopPidl, DesktopDir)) { ShellMalloc->Free(DesktopPidl); ShellMalloc->Release(); return; }
ShellMalloc->Free(DesktopPidl); ShellMalloc->Release();
if(SUCCEEDED(CoInitialize(NULL))) { if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&pLink))) { pLink->SetPath(file.c_str()); pLink->SetDescription("哈哈,你看到我了吧."); pLink->SetShowCmd(SW_SHOW); if(SUCCEEDED(pLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile))) { WideString strShortCutLocation(DesktopDir); strShortCutLocation += "//bcbshortcut.lnk"; pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE); pPersistFile->Release(); } pLink->Release(); } CoUninitialize(); } } //----------------------------------------------------------------------
不要陷于COM的泥沼之中 创建快捷方式包括一些对COM的使用。不要让你陷入到COM的复杂之中。COM只是创建和使用对象的一种方法。在这个例子里我们可以考虑不使用COM而是用等价的C++技术。
下面是COM的代码与等价C++代码对比,COM代码以浅色表示,等价C++以深色表示 IShellLink* pLink; IPersistFile* pPersistFile; | TShellLink *Link; TPersistFile *PersistFile; | CoInitialize(); CoCreateInstance(CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,/ (void **) &pLink) | Link = new TShellLink; | pLink->SetPath(file.c_str()); | Link->SetPath(file.c_str()); | pLink->SetShowCmd(SW_SHOW); | Link->SetShowCmd(SW_SHOW); | pLink->QueryInterface(IID_IPersistFile dynamic_cast<TPersistFile*>(Link); | PersistFile = (void **)&pPersistFile))) | pPersistFile->Save("C://", TRUE); | PersistFile->Save("C://"); | pPersistFile->Release(); pLink->Release(); | delete PersistFile delete Link; CoUninitialize(); |
|