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;
}
memcpy(rec, (LPVOID)lParam, KEY_LEN); lParam指向源数组首地址,KEY_LEN 标名拷贝长度。