WIX 在自定义操作中编辑二进制文件 [英] WIX edit binary file in custom action

查看:31
本文介绍了WIX 在自定义操作中编辑二进制文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试执行以下操作:

I'm trying to do the following:

  1. 在安装过程中通过自定义操作打开和编辑 sql 文件
  2. 保存编辑的更改并在安装期间执行.

在我的 product.wxs 中,我有以下内容:

In my product.wxs I have the following:

<Binary Id="SqlScriptSQLAuthentication"  SourceFile="$(sys.SOURCEFILEDIR)\MyDb.sql" />

        <Component Id='SqlComponent.SQLAuthentication' Guid='665D641C-3570-4b96-9CA5-2B4C12594A35' KeyPath='yes'>
            <Condition><![CDATA[USEINTEGRATEDSECURITY<>1]]></Condition>
            <sql:SqlDatabase Id='SqlDatabase.SQLAuthentication' Database='[DATABASE_NAME]' User='SQLUser' Server='[DATABASE_SERVER]' CreateOnInstall='yes' DropOnUninstall='yes' ContinueOnError='no' />
            <sql:SqlScript Id='SqlScriptSQLAuthentication' BinaryKey='SqlScriptSQLAuthentication' SqlDb='SqlDatabase.SQLAuthentication' ExecuteOnInstall='yes' />
        </Component>

在安装过程中,我想编辑MyDb.sql",写入更改并将其保存回来,以便 wix 可以在安装过程中运行它.

During setup I want to edit "MyDb.sql", write changes to it and save it back, so wix can run it during install.

最好的方法是什么?谢谢

what's the best approach? thanks

MyDb.sql 文件:

MyDb.sql file:

CREATE TABLE Test12345 (Value1 CHAR(50), Value2 INTEGER)

在我的自定义操作中,我有以下内容:

In my custom action I have the following:

        View v = session.Database.OpenView("SELECT `Data` FROM `Binary` WHERE `Name` = '{0}'", binaryKeyName);

        v.Execute();

        var IsReadOnly = session.Database.IsReadOnly;

        Record r = v.Fetch();

        StreamReader reader = new StreamReader(r.GetStream("Data"));
        string text = reader.ReadToEnd();
        text = text.Replace(@"Test12345", "TTTest");

        byte[] byteArray = Encoding.ASCII.GetBytes(text);
        MemoryStream stream = new MemoryStream(byteArray);

        r.SetStream("Data", stream);

//到目前为止它可以工作,我从 .sql 文件中读取了我的 sql 文本

// Up to this point it works and I read my sql text from .sql file

    session.Database.ExecuteStringQuery("UPDATE `Binary` SET `Data` = '{0}' WHERE `Name` = '{1}')", text, binaryKeyName);

    v.Close();
    session.Database.Commit();

当我尝试更新时(不确定我是否正确)它失败了.

it's when I try to update (not sure if i'm going it right) it fails.

推荐答案

您可以使用此自定义操作来提取二进制数据.然后,您必须进行更改并重新保存.不确定如何将它重新保存回二进制文件,因为我以前没有这样做过 - 我已经使用它将临时数据流式传输到许可协议中.这应该会给您一个良好的开端.

You can use this custom action to extract the binary data. You would then have to make your changes and resave it. Not sure how you would resave it back to binary as I have not done that before - I have used it to stream temporary data into the license agreement. This should give you a good start.

HRESULT ExtractBinary(__in LPCWSTR wzBinaryId,
                      __out BYTE** pbData,
                      __out DWORD* pcbData)
{
    HRESULT hr = S_OK;
    LPWSTR pwzSql = NULL;
    PMSIHANDLE hView;
    PMSIHANDLE hRec;

    // make sure we're not horked from the get-go
    hr = WcaTableExists(L"Binary");
    if (S_OK != hr)
    {
        if (SUCCEEDED(hr))
        {
            hr = E_UNEXPECTED;
        }
        ExitOnFailure(hr, "There is no Binary table.");
    }

    ExitOnNull(wzBinaryId, hr, E_INVALIDARG, "Binary ID cannot be null");
    ExitOnNull(*wzBinaryId, hr, E_INVALIDARG, "Binary ID cannot be empty string");

    hr = StrAllocFormatted(&pwzSql, L"SELECT `Data` FROM `Binary` WHERE `Name`=\'%s\'", wzBinaryId);
    ExitOnFailure(hr, "Failed to allocate Binary table query.");

    hr = WcaOpenExecuteView(pwzSql, &hView);
    ExitOnFailure(hr, "Failed to open view on Binary table");

    hr = WcaFetchSingleRecord(hView, &hRec);
    ExitOnFailure(hr, "Failed to retrieve request from Binary table");

    hr = WcaGetRecordStream(hRec, 1, pbData, pcbData);
    ExitOnFailure(hr, "Failed to read Binary.Data.");

    LExit:
    ReleaseStr(pwzSql);

    return hr;
}

这篇关于WIX 在自定义操作中编辑二进制文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆