2012-09-03 26 views
0
HKEY hKey = 0; 
DWORD dwType = REG_SZ; 
TCHAR buf[255] = {0}; 
DWORD dwBufSize = sizeof(buf); 
DWORD ret; 
CComboBox m_portCombo; 

if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) 
{ 
    if(RegQueryValueEx(hKey, TEXT("\\Device\\Serial0"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS) 
    { 
     CString str = buf; 
     m_portCombo.AddString(str); 
    } 

    if(RegQueryValueEx(hKey, TEXT("\\Device\\Serial1"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS) 
    { 
     CString str = buf; 
    } 

    if(RegQueryValueEx(hKey, TEXT("\\Device\\Serial2"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS) 
    { 
     CString str = buf; 
    } 

    if(RegQueryValueEx(hKey, TEXT("\\Device\\Serial3"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS) 
    { 
     CString str = buf; 
    } 
} 

第一個問題:我想改變TEXT("\\Device\\Serial3")喜歡的東西TEXT("\\Device\\Serial",%i),這樣我就可以繼續代碼爲for loop.Is所有行tehre的方式來做到這一點?MFC acombo框中添加字符串

問題二:如果我用m_portCombo.AddString(str);我得到一個錯誤Debug Assertion Failed!,並且,當然,組合框不與註冊表值填充。爲什麼會發生?

回答

1

第一個問題:使用CString格式()函數使用%d作爲整數。

for (int i =0 ; i<10; i++) 
{ 
    CString szPath; 
    szPath.Format(TEXT("\\Device\\Serial%d"),i); 
    // ... 
} 

問題二: 可能有很多原因,這將會失敗。最有可能的是尚未創建組合框(它在添加字符串之前需要一個窗口句柄)要找出調試斷言的原因,請單擊Debug Assertion Failed窗口中的「retry」按鈕,然後單擊它應該跳轉到導致斷言的代碼。例如,它可能是這樣的:

ASSERT(GetSafeHwnd()!=NULL); 
+0

右和右。太好了!謝謝! – MRM

1

你的組合框類將不會被「子類」,直到第一個DoDataExchange中被稱爲(且在此將斷言之前,任何企圖利用它)後。要麼等到基類已經跑的OnInitDialog或做這樣的事情:

CComboBox * pcombo = static_cast<CComboBox*>(GetDlgItem(IDC_MYCOMBO)); 
pcombo->AddString(szPath); 

見@ TheSteve的答案串的問題。

+0

我不相信他說過任何關於對話的事情。 – TheSteve