C/C++编辑注册表实现文件与程序的关联

s如何设置程序与文件关联并且双击关联文件时获取文件的路径呢? - 复苏森林 - 博客园 (cnblogs.com)https://www.cnblogs.com/limaoshengcpp/archive/2012/03/21/2409474.html一、首先代码部分可以参考上面大佬的链接;经过测试 代码部分是没有问题的(完整代码参考链接中代码)。需要注意的点在于:要想编辑注册表 你的程序必须先取得管理员权限;下面的部分注释是容易出现结果不同的地方

//关键函数:实现写注册表的函数

BOOL SetRegistryValue(
HKEY hOpenKey,
LPCTSTR szKey,
LPCTSTR szValue,
LPCTSTR szData
){
// validate input
if( !hOpenKey || !szKey || !szKey[0] ||
!szValue || !szData ){
::SetLastError(E_INVALIDARG);
return FALSE;
}

BOOL bRetVal = FALSE;
DWORD dwDisposition;
DWORD dwReserved = 0;
HKEY hTempKey = (HKEY)0;

// length specifier is in bytes, and some TCHAR
// are more than 1 byte each
DWORD dwBufferLength = lstrlen(szData) * sizeof(TCHAR);

// Open key of interest
// Assume all access is okay and that all keys will be stored to file
// Utilize the default security attributes
//假如没有取得管理员权限RegCreateKeyEx和RegSetValueEx的返回值会等于ERROR_SUCCESS 会直接跳出
//去 也就是设置键值失败了,关联也就失败了
if( ERROR_SUCCESS == ::RegCreateKeyEx(hOpenKey, szKey, dwReserved,            
         
(LPTSTR)0, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, 0,
&hTempKey, &dwDisposition) ){

// dwBufferLength must include size of terminating nul
// character when using REG_SZ with RegSetValueEx function
dwBufferLength += sizeof(TCHAR);

if( ERROR_SUCCESS == ::RegSetValueEx(hTempKey, (LPTSTR)szValue,
dwReserved, REG_SZ, (LPBYTE)szData, dwBufferLength) ){
bRetVal = TRUE;
}
}

// close opened key
if( hTempKey ){
::RegCloseKey(hTempKey);
}

return bRetVal;
}

二、获取管理员权限,由于自己使用的是visual studio 所以可以在项目-属性-链接器-清单文件把UAC执行级别设置为 requireAdministrator;设置成功后点击编译运行会弹出对话框重新启动项目,说明已经设置成功;此时上面代码已经可以完美关联文件和程序了(关联的后缀名最好不要和主流的或已有的重复),不放心可以删除注册表中生成的键值文件 ,并重新运行代码。可以反复验证。顺便一提可以ctrl+f搜索注册表中你关联的后缀名,查找时可以把值和数据的勾去掉,只留项和全字匹配,这样会快一点。

三、如果使用的不是visual studio 或者想用代码实现获取管理员权限 ;大致思路是先检测当前进程是否是管理员权限,若不是重新启动一个新程序,并关掉当前程序;因为在运行过程中无法重新修改自身权限(网上查的结果是这样,如有不对欢迎指正)。贴一段代码

INT CMainDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	TCHAR szProgPath[MAX_PATH * 2];
	INT length = sizeof(szProgPath);
	GetModuleFileName(NULL, szProgPath, length/sizeof(TCHAR));//获取当前文件路径
	if (!GainAdminPrivileges(szProgPath))//获取管理员权限
		CSimpleWnd::DestroyWindow();//销毁当前进程窗口
	return 0;
}
BOOL CMainDlg::GainAdminPrivileges(SStringT appName)//获取管理员权限
{
	if (IsProRunAsAdmin())//先判断是否已经是管理员权限 若是返回true
		return TRUE;
	SHELLEXECUTEINFOW execinfo;//走到这代表需要以管理员权限运行一个新进程
	memset(&execinfo, 0, sizeof(execinfo));
	execinfo.lpFile = appName;
	execinfo.cbSize = sizeof(execinfo);
	execinfo.lpVerb = L"runas";//实现管理员权限主要部分
	execinfo.fMask = SEE_MASK_NO_CONSOLE;
	execinfo.nShow = SW_SHOWDEFAULT;
	ShellExecuteEx(&execinfo);//重新打开一个新进程
	return FALSE;
}
BOOL CMainDlg::IsProRunAsAdmin()//判断当前进程是否是管理员权限
{
	SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
	PSID AdminGroup;
	BOOL b_right = AllocateAndInitializeSid(
		&NtAuthority,
		2,
		SECURITY_BUILTIN_DOMAIN_RID,
		DOMAIN_ALIAS_RID_ADMINS,
		0, 0, 0, 0, 0, 0,
		&AdminGroup
	);
	if (b_right)
	{
		CheckTokenMembership(NULL, AdminGroup, &b_right);
		FreeSid(AdminGroup);
	}
	return b_right == TRUE;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值