在Win案頭建立捷徑

來源:互聯網
上載者:User

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->SetDeion(/"哈哈,你看到我了吧./");
            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;
    LP99vEMIDLIST 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->SetDeion(/"哈哈,你看到我了吧./");
            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();

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.