Programming

바로가기(.lnk) 파일, 인터넷 바로가기(.url) 파일 생성 함수

굿쏘 2013. 6. 20. 13:37
#include <intshcut.h> 
 
 

BOOL CreateShortcut(LPCTSTR szTargetPath,
                    LPCTSTR szShortcutPath,
                    LPCTSTR szDesc = NULL,
                    LPCTSTR szArgument = NULL,
                    LPCTSTR szIconPath = NULL,
                    int iIconIndex = -1,
                    WORD wHotkey = 0,
                    int nShowCmd = SW_SHOW)
{
    // Validate parameters
    ASSERT(szTargetPath);
    ASSERT(szShortcutPath);

    HRESULT hRes;
    IUniformResourceLocator* purl = NULL;
    IShellLink* psl = NULL;
    IPersistFile* ppf = NULL;
    BOOL bRet = FALSE;

    ::CoInitialize(NULL);

    TCHAR szDrive[_MAX_DRIVE], szDir[_MAX_PATH], szExt[_MAX_EXT];
    _tsplitpath(szShortcutPath, szDrive, szDir, NULL, szExt);

    CString sExt = szExt;

    // Shortcut
    if (0 == sExt.CollateNoCase(_T(".lnk")))
    {
        hRes = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                                  IID_IShellLink, (LPVOID*)&psl);
        hRes = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
    }

    // URL Shortcut
    else if (0 == sExt.CollateNoCase(_T(".url")))
    {
        hRes = ::CoCreateInstance(CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER,
                                  IID_IUniformResourceLocator, (LPVOID*)&purl);
        if (SUCCEEDED(hRes))
        {
            hRes = purl->QueryInterface(IID_IShellLink, (LPVOID*)&psl);
            if (SUCCEEDED(hRes))
                hRes = purl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);
        }
    }
    else
    {
        // Shortcut file extention must be .lnk or .url
        ::CoUninitialize();
        return FALSE;
    }

    if (SUCCEEDED(hRes))
    {
        hRes = psl->SetPath(szTargetPath);
        if (szDesc)
            psl->SetDescription(szDesc);

        if (szArgument)
            psl->SetArguments(szArgument);

        if (szIconPath && iIconIndex >= 0)
            psl->SetIconLocation(szIconPath, iIconIndex);

        if (wHotkey)
            psl->SetHotkey(wHotkey);

        CString sDir;
        sDir.Format(_T("%s%s"), szDrive, szDir);
        psl->SetWorkingDirectory(sDir);
        psl->SetShowCmd(nShowCmd);

        USES_CONVERSION;
        hRes = ppf->Save(T2COLE(szShortcutPath), TRUE);
        if (hRes != S_OK)
            TRACE(_T("IPersistFile::Save Error\n"));
        else
            bRet = TRUE;

        ppf->Release();
        psl->Release();
        if (purl)
            purl->Release();
    }
    ::CoUninitialize();
    return bRet;
}

함수의 파라미터 개수가 많으니 설명이 조금 필요할 것 같네요. 각각의 파라미터의 역할은 다음과 같습니다.

szTargetPath

바로가기의 대상. 파일일 경우 대상 파일의 경로를, 웹페이지 일 경우에 웹페이지 주소를 입력

szShortcutPath

저장하려는 바로가기 파일의 경로. 바로가기의 확장자는 반드시 .lnk 이어야 하며 인터넷 바로가기의 확장자는 .url 이어야함

szDesc

바로가기에 대한 설명

szArgument

바로가기 실행 시 사용할 파라미터. 인터넷 바로가기의 경우는 NULL 전달

szIconPath

바로가기 아이콘의 경로. NULL로 설정할 경우 바로가기 대상의 아이콘을 그대로 사용

iIconIndex

szIconPath에서 설정한 아이콘 파일에서 실제 사용할 아이콘 인덱스

wHotkey

바로가기 키. 하위 바이트에는 Virtual keycode를, 상위바이트에는 modifier flag를 넣어주는 기본적인 핫키 형식

nShowCmd

실행 창의 형태를 지정. 기본은 SW_SHOW이며 SW_MAXIMIZE(최대화), SW_MINIMIZE(최소화) 등 사용 가능

szTargetPath와 szShortcutPath를 제외한 나머지 파라미터는 디폴트 파라미터를 가지고 있으므로 필요한 경우에만 전달해 주면 된니다. 그럼 이 함수를 이용하여 실제 바로가기 파일을 생성하는 코드를 작성해보도록 합시다

 

CreateShortcut(_T("C:\\Windows\\System32\\calc.exe"), _T("D:\\계산기.lnk"));
CreateShortcut(_T("http://devmachine.blog.me"), _T("D:\\DevMachineBlog.url"));

함수 호출이 성공하면 다음과 같이 지정된 경로에 바로가기 파일이 저장됩니다.

 

출처 : DevMachine’s Blog