添加程序图标到我的电脑

simple 2019-03-06 10:29:34
采用了https://www.cnblogs.com/calm2012/p/3619500.html方法在“我的电脑”中添加了我的程序的图标,但后来就不知道怎么就不出现了,看了注册表,发现添加的项都是正常的。但换了个GUID就有了,不知道是什么原因?
代码如下:

#ifndef _TRACE
#define _TRACE(fmt, ...) OutputDebugString(fmt, __VA_ARGS__)
#endif
#define STRNAMESPACE _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\")
#define STRCLSID _T("SOFTWARE\\Classes\\CLSID\\") // 设置图标到我的电脑
// lpszProPath省略 默认给本程序添加图标到我的电脑,否则给指定程序添加图标到我的电脑
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 WriteRegValue(HKEY hKey,LPCTSTR lpszValueName, LPCTSTR lpszValue, DWORD dwType = REG_SZ)
{
if (ERROR_SUCCESS != RegSetValueExA(hKey, lpszValueName, 0, dwType, (BYTE*)lpszValue, sizeof(TCHAR)*(_tcsclen(lpszValue) + 2*sizeof(TCHAR))))
{
_TRACE(_T("NameSpace:写注册表键值%s失败!\n"), lpszValue);
return FALSE;
}
return TRUE;
}
BOOL DelRegKey(HKEY hMainKey, LPCTSTR lpszSubkey)
{
HKEY hResult = NULL;
if (ERROR_SUCCESS == RegOpenKeyEx(hMainKey, lpszSubkey, 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hResult))
{
DWORD dwCount = 0;
if(RegQueryInfoKey(hResult,NULL,NULL,NULL,&dwCount,NULL,NULL,NULL,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
{
TCHAR szName[MAX_PATH] = {0};
for (int i = 0; i < dwCount; ++i)
{
if (ERROR_SUCCESS == RegEnumKey(hResult, i, szName, MAX_PATH))
{
if (ERROR_SUCCESS != RegDeleteKey(hResult, szName))
{
_TRACE(_T("删除[%s][%s]项失败\n"), lpszSubkey, szName);
}
}
}
}
if (ERROR_SUCCESS != RegDeleteKey(hResult, _T("")))
{
_TRACE(_T("删除%s项失败\n"), lpszSubkey);
}
RegCloseKey(hResult);
return TRUE;
}
return FALSE;
}

BOOL SetProgramToNameSpace(LPCTSTR lpszGUID, LPCTSTR lpszKeyName, LPCTSTR lpszInfoTip, LPCTSTR lpszAuthor, LPCTSTR lpszProPath = NULL)
{
BOOL bSuccess = FALSE;
HKEY hSubKeyCLSID = NULL;
HKEY hSubKeyDefault = NULL;
HKEY hSubKeyShell = NULL;
HKEY hSubKeyOpen = NULL;
HKEY hSubKeyCommand = NULL;
HKEY hSubKeyNameSpace = NULL;

try
{
// CLSID
TCHAR szSubKey[MAX_PATH] = {0};
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyCLSID))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), lpszGUID);
}
if (!WriteRegValue(hSubKeyCLSID, NULL, lpszKeyName))
{
throw(_T("CLSID:写注册表[][%s]项失败!\n"), lpszKeyName);
}
if (!WriteRegValue(hSubKeyCLSID, _T("InfoTip"), lpszInfoTip))
{
throw(_T("CLSID:写注册表[%s][%s]项失败!\n"), _T("InfoTip"), lpszInfoTip);
}
if (!WriteRegValue(hSubKeyCLSID, _T("System.ItemAuthors"), lpszAuthor))
{
throw(_T("CLSID:写注册表[%s][%s]项失败!\n"), _T("System.ItemAuthors"), lpszAuthor);
}
if (!WriteRegValue(hSubKeyCLSID, _T("TileInfo"), _T("prop:System.ItemAuthors")))
{
throw(_T("CLSID:写注册表[%s][%s]项失败!\n"), _T("TileInfo"), _T("prop:System.ItemAuthors"));
}

TCHAR szExePath[MAX_PATH] = {0};
if (NULL == lpszProPath)
{
GetModuleFileName(NULL, szExePath, MAX_PATH);
}
else
{
strcpy_s(szExePath, MAX_PATH, lpszProPath);
}
// DefaultIcon
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s\\DefaultIcon"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyDefault))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), _T("DefaultIcon"));
}
if (!WriteRegValue(hSubKeyDefault, NULL, szExePath))
{
throw(_T("CLSID-DefaultIcon:写注册表[][%s]项失败!\n"), szExePath);
}

// shell
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s\\shell"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyShell))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), _T("shell"));
}

// shell\Open
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s\\shell\\Open"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyOpen))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), _T("Open"));
}

// shell\Open\Command
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s\\shell\\Open\\Command"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyCommand))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), _T("Command"));
}
if (!WriteRegValue(hSubKeyCommand, NULL, szExePath))
{
throw(_T("CLSID-Command:写注册表[][%s]项失败!\n"), szExePath);
}


// NameSpace
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s"), STRNAMESPACE, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyNameSpace))
{
throw(_T("NameSpace:创建注册表[%s]项失败!\n"), lpszGUID);
}
if (!WriteRegValue(hSubKeyNameSpace, NULL, lpszKeyName))
{
throw(_T("NameSpace:写注册表键值[][%s]失败!\n"), lpszKeyName);
}

bSuccess = TRUE;
}
catch (TCHAR *pError)
{
_TRACE("%s", pError);
}


if (NULL != hSubKeyNameSpace)
{
RegCloseKey(hSubKeyNameSpace);
}
if (NULL != hSubKeyCommand)
{
RegCloseKey(hSubKeyCommand);
}
if (NULL != hSubKeyOpen)
{
RegCloseKey(hSubKeyOpen);
}
if (NULL != hSubKeyShell)
{
RegCloseKey(hSubKeyShell);
}
if (NULL != hSubKeyDefault)
{
RegCloseKey(hSubKeyDefault);
}
if (NULL != hSubKeyCLSID)
{
RegCloseKey(hSubKeyCLSID);
}

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

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

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

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

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

_stprintf_s(szSubKey, _T("%s%s"), STRCLSID, lpszGUID);
DelRegKey(HKEY_LOCAL_MACHINE, szSubKey);
}



void CdialogTestDlg::OnBnClickedChkShowincomputer()
{
// TODO: 在此添加控件通知处理程序代码
//CString strGUID = _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}");
CString strGUID = _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C8}");
BOOL bCheck = ((CButton*)GetDlgItem(IDC_CHK_SHOWINCOMPUTER))->GetCheck();
if (bCheck)
{
CString strExePath;
GetDlgItemText(IDC_EDIT_FILE, strExePath);
if (strExePath.Trim().IsEmpty())
{
SetProgramToNameSpace(strGUID.GetString(), _T("测试"), _T("infoTip"), _T("author"));
}
else
{
SetProgramToNameSpace(strGUID.GetString(), _T("测试"), _T("infoTip"), _T("author"), strExePath.GetString());
}
}
else
{
DelSubKey(strGUID.GetString());
}
}
void CdialogTestDlg::OnBnClickedChkShowincomputer2()
{
// TODO: 在此添加控件通知处理程序代码
BOOL bCheck = ((CButton*)GetDlgItem(IDC_CHK_SHOWINCOMPUTER2))->GetCheck();
CString strGUID = _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}");
//CString strGUID = _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C8}");
if (bCheck)
{
CString strExePath;
GetDlgItemText(IDC_EDIT_FILE, strExePath);
if (strExePath.Trim().IsEmpty())
{
SetProgramToNameSpace(strGUID.GetString(), _T("测试2"), _T("infoTip"), _T("author"));
}
else
{
SetProgramToNameSpace(strGUID.GetString(), _T("测试2"), _T("infoTip"), _T("author"), strExePath.GetString());
}
}
else
{
DelSubKey(strGUID.GetString());
}
}
...全文
197 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
simple 2019-03-06
  • 打赏
  • 举报
回复
在“我的电脑”添加程序图标失败
现象:EDP中,在设置中可以设置在“我的电脑”中显示EDP程序图标,但(部分电脑)没有出现该图标;
原因:发现在注册表中多了一下信息(S-1-5-21-2952986073-3457578198-780772306-1571为用户名称,不同机器不一样): [HKEY_USERS\S-1......\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}]
[HKEY_USERS\S-1......\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}\ShellFolder]
"Attributes"=dword:00100000
具体作用还不知道,但会导致其在“我的电脑”中不显示该图标。
解决办法:删除该项,并重启电脑(或重启explorer.exe)即可,或者将attributes的值设置为0。不知道在哪里添加这个项。
以上是原因,但这个注册项是怎么添加的就不知道了。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧