C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[438] 바탕화면 및 프로그램메뉴에 아이콘 추가하기
HoHoMaN [chungsg] 8084 읽음    2004-09-03 08:56
매번 프로그램을 작성하여 배포할 때마다 해당 프로그램의 아이콘을 등록하는게 문제더군요
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();
    }
}

+ -

관련 글 리스트
438 바탕화면 및 프로그램메뉴에 아이콘 추가하기 HoHoMaN 8084 2004/09/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.