Класс mshtml.HTMLDocumentClass в сборке Microsoft.mshtml.dll имеет метод:
public virtual void write(params object[] psarray);
Во избежание реального вопроса, какой код вы бы использовали для вызова write () ? Будете ли вы использовать:
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 :: Метод записи
Записывает одно или несколько выражений HTML в
документ в указанном окне.
Синтаксис
HRESULT write(
SAFEARRAY *psarray
);
Параметры
psarray
[in] A **BSTR** that specifies the text and HTML tags to write.
Таким образом, в действительности методу записи необходим указатель на SAFEARRAY, хотя сборка взаимодействия Microsoft Microsoft.mshtml определяет метод write как получение обычного массива:
public virtual void write(params object[] psarray);
Игнорируя объявление взаимодействия mshtml, я должен создать объект SAFEARRAY (стихи массив объектов), заполнить его строкой BSTR (стихи String) и вставить его в параметр, который должен быть массив объектов.
Примечание: я не уверен в значении ключевого слова 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[] params = new Object[4];
params[0] = alpha;
params[1] = bravo;
params[2] = charlie;
params[3] = delta;
doc.write(params);
Или массив [] просто приманка, и вы действительно передаете:
doc.write(alpha, bravo, charlie, delta);
Когда я первоначально использовал этот код из собственного приложения Win32, BSTR был помещен в SAFEARRAY. В автоматизации на основе IDispatch все находится внутри массива. В этом случае поздний обязательный код:
doc.write(html);
был преобразован компилятором в SAFEARRAY, где нулевой элемент содержит строку BSTR (которая является строкой Unicode с префиксом длины).
Моя проблема заключается в попытке создать SAFEARRAY, преобразовать строку в BSTR, поместить BSTR в нулевой элемент SAFEARRAY и передать переменную, содержащую SAFEARRAY, в переменную, которая принимает только массив объектов (объект []).
Это реальный вопрос: как создать BSTR SAFEARRAY?
Microsoft.mshtml
C: \ Program
Файлы \ Microsoft.NET \ Основное взаимодействие
Сборки \ Microsoft.mshtml.dll