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".
的 属性
我在 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".
的 属性