创建新线程访问注册表

1 首先建立一个MFC(EXE)的工程, 选择DIALOG 模式,在面板上添加一个button, 和一个LISTBOX 控件,LISTBOX添加一个对象  CLISTBOX  m_listBox.

2 点击查询按钮之后,在该响应函数中创建新进程,该进程完成对注册表的访问。

3,新进程访问注册表,去得访问结果,发送回RegOpen 界面响应。在MFC中添加自己定义的消息详情请参考前2篇文章。

详细代码如下:

void CRegOpenDlg::OnBnClickedReach()
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	hThread = CreateThread(NULL, 0, /*(LPTHREAD_START_ROUTINE)*/threadProc, this ,0, &threadID);
	UpdateData(FALSE);
	CloseHandle(hThread);
	//hThread - INVALID_HANDLE_VALUE;
}
 

DWORD  __stdcall threadProc(LPVOID lparam)
{
	HKEY hKey;

	CRegOpenDlg  *cReg = (CRegOpenDlg *)lparam;

	if(ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, SUB_KEY, 0, KEY_READ, &hKey) )
	{
	//   MessageBox("failed in second");
		return -1;
	}

	DWORD dwIndex = 0;
	LONG  lRet;
	DWORD cbName = KEY_LEN;
	TCHAR *lpszSubKeyName = new TCHAR[KEY_LEN];
	while((lRet = ::RegEnumKeyEx(hKey, dwIndex, szSubKeyName, &cbName, NULL, NULL, NULL, NULL)) != ERROR_NO_MORE_ITEMS)
	{
       if(lRet != ERROR_SUCCESS)
	   {
	//		MessageBox("failed in second");
			continue;;
	   }
	  // m_aPrograms.Add(szSubKeyName);
	   SendMessage(cReg->m_hWnd, MY_MESSAGE , NULL, (LPARAM)lpszSubKeyName);
	   ++dwIndex;
	   cbName = KEY_LEN;
	}
	::RegCloseKey(hKey);

	delete[] lpszSubKeyName;
	return 0;
}


 LRESULT CRegOpenDlg::OnMyMessage(WPARAM  wParam,   LPARAM lParam)
 {		

	 int n = 1;
	 TCHAR rec[KEY_LEN];
	 memcpy(rec, (LPVOID)lParam, KEY_LEN);
	 m_listBox.AddString(rec);
	 return 0;
 }


在DWORD  __stdcall threadProc(LPVOID lparam) 这个处理函数中,这种要注明调用方式:__STDCALL,进行查找,发送MY_MESSAGE消息,接收到该消息后,OnMyMessage()进行处理, 带进来的是带了查到文件名字的TCHAR 数组。重新定义一个 TCHAR rec[KEY_LEN]数组,利用mencpy函数进行拷贝,

 memcpy(rec, (LPVOID)lParam, KEY_LEN);  lParam指向源数组首地址,KEY_LEN 标名拷贝长度。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值