當連接到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