.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 メソッド
指定されたウィンドウのドキュメントに1つ以上のHTML式を書き込みます。
構文
HRESULT write( SAFEARRAY *psarray );
パラメーター
psarray
[in] A **BSTR** that specifies the text and HTML tags to write.
したがって、実際には、Microsoft の Microsoft.mshtml 相互運用アセンブリを定義する 書く 通常の配列を取るメソッド:
public virtual void write(params object[] psarray);
mshtml interop宣言を無視して、 セーフアレイ オブジェクト (オブジェクト配列ではなく) を作成し、それに 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 に変換されました。ここで、0 番目の要素には BSTR 文字列 (長さの接頭辞が付いた Unicode 文字列) が含まれています。
私の問題は、SAFEARRAYを構築し、文字列をBSTRに変換し、BSTRをSAFEARRAYの0番目の要素に配置し、SAFEARRAYを含む変数をオブジェクト配列のみを受け入れる変数に渡すことの1つになります(object[ ])。
これが本当の質問です: BSTR SAFEARRAY を作成するにはどうすればよいですか?
Microsoft.mshtml
c: program files microsoft.net primary interopアセンブリ microsoft.mshtml.dll
解決
上の write メソッドの宣言 IHTMLDocument2
TLBIMP/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