gpt4 book ai didi

.NET mshtml : How to pass a BSTR SAFEARRAY?

转载 作者:行者123 更新时间:2023-12-04 07:10:11 25 4
gpt4 key购买 nike

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 interface ,记录为:

IHTMLDocument2::write Method

Writes one or more HTML expressions to a document in the specified window.

Syntax

HRESULT write(
SAFEARRAY *psarray
);

Parameters

psarray

   [in] A **BSTR** that specifies the text and HTML tags to write.


所以实际上 write 方法需要一个指向 SAFEARRAY 的指针,即使 Microsoft 的 Microsoft.mshtml 互操作程序集定义 采用常规数组的方法:
public virtual void write(params object[] psarray);

忽略 mshtml 互操作声明,我必须构造一个 SAFEARRAY 对象(与对象数组相匹配),用 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);

当我最初从 native Win32 应用程序中使用此代码时,BSTR 被放置在 SAFEARRAY 中。在基于 IDispatch 的自动化中,一切都在数组中。在这种情况下,后期绑定(bind)代码:
doc.write(html);

由编译器转换为 SAFEARRAY,其中第零个元素包含 BSTR 字符串(这是一个长度前缀的 unicode 字符串)。

我的问题变成了尝试构建 SAFEARRAY、将字符串转换为 BSTR、将 BSTR 放入 SAFEARRAY 的第零个元素以及将包含 SAFEARRAY 的变量传递给仅接受对象数组(object [ ])。

这是真正的问题:如何创建 BSTR SAFEARRAY?

Microsoft.mshtml

C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll

最佳答案

IHTMLDocument2 上 write 方法的声明TLBIMP/VS.NET 创建的接口(interface)不正确。它应该是:

void Write([In, MarshalAs(UnmanagedType.SafeArray)] object[] psarray);

您必须在代码中定义此接口(interface),然后使用它。

关于.NET mshtml : How to pass a BSTR SAFEARRAY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com