Windows 安装程序,在 C++ 中的自定义操作中访问自定义 属性

Windows installer, access a custom property inside a custom action in C++

我在 Visual Studio 2010 年有一个 C++ 应用程序,我有一个 Windows 安装程序(即安装项目)来安装它。我希望能够像这样调用安装程序:

Setup1.msi MYPROPERTY=MyValue

然后能够从我的自定义操作中的 属性 中提取值 "MyValue"。 我试图通过遵循 this tutorial(C++ custom actions) and this tutorial(将参数传递给自定义操作,但在 C# 中)结合一些 MSDN 搜索来获取此代码来使其工作:

#define WINDOWS_LEAN_AND_MEAN
#include <Windows.h>
#include <msi.h>
#include <msiquery.h>
#include <stdio.h>

BOOL APIENTRY DllMain(HANDLE, DWORD, LPVOID) {
    return TRUE;
}

UINT APIENTRY InstallCustomAction(MSIHANDLE install_handle) {
    static const wchar_t* kPropertyName = L"MYPROPERTY";

    //auto msi_handle = MsiGetActiveDatabase(install_handle);

    DWORD n = 0;
    //auto result = MsiGetProperty(msi_handle, kPropertyName, L"", &n);
    auto result = MsiGetProperty(install_handle, kPropertyName, L"", &n);
    wchar_t* value = nullptr;
    if (result == ERROR_MORE_DATA) {
        ++n;
        value = new wchar_t[n];
        //result = MsiGetProperty(msi_handle, kPropertyName, value, &n);
        result = MsiGetProperty(install_handle, kPropertyName, value, &n);
    }

    if (result == ERROR_SUCCESS) {
        wchar_t buffer[128];
        swprintf_s(buffer, L"n = %d, value = %s", n, value);
        MessageBox(nullptr, buffer, L"CustomAction", MB_OK);

    } else {
        MessageBox(nullptr, L"Error reading property", L"Error", MB_OK);
    }
    delete value;
    //MsiCloseHandle(msi_handle);
    return ERROR_SUCCESS;
}

我完全按照 IDE 的 C# 教程进行操作(我将 Entry Point 设置为 InstallCustomAction 并将 Custom Action 数据设置为 /MYPROPERTY=[MYPROPERTY]) 自定义操作正确触发,但我没有得到参数。

按原样使用代码,我得到 n=0。如果我使用 MsiGetActiveDatabase 中的 msi_handle,我会收到一个错误(即 MsiGetProperty returns 除了 ErrorSuccess 之外的其他内容)。

如何从我的自定义操作中获取用户在命令行中输入的 属性?

无需调用 MsiGetActiveDatabase。从您所写的内容来看,您的自定义操作似乎已安排延迟执行。在那种情况下,您应该尝试获取名为 "CustomActionData".

的 属性