2016-08-02 27 views
2

バンドルコマンドライン引数をオプションでMSIに渡す必要があります。つまり、Bundleコマンドラインで指定されている場合は、その値をMSIに渡します。それ以外の場合は、MSIでデフォルトに設定したままにしておきます。オプションでバンドルからMSIにパブリックプロパティを渡す方法

MSIに財産を渡すためには、あなたがこれを使用する必要があります:

<MsiProperty Name='PUBLICPROPERTY' Value='[BundleParameter]'/> 

をそして、あなたはこれを必要とバンドル変数を宣言するために:結果は公物であることである

<Variable Name="BundleParameter" bal:Overridable="yes" Type="string" Value="SomeValue"/> 

を常に値に設定されます。 "SomeValue"のデフォルト値またはバンドルコマンドラインで渡された値。

どのように条件付きでMsiPropertyを渡すことができますか?

答えて

0

もっと良い選択肢があればわかりませんが、2つのMsiPackageをチェーンに追加することができます。そのパッケージは同じパッケージをインストールしますが、MsiPropertyとMsiPropertyを定義しないものを定義します。このaproachの利点は、MsiPackageにInstallConditionを設定できますが、MsiPropertyでは設定できないことです。

0

焼けバンドルのMsiPackageに2つのエントリを作成することができます。それぞれ反対のインストール条件があります。私。プロパティが入力されている場合は1を実行し、そうでない場合はもう1つを実行しますか?少しハッキーですが、私は他の方法を知らない。これがアンインストール部分にどのように影響するかは不明です。

0

私はWiX Githubをチェックしましたが、これは今日できないようです。 BURNでMsiPropertyを定義すると、その値が空であるかどうかにかかわらず、値が設定されてMSIに渡されます。ここでは、コードのスナップショットです:HERE

を述べたように、これはWiX4.0の新機能になりますように

extern "C" HRESULT MsiEngineParsePropertiesFromXml(
    __in IXMLDOMNode* pixnPackage, 
    __out BURN_MSIPROPERTY** prgProperties, 
    __out DWORD* pcProperties 
    ) 
{ 
    HRESULT hr = S_OK; 
    IXMLDOMNodeList* pixnNodes = NULL; 
    IXMLDOMNode* pixnNode = NULL; 
    DWORD cNodes = 0; 

    BURN_MSIPROPERTY* pProperties = NULL; 

    // select property nodes 
    hr = XmlSelectNodes(pixnPackage, L"MsiProperty", &pixnNodes); 
    ExitOnFailure(hr, "Failed to select property nodes."); 

    // get property node count 
    hr = pixnNodes->get_length((long*)&cNodes); 
    ExitOnFailure(hr, "Failed to get property node count."); 

    if (cNodes) 
    { 
     // allocate memory for properties 
     pProperties = (BURN_MSIPROPERTY*)MemAlloc(sizeof(BURN_MSIPROPERTY) * cNodes, TRUE); 
     ExitOnNull(pProperties, hr, E_OUTOFMEMORY, "Failed to allocate memory for MSI property structs."); 

     // parse property elements 
     for (DWORD i = 0; i < cNodes; ++i) 
     { 
      BURN_MSIPROPERTY* pProperty = &pProperties[i]; 

      hr = XmlNextElement(pixnNodes, &pixnNode, NULL); 
      ExitOnFailure(hr, "Failed to get next node."); 

      // @Id 
      hr = XmlGetAttributeEx(pixnNode, L"Id", &pProperty->sczId); 
      ExitOnFailure(hr, "Failed to get @Id."); 

      // @Value 
      hr = XmlGetAttributeEx(pixnNode, L"Value", &pProperty->sczValue); 
      ExitOnFailure(hr, "Failed to get @Value."); 

      // @RollbackValue 
      hr = XmlGetAttributeEx(pixnNode, L"RollbackValue", &pProperty->sczRollbackValue); 
      if (E_NOTFOUND != hr) 
      { 
       ExitOnFailure(hr, "Failed to get @RollbackValue."); 
      } 

      // prepare next iteration 
      ReleaseNullObject(pixnNode); 
     } 
    } 

が見える今言われていることを、あなたはそのMSIの著者であるならば、あなたがすることができますMSI(.wxs)ファイル内のプロパティ値を確認し、SetPropertyを使用して "空"になる場合は、別の値に設定してください。

+0

これは役に立ちましたか? – Isaiah4110

関連する問題