6

こんにちは、ユーザーのマシンの COM ポートをチェックしてから、C++ のカスタム アクションを介してそれらをリストボックスに挿入しようとしています。情報は表示されていませんが、デバッグすると「関数の実行に失敗しました」と表示されます。これはリストボックスの Wix コードです。

       <Control Id="ListBoxID" Type="ListBox" Property="COMPORT" Width="80" Height="40" X="80" Y="165" Indirect="no">
      <ListBox Property="COMPORT">
      </ListBox>
      <Condition Action="hide">(DEVICETYPE = "1")</Condition>
      <Condition Action="show">(DEVICETYPE = "2")</Condition>
      <Condition Action="show">(DEVICETYPE = "3")</Condition>
      <Condition Action="hide">(DEVICETYPE = "4")</Condition>
    </Control>

これが私のカスタム アクションです。

extern "C" UINT __stdcall GetDatascanPort(MSIHANDLE hInstall)
{

HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
HKEY keyHandle;
DWORD i,openStatus,cb_value_buffer,cb_buffer,dwType;
char value_buffer[100],buffer[10];
MSIHANDLE hTable = NULL;
MSIHANDLE hColumns = NULL;
MSIDBERROR insertError = MSIDBERROR_NOERROR; 

hr = WcaInitialize(hInstall, "GetDatascanPort");
ExitOnFailure(hr, "Failed to initialize");

WcaLog(LOGMSG_STANDARD, "Initialized.");


if (RegCreateKeyEx( HKEY_LOCAL_MACHINE,
                    "HARDWARE\\DEVICEMAP\\SERIALCOMM",
                    0,
                    "",
                    REG_OPTION_NON_VOLATILE,
                    KEY_QUERY_VALUE,
                    default_sa(),
                    &keyHandle,
                    &openStatus )  == ERROR_SUCCESS )
{
    for (i=0;;i++)
    {
        cb_value_buffer = sizeof(value_buffer);
        cb_buffer = sizeof(buffer);

        if (RegEnumValue(keyHandle,
                         i,
                         value_buffer,
                         &cb_value_buffer,
                         NULL,
                         &dwType,
                         (unsigned char *) buffer,
                         &cb_buffer) != ERROR_SUCCESS)
                         break;

        if (dwType != REG_SZ || strlen(buffer) > 6)
            continue;

        hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", 1, 0, buffer);
        ExitOnFailure(hr, "failed to set COMPORT"); 


    }

    RegCloseKey(keyHandle);

    if (hTable)
        MsiCloseHandle(hTable);
    if (hColumns)
        MsiCloseHandle(hColumns);
    return WcaFinalize(hr);

}

LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}

誰でも私を助けてもらえますか?ありがとう

編集:リストボックスを更新していますが、読みやすく、奇妙な記号ではありません。char をそのように CString に変更しましたが、これは正しく表示されないこととは別に動作するようです。

CString ComPort;
    ComPort = buffer;

hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", 1, ComPort, ComPort);
ExitOnFailure(hr, "failed to set COMPORT"); 

また、対象のコンピュータにはシリアル ポートがある場合があります。それらすべてを for ループ内の関数とともに一覧表示する最良の方法は何ですか?

ありがとう

4

2 に答える 2

2

関数に渡す引数が多すぎると思います。WcaAddTempRecord シグネチャは可変引数リストを使用するため、型は検証されません。

それ以外の:

hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", 1, 0, buffer);

試す:

hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", nIndex,  buffer);

挿入する項目の 1 から始まるインデックスはどこnIndexにありますか。またchar、 を使用できるかどうかもわかりません。使用する必要があるかもしれませんwchar_t

char バッファーの代わりに wchar_t バッファーを使用して簡単なテストを行い、それが機能するかどうかを確認してください。他のすべてのコードを削除し、1 つのエントリを追加するだけです。

hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", 1,  L"TestPort");
于 2012-10-03T16:03:45.293 に答える
1

動作しました。これは、他の人に役立つ可能性がある場合に備えて修正したコードです。

        MultiByteToWideChar(CP_ACP,0,buffer,-1,ComPort,strlen(buffer));
        ComPort[strlen(buffer)]=0;

        hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", value++, ComPort, ComPort);
        ExitOnFailure(hr, "failed to set COMPORT");

@snowdudeのおかげで、文字をワイド文字に変換する必要があることがわかりました。

于 2012-10-04T13:13:39.103 に答える