0

私は現在、Bugzillaインスタンスでバグを作成できるExcelマクロを開発しています。いくつかの試行錯誤の結果、これは正常に機能することがわかりました。新しく作成されたバグにスクリーンショットを追加できるように、クライアントを拡張したかったのです。

私が使用している環境は少し注意が必要です。タスクにはMSExcelを使用する必要があります。ExcelはXML-RPCを理解しないため、.NETからXML-RPCインターフェイスにアクセスできるようにするインターフェイスDLL(xml-rpc.netのCookComputing.XmlRpcV2.dll)をダウンロードしました。次に、Excelマクロから(COM相互運用機能を使用して)呼び出すことができる追加のDLLを作成しました。

すでに述べたように、これはブラウジングや新しいバグの追加などのタスクで正常に機能します。ただし、バグに添付ファイルを追加する場合は、画像をbase64データ型に変換する必要があります。これは正常に機能しているようで、スクリーンショットの作成は成功しているように見えますが、画像が破損しているようで、表示できません。

画像を追加する方法は次のとおりです。Bugzillaadd_attachmentメソッドは、構造体を入力として受け入れます: http ://www.bugzilla.org/docs/4.0/en/html/api/Bugzilla/WebService/Bug.html#add_attachment 。このタイプはC#で定義されており、VBAでも表示されます。

これは構造体の定義です:

[ClassInterface(ClassInterfaceType.AutoDual)]
public class TAttachmentInputData
{
    public string[] ids;
    public string data; // base64-encoded data
    public string file_name;
    public string summary;
    public string content_type;
    public string comment;
    public bool is_patch;
    public bool is_private;

    public void addId(int id)
    {
        ids = new string[1];
        ids[0] = id.ToString();
    }

    public void addData(string strData)
    {
        try
        {
            byte[] encData_byte = new byte[strData.Length];
            encData_byte = System.Text.Encoding.ASCII.GetBytes(strData);
            string encodedData = Convert.ToBase64String(encData_byte);
            data = new Byte[System.Text.Encoding.ASCII.GetBytes(encodedData).Length];
            data = System.Text.Encoding.ASCII.GetBytes(encodedData);
        }
        catch (Exception e)
        {
            throw new Exception("Error in base64Encode" + e.Message);
        }
    }

これは、添付ファイルを追加したいマクロの部分です。

    Dim attachmentsStruct As New TAttachmentInputData
    fname = attachmentFileName

    attachmentsStruct.file_name = GetFilenameFromPath(fname)
    attachmentsStruct.is_patch = False
    attachmentsStruct.is_private = False
    'multiple other definitions

    Open fname For Binary As #1
    attachmentsStruct.addData (Input(LOF(1), #1))
    Close #1
    attachmentsStruct.file_name = GetFilenameFromPath(fname)
    Call BugzillaClass.add_attachment(attachmentsStruct)

BugzillaClassは、DLLからExcelVBAに公開されるインターフェイスです。このメソッドadd_attachmentは、XML-RPCメソッドを参照しますadd_attachment

私の問題は、バイナリファイルからbase64への変換だと思います。これはaddData、私のC#DLLのメソッドを使用して行われます。そこで変換は正しく行われましたか?画像が破損している理由はありますか?

4

1 に答える 1

1

問題は、マクロでバイナリ データを読み込んでいることにあると思いますが、addData メソッドは文字列を想定しています。addData のパラメーターを byte[] として宣言してみてください。

于 2012-11-23T04:14:45.070 に答える