mshtml.HTMLDocumentClass程序集中的类Microsoft.mshtml.dll有一个方法:
public virtual void write(params object[] psarray);暂时回避真正的问题,您会使用什么代码来调用 what ()?你会用:
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 2::写方法 将一个或多个HTML表达式写入指定窗口中的文档。 语法 HRESULT写( SAFEARRAY *psarray ); 参数 psarray 在A **BSTR**中,指定要写入的文本和HTML标记。
因此,实际上,写方法需要一个指向SAFEARRAY的指针,尽管微软的Microsoft.mshtml互操作程序集将写方法定义为接受一个常规数组:
public virtual void write(params object[] psarray);忽略mshtml互操作声明,我必须构造一个SAFEARRAY对象(一个对象数组),用一个BSTR字符串填充它(一个字符串),并将它填充到一个必须是对象数组的参数中。
注意:我不确定params关键字的含义。它用于指示可变的参数数。
这是否意味着它可以接受多个数组参数?
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,将字符串转换为BSTR,将BSTR放入SAFEARRAY的第零元素,并将包含SAFEARRAY的变量传递给只接受对象数组(object[])的变量。
这才是真正的问题:如何创建BSTR SAFEARRAY?
Microsoft.mshtml C:\程序Files\Microsoft.NET\Primary互操作Assemblies\Microsoft.mshtml.dll
发布于 2009-01-28 20:23:58
对于TLBIMP/VS.NET创建的IHTMLDocument2接口上的写方法的声明是不正确的。它应该是:
void Write([In, MarshalAs(UnmanagedType.SafeArray)] object[] psarray);您必须在代码中定义这个接口,然后使用它。
发布于 2009-01-28 20:48:34
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一无所知,但可能您也不必知道,这取决于编译器在这里如何帮助/阻碍。
发布于 2009-06-18 11:47:35
它就像一种魅力:
[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 ofhttps://stackoverflow.com/questions/489048
复制相似问题