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循环中。有没有办法做到这一点?

第二个问题:如果我使用m_portCombo.AddString(str);我得到一个Debug Assertion Failed!错误,当然,组合框没有填充该注册表值。为什么会这样?

4

2 回答 2

1

第一个问题:使用 CString Format() 函数,将 %d 用于整数。

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

第二个问题:失败的原因可能有很多。最有可能的是尚未创建组合框。(它需要一个窗口句柄才能添加字符串)要找出调试断言的原因,请单击“调试断言失败”窗口上的“重试”按钮,然后它应该跳转到导致断言的代码。例如,它可能是这样的:

ASSERT(GetSafeHwnd()!=NULL);
于 2012-09-04T05:35:13.307 回答
1

在调用第一个 DoDataExchange 之前,您的组合框类不会被“子类化”(并且在此之前使用它的任何尝试都将断言)。要么等到基类运行 OnInitDialog,要么执行以下操作:

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

请参阅@TheSteve 对字符串问题的回答。

于 2012-09-04T09:05:16.980 回答