繁体   English   中英

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

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

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

Setup1.msi MYPROPERTY=MyValue

然后能够从我的自定义操作中从属性中提取值“ MyValue”。 我试图通过遵循本教程 (C ++自定义操作)和本教程 (将参数传递给自定义操作,但使用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 Data设置为/MYPROPERTY=[MYPROPERTY] ),该自定义操作可以正确触发,但是我没有得到该参数。

使用原样的代码,我得到n = 0。 如果我使用msi_handleMsiGetActiveDatabase收到错误消息(即MsiGetProperty返回除ErrorSuccess之外的内容)。

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

无需调用MsiGetActiveDatabase。 从您编写的内容看来,您的自定义操作已安排为延迟执行。 在这种情况下,您应该尝试获取名为“ CustomActionData”的属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM