Wix: добавить в список из C ++ Custom Action

Привет, я пытаюсь проверить 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);
}

Кто-нибудь может мне помочь? Спасибо

РЕДАКТИРОВАТЬ: У меня есть обновление моего списка, но это не разборчивые, странные символы. Я изменил свой символ на 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?

Спасибо

5

Решение

Я думаю, что вы передаете слишком много аргументов в функцию. Поскольку подпись 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);

куда nIndex 1-й индекс элемента, который вы вставляете. Также я не уверен, что вы можете использовать charвам может понадобиться wchar_t,

Попробуйте быструю проверку использования буфера wchar_t вместо буфера символов и посмотрите, работает ли он. Удалите весь другой код и просто добавьте одну запись:

hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", 1,  L"TestPort");
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 я знал, что должен преобразовать символ в Wide Char.

0