.NET mshtml:如何传递 BSTR SAFEARRAY?
题
Microsoft.mshtml.dll 程序集中的类 mshtml.HTMLDocumentClass 有一个方法:
public virtual void write(params object[] psarray);
暂时回避真正的问题,您将使用什么代码来调用 写()?你会使用:
String html = "<html><body>Hello, world!</body></html>";
mshtml.HTMLDocumentClass doc;
...
doc.write(html);
或者你会使用:
String html = "<html><body>Hello, world!</body></html>";
mshtml.HTMLDocumentClass doc;
...
object[] params = new Object[1];
params[0] = html;
doc.write(params);
因为这两个都会抛出异常。(类型不匹配。0x80020005)
这 HTMLDocumentClass.write 方法实际上来自 IHTMLDocument2接口, ,记录为:
IHTMLDocument2::write 方法
将一个或多个HTML表达式写入指定窗口中的文档。
句法
HRESULT write( SAFEARRAY *psarray );
参数
普阵列
[in] A **BSTR** that specifies the text and HTML tags to write.
所以实际上 write 方法需要一个指向 SAFEARRAY 的指针,尽管 Microsoft 的 微软.mshtml 互操作程序集定义 写 方法采用常规数组:
public virtual void write(params object[] psarray);
忽略 mshtml 互操作声明,我必须构造一个 安全阵列 对象(相对于对象数组),用 BSTR 字符串(相对于字符串)填充它,并将其填充到必须是对象数组的参数中。
笔记:我不确定这句话的意思 参数 关键词。它用于指示可变数量的参数。
这是否意味着它可以采用多个数组参数?
object[] array1 = new Object[1];
array1 [0] = alpha;
object[] array2 = new Object[1];
array2 [0] = bravo;
object[] array3 = new Object[1];
array3 [0] = charlie;
object[] array4 = new Object[1];
array4 [0] = delta;
doc.write(array1, array2, array3, array4);
或者object[]是传递多个参数的方法,并且必须从字面上创建一个数组?
object[] params = new Object[4];
params[0] = alpha;
params[1] = bravo;
params[2] = charlie;
params[3] = delta;
doc.write(params);
或者 array[] 只是一个诱饵,而你真的通过了:
doc.write(alpha, bravo, charlie, delta);
当我最初在本机 Win32 应用程序中使用此代码时,BSTR 被放置在 SAFEARRAY 内。在基于 IDispatch 的自动化中,所有内容都位于数组内。在这种情况下,后期绑定代码:
doc.write(html);
被编译器转换为 SAFEARRAY,其中第零个元素包含 BSTR 字符串(这是一个以长度为前缀的 unicode 字符串)。
我的问题变成了尝试构造一个 SAFEARRAY,将 String 转换为 BSTR,将 BSTR 放入 SAFEARRAY 的第零个元素,然后将包含 SAFEARRAY 的变量传递给仅接受对象数组 (object[ ])。
这是真正的问题: 如何创建 BSTR SAFEARRAY?
微软.mshtml
C:\程序 Files\Microsoft.NET\Primary Interop 程序集\Microsoft.mshtml.dll
解决方案
write 方法的声明 IHTMLDocument2
TBIMP/VS.NET 创建的接口不正确。它应该是:
void Write([In, MarshalAs(UnmanagedType.SafeArray)] object[] psarray);
您必须在代码中定义此接口,然后使用它。
其他提示
在params关键字指示您可以在这个地方提供多个参数,并自动将基。例如,如果我因此具有一个功能:
public int SumNumbers(params int[] value)
{
//Logic.
}
然后我可以调用它是这样的:
int myValue = SumNumbers(1,2,3,4,5,6,7,8,9,10);
的阵列是自动构造。所以假设,你可以调用
mshtml.HTMLDocumentClass doc;
...
doc.write('H','I',' ','M','O','M');
和它的工作。不是真的实用,但。我想你已经打过电话
doc.write(myString.ToCharArray());
?我不知道什么SAFEARRAYS,但它可能您可能无法知道,或者说,取决于编译器如何帮助/这里阻碍。
它像一个魅力这样:
[Guid("332C4425-26CB-11D0-B483-00C04FD90119")]
[ComImport]
[TypeLibType((short)4160)]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
internal interface IHTMLDocument2
{
[DispId(1054)]
void write([MarshalAs(UnmanagedType.BStr)] string psArray); //modified
//void write([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] object[] psarray); //instead of