使用VBA中的XML-RPC向Bugzilla添加附件

时间:2012-11-22 16:42:27

标签: c# vba com-interop xml-rpc bugzilla

我目前正在开发一个Excel宏,它允许在Bugzilla实例中创建Bugs。 经过一些试验和错误,现在结果证明工作正常。 我想增强客户端,以便也可以为新创建的bug添加屏幕截图。

我正在使用的环境有点棘手: 我必须使用MS Excel来完成我的任务。 由于Excel不理解XML-RPC,我下载了一个接口DLL(来自xml-rpc.net的CookComputing.XmlRpcV2.dll),它使得XML-RPC接口可以从.NET访问。 然后我创建了一个额外的DLL,可以从Excel宏调用(使用COM互操作)。

如前所述,这适用于浏览或添加新错误等任务。 但是当向bug添加附件时,必须将图像转换为base64数据类型。虽然这似乎工作正常,虽然截图的创建似乎成功,但图像似乎已损坏且无法显示。

以下是我添加图片的方法: Bugzilla add_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暴露给Excel VBA。 方法add_attachment引用XML-RPC方法add_attachment

我认为我的问题是从二进制文件转换为base64。 这是使用我的C#DLL中的addData方法完成的。 转换是否正确完成? 知道为什么图像被破坏了吗?

1 个答案:

答案 0 :(得分:1)

我认为问题在于您正在读取宏中的二进制数据,但addData方法需要一个字符串。尝试将addData中的参数声明为byte []。