0

我目前正在使用 Visual Studio 2010 C++ 自定义操作项目

我有一个这样的自定义操作:

extern "C" UINT __stdcall RegProductName(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
char szLocalPath[MAX_PATH];


hr = WcaInitialize(hInstall, "RegProductName");
ExitOnFailure(hr, "Failed to initialize");

WcaLog(LOGMSG_STANDARD, "Initialized.");

strcpy(szLocalPath, Orc_Get_Product_Name());
MsiSetProperty(hInstall, "ProductName",  szLocalPath);

LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}

它不会引发任何错误,但我不确定我是否正确地做我想做的事。在这一行:

strcpy(szLocalPath, Orc_Get_Product_Name()); 

我从函数中获取产品名称并将其复制到 szLocalPath。但是我想在其他函数以及我的 wix 项目中多次使用这个变量。

这是正确的方法吗?

MsiSetProperty(hInstall, "ProductName",  szLocalPath);

非常感谢

4

1 回答 1

0

我在这里看不到任何问题strcpy. 如果您的函数Orc_Get_Product_Name()返回的路径长于MAX_PATH. 但是,您最好使用TCHARtype 而不是 plainchar来支持 Unicode/ANSI 构建,并且您应该真正使用 Unicode enabled构建。

而且我确定您要将结果分配MsiSetPropertyhr变量。

此外,将Product Name复制到名为Local Path的变量中看起来很奇怪。
而且我看不到标签在哪里LExit使用。该函数ExitOnFailure似乎没有返回控制:如果WcaInitialize不成功,您应该简单地将ERROR_INSTALL_FAILURE另一个错误代码返回给 MSI 引擎(而不是终止您的自定义操作正在运行的进程)。

于 2012-08-14T07:43:01.917 回答