创建新线程访问注册表

来源:互联网 发布:淘宝开手机店保证金 编辑:程序博客网 时间:2024/06/03 18:02

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 hereUpdateData(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 标名拷贝长度。


原创粉丝点击