c++ - Wix:从 C++ 自定义操作添加到列表框

标签 c++ wix 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);
}

谁能帮帮我?谢谢

编辑:我更新了我的列表框,但它不清晰,是奇怪的符号。我像这样将 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 循环中将它们与我的函数一起列出的最佳方法是什么?

谢谢

最佳答案

我认为您向函数传递了太多参数。因为 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 缓冲区而不是 char 缓冲区进行快速测试,看看是否可行。删除所有其他代码,只添加一个条目:

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

关于c++ - Wix:从 C++ 自定义操作添加到列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12562643/

相关文章:

SharePoint - CustomAction 未显示在工具栏上的内容类型

wix - 使用提升的权限但不作为 LocalSystem 调用自定义操作

c++ - 图像识别特征金字塔有多少步?

wix - 我可以使用 Microsoft ClickOnce 技术部署 WiX 设置吗?

image - MSI 中的背景图像应该是什么尺寸?

c# - 无法从另一个托管的Bootstrapper应用程序卸载WiX托管的Bootstrapper应用程序

wix - 安装失败后的自定义操作

c++ - 为什么我的 vector 代码断言?到底什么是断言?

c++ - pthread_cond_signal() 未在范围内声明

c++ - 表达式树的现代 C++ 版本 https ://gist. github.com/2934374