0

C++ カスタム アクション プロジェクトがあります。と の 2 つの機能がRegProductNameありGetProductNameます。

私がコールRegProductNameすると、3 つの結果が考えられます。if ステートメントにこれらがあり、結果 1 または結果 2 の場合、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);
}
4

5 に答える 5

2

GetProductNameは次のようになります。

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

したがって、アルグマネスなしで呼び出している間は、1つの引数を取る必要があります。

getProductName( );
               ^
               |
            nothing is being passed here

したがって、発生しているエラー。あなたのコードに基づいて、あなたはおそらくhInstallそこにあなたを渡す必要があります:

getProductName( hInstall );
于 2012-08-28T09:32:54.447 に答える
2

これは文字列の内容を比較しません:

if(szProductName == "ORCHESTRATOR")

を使用するstrcmp()か、 and を使用std::string==ます。

if(szProductName == std::string("ORCHESTRATOR"))
于 2012-08-28T09:31:08.980 に答える
2

関数GetProductName()は引数を取りますMSIHANDLE hInstall。呼び出すときにそれを提供する必要があります。たとえば、次のように呼び出したのと同じハンドルで呼び出したいだけの場合RegProductName():

GetProductName(hInstall);
于 2012-08-28T09:31:28.173 に答える
1

パラメータなしで呼び出すのに対し、は型のGetProductName引数を1つ必要とします。MSIHANDLE代わりに試してください

GetProductName(hInstall);
于 2012-08-28T09:32:20.273 に答える
0

GetProductNameはとして定義さGetProductName(MSIHANDLE hInstall)れます。つまり、関連するMSIHANDLEをパラメーターとして渡す必要があります。そして、それはまさにあなたが得ているエラーです。しかし、あなたはやっていますszProductName == "ORCHESTRATOR"-これはCで文字列を比較する方法ではありません。Cについての基本的な知識が不足しているようです。CまたはC++で書くべきではありません。

于 2012-08-28T09:34:04.983 に答える