繁体   English   中英

C ++从另一个调用一个函数

[英]C++ Calling one function from another

我有一个C ++自定义操作项目。 我有两个函数, RegProductNameGetProductName

我称之为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();时,函数调用中的参数太少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);
}

这不会比较字符串内容:

if(szProductName == "ORCHESTRATOR")

使用strcmp()或使用std::string==

if(szProductName == std::string("ORCHESTRATOR"))

您的GetProductName()函数采用参数MSIHANDLE hInstall 您需要在调用它时提供它。 例如,如果您只想使用与RegProductName()相同的句柄来调用它,则使用:

GetProductName(hInstall);

您的GetProductName看起来像这样:

extern "C" UINT __stdcall GetProductName(MSIHANDLE hInstall)
                                         \________________/
                                            The Argument

因此,当您完全不使用argumanes进行调用时,它需要接受1个参数:

getProductName( );
               ^
               |
            nothing is being passed here

因此,您得到的错误。 根据您的代码,您可能应该在hInstall传递hInstall

getProductName( hInstall );

GetProductName需要一个类型为MSIHANDLE参数,而您不带任何参数地调用它。 试试吧

GetProductName(hInstall);

GetProductName定义为GetProductName(MSIHANDLE hInstall) ,这意味着您必须传递相关的MSIHANDLE作为参数。 这正是您得到的错误。 但是,您正在执行szProductName == "ORCHESTRATOR" -这不是在C中比较字符串的方式。您似乎缺乏有关C的基本知识。您不应该用C或C ++编写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM