2017-02-07 15 views
8

मैं एक साधारण MAPI प्रदाता DLL कि निम्नलिखित कार्यों को लागू करता है लिखा है:कैसे घोषित करें कि मेरा सरल एमएपीआई प्रदाता डीएलएल यूनिकोड है और मैपिसेन्डमेल समर्थन का समर्थन करता है?

MapiLogOn   
MapiLogOff  
MapiSendMail  
MapiSendDocuments 
MapiFindNext  
MapiReadMail  
MapiSaveMail  
MapiDeleteMail 
MapiFreeBuffer 
MapiAddress  
MapiDetails  
MapiResolveName 

मैं रजिस्ट्री HKLM\SOFTWARE\Clients\Mail\ में मेरी DLL पंजीकृत किया है और "डिफ़ॉल्ट प्रोग्राम" के माध्यम से इसे चुन सकते हैं।

यह पूरी तरह से काम करता है (लेकिन केवल एएनएसआई वर्णों के साथ)!

अब, मैं इसके लिए यूनिकोड समर्थन जोड़ने की कोशिश कर रहा हूं।

मैंने मैपिसेन्डमेल को लागू किया है और इसे डीएलएल के "निर्यात" खंड में घोषित कर दिया है, ताकि एमएपीआई डीएलएल स्टब देख सके कि यह मैपिसेन्डमेल का निर्यात करता है और इस प्रकार यूनिकोड है।

हालांकि, मेरे डीएलएल का यह यूनिकोड मैपेंडेंडमेल कार्य कभी नहीं कहा जाता है। एएनएसआई संस्करण, मैपिसेन्डमेल, इसके बजाय कहा जाता है।

जब मैं उन अनुप्रयोगों का उपयोग करता हूं जो एमएपीआई कहते हैं, उदा। माइक्रोसॉफ्ट इंटरनेट एक्सप्लोरर (ईमेल द्वारा लिंक भेजने के लिए) या एडोब रीडर (ईमेल द्वारा फाइलें भेजने के लिए), राष्ट्रीय पात्र मैपिसेंडमेल में मेरे डीएलएल में प्रश्न चिह्नों द्वारा प्रतिस्थापित किए जाते हैं। यदि मैं डिफ़ॉल्ट मेल क्लाइंट को Outlook में स्विच करता हूं, तो माइक्रोसॉफ्ट इंटरनेट एक्सप्लोरर राष्ट्रीय अक्षरों को सही तरीके से भेजता है।

इस बीच, आउटलुक अपने एमएपीआई डीएलएल को यूनिकोड के रूप में विज्ञापित करता है। मुझे यह रजिस्ट्री मान "SupportUTF8" HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Clients\Mail\Microsoft Outlook

जब मैंने इस रजिस्ट्री कुंजी को हटा दिया है, तो माइक्रोसॉफ़्ट इंटरनेट एक्सप्लोरर ने ईमेल द्वारा फाइल/भेजें/लिंक चुनते समय Outlook को कॉल करते समय राष्ट्रीय अक्षरों को प्रश्न चिह्नों में बदलना शुरू कर दिया था।

तो ऐसा लगता है कि HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun..... के तहत "SupportUTF8" का अर्थ था।

मेरे क्लाइंट HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\.....

मेरे मुवक्किल को SupportUTF8 जोड़ा जा रहा है के तहत पंजीकृत है कोई मतलब नहीं (अभी भी निशान पर सवाल खड़ा कर दिया है, और कोई MapiSendMailW कहा जाता है लेकिन MapiSendMail MSIE से (फ़ाइल | भेजें | ई-मेल द्वारा लिंक) यहां तक ​​कि HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Microsoft Outlook को SupportUTF8 जोड़ने। जब Outlook क्लाइंट

समर्थनUTF8 रजिस्ट्री मान के बावजूद, जब मेरे क्लाइंट को एमएस वर्ड से बुलाया जाता है, तो यह एमआईआईई को प्रश्न चिह्नों पर प्रतिबिंबित नहीं करता है, लेकिन यह मैरीसेन्डमेल प्राप्त करता है, लेकिन ulReserved में इसे यूटीएफ 8 कोडपेज नंबर मिलता है, इसलिए मेरा ग्राहक राष्ट्रीय पात्रों को प्रदर्शित करने में सक्षम है। लेकिन यह एमएसआईई (फाइल | भेजें | ईमेल द्वारा लिंक) से नहीं होता है जो हमेशा बदलता है मेरे क्लाइंट के साथ प्रश्न चिह्नों के लिए राष्ट्रीय पात्र।

मुझे अपने डीएलएल में क्या जोड़ना चाहिए ताकि विंडोज स्टब इसे यूनिकोड के रूप में देख सके और MapiSendMailW को कॉल कर सके? क्या मुझे स्टूल को दिखाने के लिए डीएलएल को अन्य कार्यों को कार्यान्वित करना चाहिए कि यह यूनिकोड है? Windows 10 64-बिट पर

1):

मैं दो परीक्षण किया है। एमएपीआई डीएलएल 32-बिट है। प्रोसेस मॉनिटर (Sysinternals से) से पता चलता है कि एमएसआईई एक प्रक्रिया fixmapi.exe चलाता है जो इसके बदले में एमएपीआई कॉल करता है।

2) विंडोज 7 32-बिट पर। कोई fixmapi.exe का उपयोग नहीं किया जाता है: एमएसआईई सीधे मेरे डीएलएल को कॉल करता है, लेकिन अभी भी MapiSendMailW को कॉल नहीं करता है।

हालांकि, मेरा परीक्षण एमएपीआई एप्लिकेशन मैपेंडेंडमेल के साथ मेरे डीएलएल को कॉल करता है।

+0

ब्रियर, आईटी स्टाफ डॉक्टर हिट के माध्यम से खेती बहुत कम खुशी है। मुझे लगता है कि आप [इस संपत्ति] की तलाश में हैं (https://msdn.microsoft.com/en-us/library/cc815684.aspx), सुनिश्चित नहीं है। –

+0

PR_STORE_UNICODE_MASK विस्तारित एमएपीआई से है, जबकि मैंने सरल एमएपीआई लागू किया है, बिना किसी स्टोर के संदेश भेजने के लिए। –

उत्तर

0

मुझे इस समस्या का समाधान मिला है। मेरा सरल एमएपीआई प्रदाता ठीक था और उसने MapiSendMailW को ठीक से घोषित कर दिया है। एक सरल अनुप्रयोग जो विंडोज सिस्टम फ़ोल्डर (सी: \ विंडोज \ System32 \ mapi32.dll) से एमएपीआई डीएलएल लोड करने के लिए लोड लाइब्रेरी का उपयोग करता है और फिर MapiSendMailW को ठीक से काम करेगा। मैं बस माइक्रोसॉफ़्ट इंटरनेट एक्सप्लोरर और एडोब रीडर का परीक्षण कर रहा था जब मैं इस निष्कर्ष पर आया कि "मेरे डीएलएल का यूनिकोड मैपिसेन्डमेल काम कभी नहीं कहा जाता है"। लेकिन बाद में मुझे पता चला है कि यूनिकोड की बात आने पर ये एप्लिकेशन एमएपीआई के साथ ठीक से काम नहीं करते हैं, समस्या इन अनुप्रयोगों के साथ थी। आपको इसके बारे में कुछ भी करने की ज़रूरत नहीं है। अन्य कार्यक्रम मेरे डीएलएल के यूनिकोड मैपिसेन्डमेल काम के साथ ठीक तरह से काम करते हैं।

इसके अलावा, मैंने एमएपीआई डीएलएल हैंडलर के 64-बिट संस्करण को संकलित और पंजीकृत करने में भी कामयाब रहा है। देखभाल को केवल संरचना आकारों के साथ ले जाना है - 64 बिट विंडोज़ के संरेखण के विभिन्न नियम हैं तो 32-बिट। सभी क्षेत्रों को 8 बाइट्स द्वारा गठबंधन किया जाना है। पॉइंटर्स को 64-बिट होना चाहिए, जबकि पूर्णांक (उलझन) 32-बिट होना चाहिए। 64-बिट के तहत TMapiMessageW संरचना का आकार 96 बाइट है, जबकि Win32 के तहत यह 48 बाइट्स है।

संबंधित मुद्दे