0
我想写可变参数模板函数来帮助简化从MSI DLL调用到MSI的错误报告。这是我与可变参数函数的第一次相遇(我还没有听说过术语),所以我显然是搞砸了,伤得很厉害看到我是如何坠毁我试图编译:尝试为MSIprocessMessage失败函数崩溃的C++编译器
UINT ReportMSIMessage(MSIHANDLE hInstall, INSTALLMESSAGE eMessageType, PMSIHANDLE& hRec, int index)
{
return MsiProcessMessage(hInstall, eMessageType, hRec);
}
template <typename... Args> UINT ReportMSIMessage(MSIHANDLE hInstall, INSTALLMESSAGE eMessageType, PMSIHANDLE& hRec, int index, TCHAR message, Args... rest)
{
LRESULT lResult = MsiRecordSetString(hRec, index, message);
if (ERROR_SUCCESS != lResult)
return lResult;
return ReportMSIMessage(hInstall, eMessageType, hRec, index + 1, rest...);
}
template <typename... Args> UINT ReportMSIMessage(MSIHANDLE hInstall, INSTALLMESSAGE eMessageType, PMSIHANDLE& hRec, int index, int value, Args... rest)
{
LRESULT lResult = MsiRecordSetInteger(hRec, index, value);
if (ERROR_SUCCESS != lResult)
return lResult;
return ReportMSIMessage(hInstall, eMessageType, hRec, index + 1, rest...);
}
template <typename... Args> UINT ReportMSIMessage(MSIHANDLE hInstall, INSTALLMESSAGE eMessageType, Args... rest)
{
const int argCount = sizeof...(Args);
if (eMessageType == INSTALLMESSAGE_INFO)
{
PMSIHANDLE hLogRec = MsiCreateRecord(argCount-1);
return ReportMSIMessage(hInstall, eMessageType, hLogRec, 0, rest...);
}
else
{
PMSIHANDLE hLogRec = MsiCreateRecord(argCount);
return ReportMSIMessage(hInstall, eMessageType, hLogRec, 1, rest...);
}
}
当我编译,编译器挂起了好一阵,最后报告:
1> Note: non-fatal system error releasing memory (487)
1>SetupFunc.cpp(1460): fatal error C1001: An internal error has occurred in the compiler.
1> (compiler file 'msc1.cpp', line 1325)
1> To work around this problem, try simplifying or changing the program near the locations listed above.
1> Please choose the Technical Support command on the Visual C++
1> Help menu, or open the Technical Support help file for more information
再就是线的数百或数千行这样的:
see reference to function template instantiation 'UINT ReportMSIMessage<PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,const char*,TCHAR*>(MSIHANDLE,INSTALLMESSAGE,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,PMSIHANDLE,int,const char *,TCHAR *)' being compiled
(这仅仅是最短的许多线)
FWIW,我不是一个真正的C++开发人员......但对于MSI C++ CA,您应该查看Windows Installer XML。它有一个C++项目模板,可以设置一切,并包含一对可重复使用的库。请参阅http://www.joyofsetup.com/2008/07/15/verbose-logging-from-wcautil/ –
另请注意WiX v3.10的发行说明:http://www.joyofsetup.com/2015/09/07/wix-toolset-v3-10-released /“DUtil错误检查宏可变参数,因此开发人员不必再事先考虑他们在消息中需要多少个参数” –