سؤال

الطبقة mshtml.HTMLDocumentClass في Microsoft.mshtml.dll الجمعية الأسلوب:

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.الكتابة الطريقة تأتي في الواقع من IHTMLDocument2 واجهة, الذي هو توثيق:

IHTMLDocument2::طريقة الكتابة

يكتب واحد أو أكثر HTML التعبيرات إلى الوثيقة في الإطار المحدد.

بناء الجملة

HRESULT write(
   SAFEARRAY *psarray
);

المعلمات

psarray

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

حتى في الواقع أسلوب الكتابة يحتاج مؤشر إلى SAFEARRAY ، على الرغم من مايكروسوفت مايكروسوفت.mshtml تجميع إمكانية التشغيل المتداخل تحديد الكتابة طريقة أخذ العادية مجموعة:

public virtual void write(params object[] psarray);

تجاهل mshtml interop الإعلان علي بناء 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[] 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?


مايكروسوفت.mshtml

C:\Program Files\Microsoft.NET\Interop الأساسية جمعيات\Microsoft.mshtml.dll

هل كانت مفيدة؟

المحلول

إعلان عن أسلوب الكتابة على IHTMLDocument2 واجهة إنشاؤه من قبل TLBIMP/مقابل.صافي غير صحيحة.ينبغي أن يكون:

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