我有一个C ++自定义操作项目。我有两个功能,RegProductName
和GetProductName
。
我打电话给RegProductName
,它有三种可能的结果。我在if语句中有这些,如果它是结果1或结果2然后我调用我的第二个函数GetProductName
但我似乎无法使它工作。谁能给我一个从另一个函数调用一个函数的例子呢?
extern "C" UINT __stdcall RegProductName(MSIHANDLE hInstall)
{
AssertSz(FALSE, "debug here");
DebugBreak();
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
char szProductName[MAX_PATH];
hr = WcaInitialize(hInstall, "RegProductName");
ExitOnFailure(hr, "Failed to initialize");
WcaLog(LOGMSG_STANDARD, "Initialized.");
strcpy(szProductName, Orc_Get_Product_Name());
if(szProductName == "ORCHESTRATOR")
{
GetProductName();
}
else if (szProductName == "CORAL")
{
GetProductName();
}
else
{
MsiSetProperty(hInstall, "PRODUCTNAME", szProductName);
}
LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}
错误是“当我将鼠标悬停在GetProductName();
extern "C" UINT __stdcall GetProductName(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
DWORD Ret;
CHAR *Section = "General";
CHAR szBuffer[MAX_PATH];
CHAR szProductIniFile[MAX_PATH];
char lpszString[MAX_PATH];
int lplValue;
hr = WcaInitialize(hInstall, "GetProductName");
ExitOnFailure(hr, "Failed to initialize");
WcaLog(LOGMSG_STANDARD, "Initialized.");
TCHAR* szValueBuf = NULL;
DWORD cchValueBuf = 0;
UINT uiStat = MsiGetProperty(hInstall, TEXT("TEMPFOLDER"), TEXT(""), &cchValueBuf);
if (ERROR_MORE_DATA == uiStat)
{
++cchValueBuf;
szValueBuf = new TCHAR[cchValueBuf];
if (szValueBuf)
{
uiStat = MsiGetProperty(hInstall, TEXT("TEMPFOLDER"), szValueBuf, &cchValueBuf);
}
}
if (ERROR_SUCCESS != uiStat)
{
if (szValueBuf != NULL)
delete[] szValueBuf;
return ERROR_INSTALL_FAILURE;
}
strcpy(szProductIniFile,szValueBuf);
Ret = strlen(szProductIniFile);
if(szProductIniFile[Ret-1] != '\\')
strcat(szProductIniFile,"\\");
strcat(szProductIniFile, "Product.ini");
Ret = GetPrivateProfileString(Section, // Section Title [General]
"PRODUCT_NAME", // Entry
"Orchestrator", // Default Value
szBuffer, // Address of buffer to read to
MAX_PATH, // Length of buffer
szProductIniFile); // .ini file name
if (strlen(szBuffer) == 0)
strcpy(szBuffer, "ORCHESTRATOR");
if (strlen(szBuffer) >= 3 && (stricmp(szBuffer+strlen(szBuffer)-3,"DEM") == 0))
lplValue = 1;
else
lplValue = 0;
MsiSetProperty(hInstall, "PRODUCTNAME", szBuffer);
LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}
答案 0 :(得分:2)
这不会比较字符串内容:
if(szProductName == "ORCHESTRATOR")
使用strcmp()
或使用std::string
和==
:
if(szProductName == std::string("ORCHESTRATOR"))
答案 1 :(得分:2)
您的GetProductName()
函数接受参数MSIHANDLE hInstall
。调用它时你需要提供它。例如,如果您只想使用与调用RegProductName()
相同的句柄调用它:
GetProductName(hInstall);
答案 2 :(得分:2)
您的GetProductName如下所示:
extern "C" UINT __stdcall GetProductName(MSIHANDLE hInstall)
\________________/
The Argument
所以它需要接受1个参数,而你在没有争论的情况下调用它:
getProductName( );
^
|
nothing is being passed here
因此你得到的错误。根据您的代码,您应该将hInstall
传递给那里:
getProductName( hInstall );
答案 3 :(得分:1)
GetProductName
需要一个MSIHANDLE
类型的参数,而您在没有任何参数的情况下调用它。尝试改为
GetProductName(hInstall);
答案 4 :(得分:0)
GetProductName
定义为GetProductName(MSIHANDLE hInstall)
,这意味着您必须将相关的MSIHANDLE作为参数传递。这正是你得到的错误。
但是你正在做szProductName == "ORCHESTRATOR"
- 这不是你比较C中字符串的方式。你似乎缺乏关于C的基本知识。你不应该用C或C ++编写。