C++ 添加程序圖標到個人電腦

C++ 像個人電腦中 百度網盤的 那圖標快捷方式。如何生成的呢?設置程序圖標到個人電腦 請看下邊代碼 就ok了(*^__^*) 嘻嘻……ios

相似下圖:shell

 

你們若是看我下邊的不是很清楚,能夠下載這個具體工程;編程

這裏是我編譯的和一個測試Demo:http://pan.baidu.com/s/1dDBYJux
windows

QQ羣:103197177 C++進階討論;歡迎喜歡編程朋友加入進來一塊兒討論學習;函數

 

注意:在WIN7及以上的系統中,請以官員權限運行代碼;學習

函數說明:測試

SetProgramToNameSpace:設置程序圖標到個人電腦 
DelSubKey: 取消設置,刪除程序圖標

 

#include <windows.h>
#include <iostream>
#include <tchar.h>

#ifndef _TRACE
#define _TRACE(__VA_ARGS__) OutputDebugString(__VA_ARGS__)
#endif

#define  STRNAMESPACE _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\")
#define  STRCLSID _T("SOFTWARE\\Classes\\CLSID\\")

// 設置圖標到個人電腦
//
lpszProPath省略 默認給本程序添加圖標到個人電腦,不然給指定程序添加圖標到個人電腦
BOOL SetProgramToNameSpace(LPCTSTR lpszKeyName, LPCTSTR lpszGUID, LPCTSTR lpszProPath = NULL);

// 建立註冊表項
BOOL CreateSubkey(HKEY hKey, LPCTSTR lpszSubkey, HKEY& hResult);

// 寫入註冊表鍵值
BOOL WritRegValue(HKEY hKey, LPCTSTR lpszValue, DWORD dwType = REG_SZ);

// 刪除註冊表項
BOOL DelRegKey(LPCTSTR lpszSubkey);

// 刪除寫入的註冊表項
void DelSubKey(LPCTSTR lpszGUID);


int main(void)
{
    if (SetProgramToNameSpace(_T("測試"), _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}")))
    {
        std::cout << "在個人電腦 中建立圖標成功!" << std::endl;
    }
    else
    {
        std::cout << "在個人電腦 中建立圖標失敗!" << std::endl;
        std::cout << "請以右鍵管理員權限運行!" << std::endl;
    }

    // 刪除鍵值項(用於清理個人電腦裏邊的圖標)
    //DelSubKey(_T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}"));
    system("pause");

    return 0;
}

BOOL CreateSubkey(HKEY hKey, LPCTSTR lpszSubkey, HKEY& hResult)
{
    DWORD dwDisposition = REG_CREATED_NEW_KEY;
    if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_LOCAL_MACHINE, lpszSubkey, 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS | KEY_WOW64_64KEY, NULL, &hResult, &dwDisposition))
    {
        _TRACE(_T("NameSpace:寫註冊表%s項失敗!\n"), lpszSubkey);
        return FALSE;
    }
    return TRUE;
}

BOOL WritRegValue(HKEY hKey, LPCTSTR lpszValue, DWORD dwType)
{
    if (ERROR_SUCCESS != RegSetValueEx(hKey, NULL, 0, dwType, (BYTE*)lpszValue, sizeof(TCHAR)*(_tcsclen(lpszValue) + 2*sizeof(TCHAR))))
    {
        _TRACE(_T("NameSpace:寫註冊表鍵值%s失敗!\n"), lpszKeyName);
        return FALSE;
    }
    return TRUE;
}

BOOL SetProgramToNameSpace(LPCTSTR lpszKeyName, LPCTSTR lpszGUID, LPCTSTR lpszProPath)
{
    BOOL bSuccess = FALSE;
    HKEY hSubKey = NULL;
    HKEY hSubKeyCLSID = NULL;
    HKEY hSubKeyDef = NULL;
    HKEY hSubKeyShell = NULL;
    HKEY hSubKeyOpen = NULL;
    HKEY hSubKeyCommand = NULL;

    try
    {
        // NameSpace
        TCHAR szSubKey[MAX_PATH] = STRNAMESPACE;
        _stprintf_s(szSubKey, _T("%s%s"), STRNAMESPACE,lpszGUID);
        if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKey))
        {
            throw(_T("NameSpace:建立註冊表%s項失敗!\n"), lpszGUID);
        }
        if (!WritRegValue(hSubKey, lpszKeyName))
        {
            throw(_T("NameSpace:寫註冊表鍵值%s失敗!\n"), lpszKeyName);
        }


        // CLSID
        _stprintf_s(szSubKey, _T("%s%s"), STRCLSID,lpszGUID);
        if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyCLSID))
        {
            throw(_T("CLSID:建立註冊表%s項失敗!\n"), lpszGUID);    
        }
        if (!WritRegValue(hSubKeyCLSID, lpszKeyName))
        {
            throw(_T("CLSID:寫註冊表%s項失敗!\n"), lpszGUID);
        }

        _stprintf_s(szSubKey, _T("%s%s\\DefaultIcon"), STRCLSID,lpszGUID);
        if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyDef))
        {
            throw(_T("CLSID:建立註冊表%s項失敗!\n"), lpszGUID);
        }

        // DefaultIcon
        TCHAR szExePath[MAX_PATH] = { 0 };
        if (!lpszProPath)
        {
            GetModuleFileName(NULL, szExePath, MAX_PATH);
            if (!WritRegValue(hSubKeyDef, szExePath))
            {
                throw(_T("CLSID-DefaultIcon:寫註冊表%s項失敗!\n"), szExePath);
            }
        }
        else if (!WritRegValue(hSubKeyDef, lpszProPath))
        {
            throw(_T("CLSID-DefaultIcon:寫註冊表%s項失敗!\n"), lpszProPath);
        }

        // shell
        _stprintf_s(szSubKey, _T("%s%s\\shell"), STRCLSID,lpszGUID);
        if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyShell))
        {
            throw(_T("CLSID-shell:建立註冊表%s項失敗!\n"), _T("shell"));
        }

        // Open
        _stprintf_s(szSubKey, _T("%s%s\\shell\\Open"), STRCLSID,lpszGUID);
        if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyOpen))
        {
            throw(_T("CLSID-Open:建立註冊表%s項失敗!\n"), _T("Open"));
        }

        // Command
        _stprintf_s(szSubKey, _T("%s%s\\shell\\Open\\Command"), STRCLSID,lpszGUID);
        if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyCommand))
        {
            throw(_T("CLSID-Command:建立註冊表%s項失敗!\n"), _T("Command"));
        }

        if (!lpszProPath)
        {
            if (!WritRegValue(hSubKeyCommand, szExePath))
            {
                throw(_T("CLSID-DefaultIcon:寫註冊表%s項失敗!\n"), szExePath);
            }
        }
        else if (!WritRegValue(hSubKeyCommand, lpszProPath))
        {
            throw(_T("CLSID-DefaultIcon:寫註冊表%s項失敗!\n"), lpszProPath);
        }
        bSuccess = TRUE;
    }
    catch (TCHAR* pError)
    {
        _TRACE(pError);
    }

    // 關閉註冊表
    if (hSubKey)
        RegCloseKey(hSubKey);
    if (hSubKeyCLSID)
        RegCloseKey(hSubKeyCLSID);
    if (hSubKeyDef)
        RegCloseKey(hSubKeyDef);
    if (hSubKeyShell)
        RegCloseKey(hSubKeyShell);
    if (hSubKeyOpen)
        RegCloseKey(hSubKeyOpen);
    if (hSubKeyCommand)
        RegCloseKey(hSubKeyCommand);

    return bSuccess;
}

BOOL DelRegKey(LPCTSTR lpszSubkey)
{
    HKEY hResult = NULL;
    if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubkey,    0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hResult))
    {
        if (ERROR_SUCCESS != RegDeleteKey(hResult, _T("")))
        {
            _TRACE(_T("刪除%s項失敗\n"), lpszSubkey);
        }
        RegCloseKey(hResult);
        return TRUE;
    }
    return FALSE;
}

void DelSubKey(LPCTSTR lpszGUID)
{
    TCHAR szSubKey[MAX_PATH] = {0};
    _stprintf_s(szSubKey, _T("%s%s"), STRNAMESPACE,lpszGUID);
    DelRegKey(szSubKey);

    _stprintf_s(szSubKey, _T("%s%s\\DefaultIcon"), STRCLSID, lpszGUID);
    DelRegKey(szSubKey);

    _stprintf_s(szSubKey, _T("%s%s\\shell\\Open\\Command"), STRCLSID, lpszGUID);
    DelRegKey(szSubKey);

    _stprintf_s(szSubKey, _T("%s%s\\shell\\Open"), STRCLSID, lpszGUID);
    DelRegKey(szSubKey);

    _stprintf_s(szSubKey, _T("%s%s\\shell"), STRCLSID, lpszGUID);
    DelRegKey(szSubKey);
}
相關文章
相關標籤/搜索