|
보 고 일 자 |
2015.03.17(화) |
책임자 |
김 영 준 |
확 인 |
|
쇼 트 컷
<기술문서>
SunmoonBit 29기
김영준
목차
1. 쇼트컷 이란?
2. 쇼트컷 생성
3. 예제 소스
4. 실행 화면
1. 쇼트컷 이란?
쇼트컷은 현재 윈도우에서 바로가기로 번역되어 불려지고 있으며 파일에 대한 레퍼런스를 가지고 또 다른 파일이다.
확장자가 lnk이며 불과 몇백 바이트 크기 밖에 되지 않는다.
일반적으로 파일을 가리키며 쇼트컷을 더블클릭하면 가리키고 있는 파일이 열린다.
쇼트컷이라는 장치가 없다면 프로그램 메뉴는 온통 실행 파일들로 가득차게 될 것이다.
아래와 같이 해당 아이콘에 표시되있는 화살표 모양을 바로가기 표시라고 한다 이러한 바로가기가 바로 쇼트컷이다.
2. 쇼트컷 생성
쇼트컷 생성에는 IShellLink 인터페이스와 IPersistFile 인터페이스가 사용된다.
IShellLink 인터페이스를 이용하여 객체를 생성하며 쇼트컷의 속성을 설정하며 IPersistFile 인터페이스 Save 메소드를 이용해 저장한다.
.쇼트컷의 속성을 설정하거나 구하는 메소드들이 대부분이며 Get, Set 짝으로 이루어져 있다.
속성중 SetPath로 지정하는 완전 경로만 정확히 지정하면 나머지는 디폴트가 적용된다.
Save 메소드는 유니코드로 된 문자열만 인식하므로 쇼트컷이 저장될 경로를 유니코드 문자셋으로 변환한 후 호출해야 한다.
IShellLink로 만든 쇼트컷은 아직 메모리에만 작성되어 있으므로 IPersistFile 인터페이스의 Save 메소드로 파일로 저장해야 한다.
메소드 |
설명 |
GetPath, SetPath |
경로 |
GetArgument, SetArgument |
명령행 인수 |
GetDescription, SetDescription |
설명 |
GetHotKey, SetHotKey |
핫키 |
GetIconLocation, SetIconLocation |
아이콘 파일과 인덱스 |
GetIDList, SetIDList |
PIDL |
GetShowCmd, SetShowCmd |
초기 윈도우 상태 |
GetWorkingDirectory, SetWorkingDirectory |
작업 디렉토리 |
SetRelativePath |
상대 경로 |
Resolve |
쇼트컷의 위치를 찾는다. |
3. 예제 소스
//파일에 대한 쇼트컷을 만든다.
//szSrcFile : 쇼트컷 대상 파일의 풀 패스
//szLnkFile : 쇼트컷 파일의 풀 패스
//szArgument : 쇼트컷에 전달될 인수 문자열
//szDesc : 쇼트컷 설명 문자열
#include <windows.h>
#include <shlobj.h>
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam);
HRESULT MyCreateShortCut(LPCSTR szSrcFile, LPSTR szLnkFile, LPSTR szArgument, LPSTRszDesc);
LPCTSTR lpszClass=TEXT("ShortCut");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
///////////////////////////////////////////////////////////////
void OnCreate();
void OnLButtonDown();
void OnPaint();
void OnDestroy();
HDC hdc;
HWND hWnd;
PAINTSTRUCT ps;
TCHAR Note[MAX_PATH];
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch (iMessage)
{
case WM_CREATE: OnCreate(); break;
case WM_LBUTTONDOWN: OnLButtonDown();break;
case WM_PAINT: OnPaint(); break;
case WM_DESTROY: OnDestroy();break;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
void OnCreate()
{
CoInitialize(0);
}
void OnLButtonDown()
{
GetWindowsDirectory(Note, MAX_PATH);
lstrcat(Note, "\\Notepad.exe");
MyCreateShortCut(Note, "c:\\메모장으로 가기.lnk","","메모장");
MessageBox(hWnd,"바로가기를 만들었습니다","알림",MB_OK);
}
void OnPaint()
{
TCHAR *Mes = "마우스 왼쪽 버튼을 누르면 설치, 오른쪽 버튼을 누르면 제거";
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 10,10,Mes,lstrlen(Mes));
EndPaint(hWnd, &ps);
}
void OnDestroy()
{
PostQuitMessage(0);
}
////////////////////////////////////////////////////////////////////
IShellLink *pSl;
IPersistFile *pPf;
HRESULT MyCreateShortCut(LPCSTR szSrcFile, LPSTR szLnkFile, LPSTR szArgument, LPSTR szDesc)
{
HRESULT hr;
WCHAR wszLnkFile[MAX_PATH] = {0,};
// IShellLink 객체를 생성하고 포인터를 구한다.
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&pSl);
if(FAILED(hr))
{
return E_FAIL;
}
// 쇼트컷의 대상체와 설명을 설정한다.
pSl->SetPath(szSrcFile);
pSl->SetDescription(szDesc);
pSl->SetArguments(szArgument);
// 저장하기 위해 IPersistFile 객체를 생성한다.
hr=pSl->QueryInterface(IID_IPersistFile, (void **)&pPf);
if(FAILED(hr))
{
pSl->Release();
return E_FAIL;
}
// 유니코드로 파일 패스를 변경한 후 저장한다.
MultiByteToWideChar(CP_ACP, 0,szLnkFile, -1,wszLnkFile, MAX_PATH);
hr = pPf->Save(wszLnkFile, TRUE);
// 객체 해제
pPf->Release();
pSl->Release();
return hr;
}
4. 실행 화면