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ます。これを達成する方法はありますか?

2 番目の問題: を使用するとm_portCombo.AddString(str);Debug Assertion Failed!エラーが発生し、もちろん、コンボボックスにそのレジストリ値が入力されません。なぜそれが起こり得るのですか?

4

2 に答える 2

1

コンボ ボックス クラスは、最初の DoDataExchange が呼び出されるまで「サブクラス化」されません (それが起こる前にそれを使用しようとすると、アサートされます)。基本クラスが OnInitDialog を実行するまで待つか、次のようにします。

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

文字列の問題については、@TheSteve の回答を参照してください。

于 2012-09-04T09:05:16.980 に答える
1

最初の問題: 整数に %d を使用して CString Format() 関数を使用します。

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

2 番目の問題: これが失敗する理由は多数あります。最も可能性が高いのは、コンボ ボックスをまだ作成していないことです (文字列を追加するには、ウィンドウ ハンドルが必要です)。アサーションの原因となったコードにジャンプする必要があります。たとえば、次のようになります。

ASSERT(GetSafeHwnd()!=NULL);
于 2012-09-04T05:35:13.307 に答える