매번 프로그램을 작성하여 배포할 때마다 해당 프로그램의 아이콘을 등록하는게 문제더군요
Installshield나 Wise Installer를 사용안하고 어떻게 하면 프로그램아이콘을 등록할수 있을까 고민하여 뒤지던 끝에 좋은 방법이 있음을 발견하고 이렇게 올려봅니다.
저는 배포프로그램이 자주 업데이트되고 설치프로그램의 크기를 줄이기 위해서 자동다운로드 프로그램을 만들어 그것만 배포하고 이를 실행하면 필요한 라이브러리 및 실행프로그램, DB를 다운로드 받아 이를 이용하는 구조로 개발하였습니다. 그러다 보니 실행프로그램의 아이콘 등록이 문제더군요.
구글 뉴스그룹에서 참조하여 맹글어보게 되었슴다. 여러분도 여기한번 가보세요. 수많은 노하우들이 ㅎㅎㅎ.
http://groups.google.com/groups?hl=ko&lr=&ie=UTF-8&inlang=ko&group=borland.public.cppbuilder
//요놈들은 같이 넣에 주셔야 합니다. 분리하니까 에러가 나네요.
#define FVSHOWINFO xxFVSHOWINFOxx
#define FOLDERSETTINGS xxFOLDERSETTINGSxx
#define DESKBANDINFO xxDESKBANDINFOxx
#define SHELLFLAGSTATE xxSHELLFLAGSTATExx
#include <shlobj.h>
void __fastcall TfMain::CreateShortCut(const AnsiString &file, AnsiString path)
{
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();
//Program Menu등록을 위해 경로얻기
AnsiString p_path, q_path;
char szPath[MAX_PATH];
if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, szPath)))
{
p_path = szPath;
p_path+="\\KFS";
if (!DirectoryExists(p_path))
CreateDir(p_path);
}
//익스플로러 Quick Launch에 등록을 위해 경로얻기
if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szPath)))
{
q_path = szPath;
q_path+="\\Microsoft\\Internet Explorer\\Quick Launch";
}
if(SUCCEEDED(CoInitialize(NULL)))
{
if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **) &pLink)))
{
pLink->SetPath(file.c_str());
pLink->SetWorkingDirectory(path.c_str());
//pLink->SetDescription("M2 OTC Deriva");
pLink->SetShowCmd(SW_SHOW);
if (SUCCEEDED (pLink->QueryInterface(IID_IPersistFile, (void **) &pPersistFile)))
{
//Program Menu에 등록
WideString strShortCut(p_path);
strShortCut+= "\\OTC Deriva.lnk";
pPersistFile->Save(strShortCut.c_bstr(), TRUE);
//Quick Lauch에 등록
WideString strShortCutQ(q_path);
strShortCutQ+= "\\OTC Deriva.lnk";
pPersistFile->Save(strShortCutQ.c_bstr(), TRUE);
//바탕화면에 아이콘 등록
WideString strShortCutLocation(DesktopDir);
strShortCutLocation += "\\OTC Deriva.lnk";
pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE);
pPersistFile->Release();
}
pLink->Release();
}
CoUninitialize();
}
}