[英]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_handle
, MsiGetActiveDatabase
收到错误消息(即MsiGetProperty返回除ErrorSuccess之外的内容)。
如何从我的自定义操作中获取用户在命令行中传递的属性?
无需调用MsiGetActiveDatabase。 从您编写的内容看来,您的自定义操作已安排为延迟执行。 在这种情况下,您应该尝试获取名为“ CustomActionData”的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.