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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top