当连接到64位版本的Windows上的性能注册表时,我看到一个奇怪的事情。整个程序停止并且调用堆栈变得不可读。长时间超时后,连接尝试中止,一切恢复正常。问题RegConnectRegistry连接到64位机器
唯一的解决方案是确保当时只有一个线程在查询远程注册表,除非远程计算机是32位Windows XP,2003,2000,那么您可以使用任意数量的线程。
有没有人有技术解释为什么会发生这种情况?我花了2-3天的时间搜索网页,而没有提出任何问题。
这是一个测试程序,先用一个线程(连接到64位Windows)运行它,然后删除tmain中的注释并使用4个线程运行它。运行一个线程按预期运行,运行4,在停顿一段时间后返回ERROR_BUSY(dwRet == 170)。
请记住在运行程序之前在RegConnectRegistry中正确设置远程机器。
#define TOTALBYTES 8192
#define BYTEINCREMENT 4096
void PerfmonThread(void *pData)
{
DWORD BufferSize = TOTALBYTES;
DWORD cbData;
DWORD dwRet;
PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc(BufferSize);
cbData = BufferSize;
printf("\nRetrieving the data...");
HKEY hKey;
DWORD dwAccessRet = RegConnectRegistry(L"REMOTE_MACHINE",HKEY_PERFORMANCE_DATA,&hKey);
dwRet = RegQueryValueEx(hKey,L"global",NULL,NULL,(LPBYTE) PerfData, &cbData);
while(dwRet == ERROR_MORE_DATA)
{
// Get a buffer that is big enough.
BufferSize += BYTEINCREMENT;
PerfData = (PPERF_DATA_BLOCK) realloc(PerfData, BufferSize);
cbData = BufferSize;
printf(".");
dwRet = RegQueryValueEx(hKey,L"global",NULL,NULL,(LPBYTE) PerfData,&cbData);
}
if(dwRet == ERROR_SUCCESS)
printf("\n\nFinal buffer size is %d\n", BufferSize);
else
printf("\nRegQueryValueEx failed (%d)\n", dwRet);
RegCloseKey(hKey);
}
int _tmain(int argc, _TCHAR* argv[])
{
_beginthread(PerfmonThread,0,NULL);
/* _beginthread(PerfmonThread,0,NULL);
_beginthread(PerfmonThread,0,NULL);
_beginthread(PerfmonThread,0,NULL);
*/
while(1)
{
Sleep(2000);
}
}
什么窗户? XP?你是否也尝试过使用不同的64位安装(另一台机器)?你是从32位机器查询吗? (XP?Vista?)如何从另一台(或同一台)64位机器查询64位机器? – vladr 2010-03-29 16:19:30
问题是,32位应用程序试图同时访问多个线程的64位Windows版本。如果程序主机是64位或32位Windows,则无关紧要。据我所知,这适用于所有64位版本的Windows。 – ROAR 2010-03-30 07:31:01