com - .NET mshtml: How to pass a BSTR SAFEARRAY? -


Microsoft.mshtml.dll असेंबली में वर्ग mshtml.HTMLDocumentClass एक विधि है:

  सार्वजनिक वर्चुअल शून्य लिखना (पैरामॉज ऑब्जेक्ट [] साइररा);  

एक पल के लिए वास्तविक प्रश्न से बचना, आप लिखने () कॉल करने के लिए किस कोड का उपयोग करेंगे? क्या आप इसका प्रयोग करेंगे:

  स्ट्रिंग html = "& lt; html & gt; & lt; body & gt; हैलो, दुनिया! & Lt; / body & gt; & lt; / html & gt;"; Mshtml.HTMLDocumentClass डॉक्टर; ... doc.write (html);  

या आप इसका प्रयोग करेंगे:

  स्ट्रिंग html = "& lt; html & gt; & lt; body & gt; हैलो, दुनिया! & Lt; / body & gt; & lt; / html & gt; "; Mshtml.HTMLDocumentClass डॉक्टर; ... वस्तु [] पैराम्स = नया ऑब्जेक्ट [1]; पराम [0] = html; doc.write (पैरामीटर);  

क्योंकि दोनों अपवाद छोड़ते हैं। (टाइप बेमेल। 0x80020005)

HTMLDocumentClass.write विधि वास्तव में आती है, जो इस रूप में प्रलेखित है:

IHTMLDocument2 :: लिखें विधि <

सिंटेक्स

  HRESULT लिखना (SAFEARRAY * Psarray);  

पैरामीटर

psarray

  [में] ए ** BSTR ** जो टेक्स्ट को निर्दिष्ट करता है और लिखने के लिए एचटीएमएल टैग  

तो वास्तविकता में लिखने की विधि को SAFEARRAY पर एक संकेतक की आवश्यकता होती है, भले ही माइक्रोसॉफ्ट के Microsoft.mshtml इंटरॉप असेंबली लिखें < / Strong> एक नियमित सरणी के रूप में विधि:

  सार्वजनिक वर्चुअल शून्य लिखना (पैरामॉज़ ऑब्जेक्ट [] psarray); Mshtml इंटरॉप घोषणा को अनदेखा करने के लिए, मुझे एक  SAFEARRAY  ऑब्जेक्ट का निर्माण करना है (एक ऑब्जेक्ट एरे का अर्थ है), इसे एक BSTR स्ट्रिंग (एक स्ट्रिंग्स) के साथ भरें। और उसे एक पैरामीटर में सामान दें जो एक ऑब्जेक्ट एरे होना चाहिए।  

नोट: मुझे पैरामीटर कीवर्ड के अर्थ का अनिश्चितता है I इसका उपयोग पैरामीटरों की एक चर संख्या को इंगित करने के लिए किया जाता है।

इसका क्या मतलब है कि यह एकाधिक सरणी पैरामीटर ले सकता है?

  वस्तु [] array1 = नया ऑब्जेक्ट [1]; सरणी 1 [0] = अल्फा; वस्तु [] array2 = नया ऑब्जेक्ट [1]; सरणी 2 [0] = ब्रेवो; वस्तु [] सरणी 3 = नया ऑब्जेक्ट [1]; सरणी 3 [0] = चार्ली; वस्तु [] array4 = नया ऑब्जेक्ट [1]; सरणी 4 [0] = डेल्टा; Doc.write (array1, array2, array3, array4);  

या वस्तु है [] जिस पद्धति में कई पैरामीटर पारित किए जाते हैं, और आपको वाकई एक सरणी बनाना चाहिए?

  वस्तु [] पैराम्स = नया ऑब्जेक्ट [4]; पराम [0] = अल्फा; पैरामेज [1] = ब्रेवो; पाराम [2] = चार्ली; पाराम [3] = डेल्टा; doc.write (पैरामीटर);  

या सरणी [] सिर्फ एक प्रलोभन है, और वास्तव में आप पास:

  doc.write (अल्फा, ब्रावो, चार्ली, डेल्टा);  

जब मैं मूल रूप से इस कोड का इस्तेमाल किया, एक देशी Win32 ऐप से, BSTR को SAFEARRAY के अंदर रखा गया था IDispatch आधारित स्वचालन में, सब कुछ एक सरणी के अंदर है। इस मामले में देर बाइंडिंग कोड:

  doc.write (html);  

संकलक द्वारा SAFEARRAY में कनवर्ट किया गया था, जहां शून्य-वां तत्व में एक BSTR स्ट्रिंग है (जो कि एक लम्बाई प्रीफ़िक्स यूनिकोड स्ट्रिंग है)।

मेरी समस्या बन जाती है एक SAFEARRAY बनाने का प्रयास करने में से एक, एक स्ट्रिंग को एक BSTR में परिवर्तित करने, SAFEARRAY के शून्य-वां तत्व में BSTR को रखने और एक वेरिएबल से गुजारें जो एक SAFEARRAY को किसी एक को ऑब्जेक्ट एरे (ऑब्जेक्ट []) स्वीकार करता है।

यह वास्तविक प्रश्न है: कैसे एक BSTR SAFEARRAY बनाने के लिए?


Microsoft.mshtml

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

< P> TLBIMP / VS.NET द्वारा बनाई गई इंटरफ़ेस पर लेखन विधि के लिए घोषणा गलत है। यह होना चाहिए:

  शून्य लिखें ([में, मार्शल (UnmanagedType.SafeArray)] वस्तु [] psarray);  

आपको कोड में इस इंटरफ़ेस को परिभाषित करना होगा और फिर उसका उपयोग करना होगा।


Comments