2016-08-05 4 views
0

У меня есть пользовательская функция C++, как указано ниже. Эта функция предназначена для извлечения раздела INI из INI-файла.WIX, передающий параметр C++, настраиваемое действие

extern "C" LPSTR PASCAL EXPORT ReadFile(LPSTR IniFilename, LPSTR IniFIleSection, LPSTR IniKey, LPSTR DefaultValue) 
{ 

    static char MyValue[512]; 
    sprintf(sValue, "%s %s %s %s",IniFilename, IniFIleSection, IniKey, DefaultValue); 
    GetPrivateProfileString(IniFIleSection, IniKey, DefaultValue, MyValue, 512,IniFilename); 
    return (sValue); 

}

И я использую Defenition Wix для CustomAction, как указано ниже

<Binary Id="CustomCallId" SourceFile="CustomDllname.dll" /> 
<CustomAction Id="ReadValue" BinaryKey="CustomCallId" DllEntry="ReadFile"/> 

<InstallExecuteSequence> 
    <Custom Action="ReadValue" Sequence="71" /> 
</InstallExecuteSequence> 

Но я не знаю, как передать параметр из WIX пользовательского вызова DLL.

ответ

1

Установщик Windows не поддерживает это. Он может вызывать только функции из C++ DLL с прототипом UINT __stdcall CustomAction(MSIHANDLE hInstall). Затем реализация функции может использовать MSIHANDLE для доступа к свойствам из активной установки.

Если вы управляете кодом в этой DLL, вы можете экспортировать вспомогательную функцию, которая считывает свойства, а затем вызывает вашу исходную функцию ReadValue. В качестве альтернативы вы можете просмотреть другие способы обертывания этого вызова.

+0

У InstallShield есть хороший шаблон для этого. (Стандартная DLL). –

0

Этот тип пользовательских действий в идеале должен управляться данными. Вот концепция в C#. Это в основном то же самое для C++. Фактически, MichaelU (InstallShield) любезно перевел мой код C# на C++-код.

http://blog.deploymentengineering.com/2008/05/data-driven-cas-made-easy-with-dtf.html

Вы хотели бы определить таблицу, как:

[INISearcher] INISearcher (первичный ключ для обеспечения уникальности) FileName [Тип отформатирован, чтобы иметь возможность использовать свойства] Раздел Key DefaultData Property_

Ваш ЦС мог бы запросить эту таблицу, выполнить итерацию результатов, форматировать имя_файла и выполнить чтение INI, а затем s разорвать результат в Свойстве, указанном в таблице.