我目前正在开发一个 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 中的方法完成的。转换是否在那里正确完成?知道为什么图像损坏了吗?