2017-02-07 13 views
8

Tôi đã viết một nhà cung cấp DLL đơn giản MAPI mà thực hiện các chức năng sau:Làm thế nào để khai báo rằng nhà cung cấp MAPI đơn giản của tôi DLL là Unicode và hỗ trợ MapiSendMailW?

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

Tôi đã đăng ký DLL của tôi trong Registry HKLM\SOFTWARE\Clients\Mail\ và có thể chọn nó thông qua "các chương trình mặc định".

Nó hoạt động hoàn hảo (nhưng chỉ với các ký tự ANSI)!

Bây giờ, tôi đang cố gắng thêm hỗ trợ Unicode cho nó.

Tôi đã triển khai MapiSendMailW và đã khai báo nó vào phần "xuất" của DLL, do đó MAPI DLL có thể thấy rằng nó xuất MapiSendMailW và do đó là Unicode.

Tuy nhiên, chức năng Unicode MapiSendMailW này của DLL của tôi không bao giờ được gọi. Phiên bản ANSI, MapiSendMail, được gọi thay thế.

Khi tôi sử dụng các ứng dụng gọi MAPI, ví dụ: Microsoft Internet Explorer (để gửi liên kết qua email) hoặc Adobe Reader (để gửi tệp qua email), các ký tự quốc gia đến DLL của tôi trong MapiSendMail được thay thế bằng dấu chấm hỏi. Nếu tôi chuyển ứng dụng thư khách mặc định sang Outlook, Microsoft Internet Explorer sẽ gửi các ký tự quốc gia đúng cách.

Trong khi đó, Outlook quảng cáo MAPI DLL của nó dưới dạng Unicode. Tôi đã tìm thấy giá trị đăng ký này "SupportUTF8" dưới HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Clients\Mail\Microsoft Outlook

Khi tôi đã xóa khóa đăng ký này, Microsoft Internet Explorer cũng đã bắt đầu thay thế ký tự quốc gia thành dấu hỏi khi gọi tệp/Gửi/liên kết qua email.

Vì vậy, có vẻ như "SupportUTF8" dưới HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun..... có ý nghĩa.

Khách hàng của tôi được đăng ký theo HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\.....

Thêm SupportUTF8 để khách hàng của tôi đã không có ý nghĩa (vẫn còn nghi ngờ nhãn hiệu, và không MapiSendMailW gọi nhưng MapiSendMail từ MSIE (File | Gửi | Liên kết qua email) Thậm chí thêm SupportUTF8 để HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Microsoft Outlook. không làm cho MSIE không thay thế các ký tự quốc gia thành các dấu hỏi khi các cuộc gọi Outlook

Không phụ thuộc vào giá trị đăng ký SupportUTF8, khi khách hàng của tôi được gọi từ MS Word, nó được MapiSendMail, nhưng trong số đó, nó được số mã UTF8, khách hàng có thể hiển thị các ký tự quốc gia, nhưng nó không xảy ra từ MSIE (File | Send | Link qua email) mà luôn luôn thay thế s ký tự quốc gia để hỏi dấu với khách hàng của tôi.

Tôi nên thêm gì vào DLL của mình để Windows Stub xem nó dưới dạng Unicode và gọi MapiSendMailW? Tôi có nên đăng ký thực hiện các chức năng khác cho DLL để hiển thị cho Stub rằng đó là Unicode?

Tôi đã thực hiện hai thử nghiệm:

1) Trên Windows 10 64 bit. DLL MAPI là 32-bit. Process Monitor (từ Sysinternals) cho thấy MSIE chạy một quá trình fixmapi.exe mà đến lượt nó làm cho các cuộc gọi MAPI.

2) Trên Windows 7 32 bit. Không có fixmapi.exe được sử dụng: MSIE gọi DLL của tôi trực tiếp, nhưng vẫn không gọi MapiSendMailW.

Tuy nhiên, ứng dụng MAPI thử nghiệm của tôi gọi DLL của tôi bằng MapiSendMailW.

+0

Brrr, cày qua số lần truy cập tài liệu của nhân viên CNTT rất ít niềm vui. Tôi nghĩ rằng bạn đang tìm kiếm [thuộc tính này] (https://msdn.microsoft.com/en-us/library/cc815684.aspx), không chắc chắn. –

+0

PR_STORE_UNICODE_MASK là từ MAPI mở rộng, trong khi tôi đã triển khai MAPI đơn giản, để chỉ gửi tin nhắn, không có bất kỳ cửa hàng nào. –

Trả lời

0

Tôi đã tìm thấy giải pháp cho vấn đề này. Nhà cung cấp MAPI đơn giản của tôi là OK và đã tuyên bố MapiSendMailW đúng cách. Một ứng dụng đơn giản chỉ sử dụng LoadLibrary để tải MAPI DLL từ thư mục hệ thống Windows (C: \ Windows \ System32 \ mapi32.dll) và sau đó gọi MapiSendMailW sẽ hoạt động đúng. Tôi vừa thử nghiệm Microsoft Internet Explorer và Adobe Reader khi tôi đi đến kết luận rằng “chức năng Unicode MapiSendMailW của DLL của tôi không bao giờ được gọi”. Nhưng sau này tôi đã phát hiện ra rằng các ứng dụng này không hoạt động đúng với MAPI khi nói đến Unicode, vấn đề là với các ứng dụng này. Bạn không phải làm bất cứ điều gì về nó. Các chương trình khác hoạt động tốt với chức năng Unicode MapiSendMailW của DLL của tôi.

Bên cạnh đó, tôi cũng đã quản lý để biên dịch và đăng ký phiên bản 64 bit của trình xử lý MAPI DLL. Việc chăm sóc chỉ cần thực hiện với kích thước cấu trúc - Windows 64 bit có các quy tắc căn chỉnh khác nhau sau đó là 32 bit. Tất cả các trường phải được căn chỉnh 8 byte. Con trỏ phải là 64 bit, trong khi số nguyên (ULONG) phải là 32 bit. Kích thước của cấu trúc TMapiMessageW dưới 64 bit là 96 byte, trong khi dưới Win32 nó là 48 byte.

Các vấn đề liên quan