0

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

我使用的环境有点棘手:我必须使用 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。这是使用addData我的 C# DLL 中的方法完成的。转换是否在那里正确完成?知道为什么图像损坏了吗?

4

1 回答 1

1

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

于 2012-11-23T04:14:45.070 回答