2012-09-24 5 views
5

こんにちは私は、ユーザーマシン上のCOMポートをチェックして、C++のカスタムアクションを介してリストボックスに挿入しようとしています。それは情報が表示されていないと私はデバッグするとき、それは言っているすべてのですがこれは、リストボックスのための私のウィックスコードである「機能は実行できませんでした」:Wix:C++からリストボックスに追加カスタムアクション

 <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); 
} 

誰も助けてくれますか?ありがとう

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

CString ComPort; 
    ComPort = buffer; 

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

はまた、ターゲットコンピュータは、それらすべてが、ループの内側に私の機能が列挙されているための最善の方法は何であるのシリアルポートを有することができますか?

おかげで

+0

カスタムアクションをどのように実行しようとしていますか? Dependency Walkerを使ってDLLから実際にエクスポートされていることを確認しましたか? – snowdude

+0

カスタムアクションはWixで呼び出されているので、問題にならないようにブレークポイントを設定することができました。ありがとう.. :) –

+0

だから、関数はどこでエラーを実行できませんでしたか?あなたは 'msiexec/l * vx'を実行しましたか? – snowdude

答えて

0

これは機能しています。私はワイド文字に文字を変換するために知っていた@snowdudeする

 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"); 

ありがとう:これは、私はそれが他の人を助けることが包み改正コードです。

1

私はあなたが関数にあまりにも多くの引数を渡していると思います。 WcaAddTempRecordシグネチャは可変引数リストを使用するため、型の検証は行いません。

の代わりに:

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

試み:nIndexあなたが挿入している項目の1から始まるインデックスです

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

charを使用できるかわからない場合は、wchar_tを使用する必要があります。

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

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

リストボックステーブルが4つで、関数が必要なので、関数に多すぎる引数がありませんでした。4.変数を使って試してみましょう。 –

関連する問題