尝试为MSIProcessMessage提供可变函数导致c++编译器崩溃

Attempt at variadic functions for MSIProcessMessage crashed C++ compiler

本文关键字:函数 c++ 崩溃 编译器 MSIProcessMessage      更新时间:2023-10-16

我正在尝试编写可变模板函数,以帮助简化从MSI DLL调用到MSI的错误报告。这是我第一次遇到可变函数(我以前没有听说过这个术语),所以我显然把它搞砸了,因为我的尝试使编译器崩溃了:

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

(这只是许多行中最短的一行)

其中一个问题是TCHAR参数应该改为TCHAR *。这可能已经干扰了编译器选择正确模板实例的能力,重载,或者不管你叫它什么,假设我用TCHAR *参数调用模板函数。另一个问题可能是列表末尾附近参数数据类型的相似性。但是我需要添加一个int *参数来接收来自MsiProcessMessage的返回值。有了这两处修改,编译器和代码的工作就好多了。

UINT ReportMSIMessage(MSIHANDLE hInstall, INSTALLMESSAGE eMessageType, PMSIHANDLE& hRec, int index, int *iResponse)
{
   int response = MsiProcessMessage(hInstall, eMessageType, hRec);
   if (iResponse != NULL)
      *iResponse = response;
   if (response == -1)
      return ERROR_BAD_ARGUMENTS;
   return ERROR_SUCCESS;
}
template <typename... Args> UINT ReportMSIMessage(MSIHANDLE hInstall, INSTALLMESSAGE eMessageType, PMSIHANDLE& hRec, int index, int *iResponse, const TCHAR *message, Args... rest)
{
   LRESULT lResult = MsiRecordSetString(hRec, index, message);
   if (ERROR_SUCCESS != lResult)
      return lResult;
   return ReportMSIMessage(hInstall, eMessageType, hRec, index + 1, iResponse, rest...);
}
template <typename... Args> UINT ReportMSIMessage(MSIHANDLE hInstall, INSTALLMESSAGE eMessageType, PMSIHANDLE& hRec, int index, int *iResponse, int value, Args... rest)
{
   LRESULT lResult = MsiRecordSetInteger(hRec, index, value);
   if (ERROR_SUCCESS != lResult)
      return lResult;
   return ReportMSIMessage(hInstall, eMessageType, hRec, index + 1, iResponse, rest...);
}
template <typename... Args> UINT ReportMSIMessage(MSIHANDLE hInstall, INSTALLMESSAGE eMessageType, int *iResponse, Args... rest)
{
   const int argCount = sizeof...(Args);
   if (eMessageType == INSTALLMESSAGE_INFO)
   {
      PMSIHANDLE hLogRec = MsiCreateRecord(argCount-1);
      return ReportMSIMessage(hInstall, eMessageType, hLogRec, 0, iResponse, rest...);
   }
   else
   {
      PMSIHANDLE hLogRec = MsiCreateRecord(argCount);
      return ReportMSIMessage(hInstall, eMessageType, hLogRec, 1, iResponse, rest...);
   }
}

一个有助于缩小问题范围的更改是将函数名称从ReportMSIMessage更改为ReportMSIMessageRec,其中一个参数是PMSIHANDLE。这阻止了编译器可能选择递归选项足够长的时间来告诉我为什么其他模板不能作为选项工作。