用BCB在windows桌面建立快捷方式 (轉)

worldblog發表於2007-12-06
用BCB在windows桌面建立快捷方式 (轉)[@more@]

  提供了一個叫做ILink的COM介面允許我們建立快捷方式。為在桌面建立快捷方式,我們建立一個IShellLink,設定它的屬性,然後把這個link儲存到desktop目錄。

  下面的例子程式碼演示了怎樣建立一個快捷方式。在這個例子裡,這個快捷方式儲存在C:Drive目錄下。//----------------------------------------------------------------------
include
 
void __fastcall TForm1::Button1Click(T *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("Woo hoo, look at Homer's shortcut");
  pLink->SetShowCmd(SW_SHOW);
  if(SUCCEEDED(pLink->QueryInterface(IID_IPersistFile,
  (void **)&pPersistFile)))
  {
  WString strShortCutLocation("C:bcbshortcut.lnk");
  pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE);
  pPersistFile->Release();
  }
  pLink->Release();
  }
 
  CoUninitialize();
  }
}

  上面的例子只是把快捷方式儲存到了c:drive目錄下,但沒儲存到desktop目錄下。

  要讓快捷方式出現在桌面上,只須把快捷方式檔案儲存到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("Woo hoo, look at Homer's shortcut");
  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++技術。code  C++ psuedo-equivalent
IShellLink*  pLink;  TShellLink  *Link;
IPersistFile* pPersistFile;  TPersistFile *PersistFile;
 
CoInitialize();
 
 
CoCreateInstance(CLSID_ShellLink,  Link = new TShellLink;
  NULL,
  CLSCTX_INPROC_SERVER,
  IID_IShellLink,
  (void **) &pLink)
 
 
pLink->SetPath(file.c_str());  Link->SetPath(file.c_str());
pLink->SetShowCmd(SW_SHOW);  Link->SetShowCmd(SW_SHOW);
 
 
 
pLink->QueryInterface(IID_IPersistFile  PersistFile =
  (void **)&pPersistFile)))  dynamic_cast(Link);
 
pPersistFile->Save("C:", TRUE);  PersistFile->Save("C:");
 
 
 
pPersistFile->Release();  delete PersistFile
pLink->Release();  delete Link;
 
CoUninitialize();

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989079/,如需轉載,請註明出處,否則將追究法律責任。

相關文章