2013-04-21 53 views
1

我們有問題,C++中的遞延自定義操作。我們只需要一個customactiondata屬性'apacheconfpath'的值,該屬性此時具有一個虛擬值測試值。C++自定義操作返回空字符串

這裏是我們的C++自定義操作:

UINT __stdcall AppendToApacheConfigFile(MSIHANDLE hInstall) 
{ 
    HRESULT hr = S_OK; 
    UINT er = ERROR_SUCCESS; 
    TCHAR sWord[100]; 

    hr = WcaInitialize(hInstall, "AppendToApacheConfigFile"); 
    ExitOnFailure(hr, "Failed to initialize"); 

    TCHAR szActionData[MAX_PATH] = {0}; 
    DWORD dActionDataLen = MAX_PATH; 
    MsiGetProperty (hInstall, TEXT("apacheconfpath"), TEXT(""), &dActionDataLen); 

    StringCbPrintf(sWord, 100, TEXT("%d"), dActionDataLen); 
    WcaLog(LOGMSG_STANDARD, "dActionDataLen = %s", sWord); 

    if (dActionDataLen > 0) 
    { 
     ++dActionDataLen; 
     StringCbPrintf(sWord, 100, TEXT("%d"), dActionDataLen); 
     WcaLog(LOGMSG_STANDARD, "dActionDataLen(2) = %s", sWord); 
     MsiGetProperty (hInstall, TEXT("apacheconfpath"), szActionData, &dActionDataLen);   
     WcaLog(LOGMSG_STANDARD, "szActionData = %s", szActionData); 
     StringCbPrintf(sWord, 100, TEXT("%d"), dActionDataLen); 
     WcaLog(LOGMSG_STANDARD, "dActionDataLen(3) = %s", sWord); 

    //Do something with the value 
    } 

    LExit: 
     er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; 
     return WcaFinalize(er); 
} 

屬性在這裏設置在我們的WiX的安裝程序:

<CustomAction Id="AppendToApacheConfigFile_Cmd" Property="AppendToApacheConfigFile" Value="/apacheconfpath=test;" /> 
<CustomAction Id="AppendToApacheConfigFile" BinaryKey="CustomActionDll" DllEntry="AppendToApacheConfigFile" Execute="deferred" /> 

<InstallExecuteSequence> 
     <Custom Action="AppendToApacheConfigFile_Cmd" Before="AppendToApacheConfigFile"><![CDATA[IIS_SELECTED <> 1]]></Custom> 
     <Custom Action="AppendToApacheConfigFile" After="DeployPhpRuntime"><![CDATA[IIS_SELECTED <> 1]]></Custom> 
</InstallExecuteSequence> 

我已經增加了很多記錄的嘗試,看看發生了什麼。看起來該屬性永遠不會被讀取,因爲dword值始終爲0,並且數據始終爲空。我們永遠不會超過第一次閱讀。

根據日誌值已設置

MSI (s) (80:C4) [20:59:30:210]: Executing op: CustomActionSchedule(Action=AppendToApacheConfigFile,ActionType=1025,Source=BinaryData,Target=AppendToApacheConfigFile,CustomActionData=/apacheconfpath=test;) 

的任何信息將是最歡迎

回答

1

當遞延自定義操作要求它通過衆所周知的標識符CustomActionData要求的數據。你可以看到在日誌文件中引用該名稱在此行的末尾:

MSI (s) (80:C4) [20:59:30:210]: Executing op: CustomActionSchedule(Action=AppendToApacheConfigFile,ActionType=1025,Source=BinaryData,Target=AppendToApacheConfigFile,CustomActionData=/apacheconfpath=test;) 

要訪問的數據,你會改變你的MsiGetProperty調用看起來更像:

MsiGetProperty(hInstall, TEXT("CustomActionData"), TEXT(""), &dActionDataLen); 

注意:既然你已經在使用wcautil,我強烈建議使用的WcaGetProperty()代替MsiGetProperty()。您需要檢查WcaGetProperty()的返回碼,這樣您的自定義操作才能正確處理用戶取消。否則,您的自定義操作可能會讓用戶嘗試取消安裝。

+0

感謝。使用WCaGetProperty()的建議讓我更進一步。 – 2013-04-22 09:08:44

+0

hr = WcaGetProperty(L「CustomActionData」,&pszActionData); – 2013-04-22 09:11:38

+0

我現在得到CustomActionData的第一個字符現在 – 2013-04-22 09:12:21