Ich habe eine einfache MAPI-Provider-DLL geschrieben, die die folgenden Funktionen implementiert:
%Vor% Ich habe meine DLL in der Registry HKLM\SOFTWARE\Clients\Mail\
registriert und kann sie über "Default programs" auswählen.
Es funktioniert perfekt (aber nur mit ANSI-Zeichen)!
Nun versuche ich Unicode-Unterstützung dafür hinzuzufügen.
Ich habe MapiSendMailW umgesetzt und haben es in den „Export“ der DLL deklariert, so dass MAPI DLL Stummel sehen konnte, dass es exportiert MapiSendMailW und ist somit Unicode.
Diese Unicode-MapiSendMailW-Funktion meiner DLL wird jedoch nie aufgerufen. Die ANSI-Version, MapiSendMail, wird stattdessen aufgerufen.
Wenn ich Anwendungen verwende, die MAPI aufrufen, z. Microsoft Internet Explorer (per E-Mail-Links senden) oder Adobe Reader (in Dateien per E-Mail senden), kommen nationale Zeichen meiner DLL in MapiSendMail durch Fragezeichen ersetzt. Wenn ich den Standard-E-Mail-Client zu Outlook wechsel, sendet Microsoft Internet Explorer nationale Zeichen richtig.
In der Zwischenzeit wirbt Outlook mit seiner MAPI-DLL als Unicode. Ich habe diesen Registrierungswert "SupportUTF8" unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Clients\Mail\Microsoft Outlook
Wenn ich diesen Registrierungsschlüssel gelöscht haben, Microsoft Internet Explorer hat auch nationale Sonderzeichen zu ersetzen begonnen in Fragezeichen, wenn Outlook aufrufen, wenn ich Datei wählen / Senden / Verbindung per E-Mail.
So scheint es, dass "SupportUTF8" unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun.....
Sinn hatte.
Mein Kunde ist unter HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\.....
Hinzufügen SupportUTF8 meinem Klienten keinen Sinn (noch Marken in Frage stellen, und kein MapiSendMailW genannt, aber MapiSendMail von MSIE (Datei | Senden | Link per Email) Selbst SupportUTF8 Zugabe zu HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Microsoft Outlook
nicht machen MSIE keine nationalen Zeichen ersetzen. Fragezeichen, wenn Outlook aufgerufen wird
Regadless des SupportUTF8 Registrierungswert, wenn mein Client von MS Word aufgerufen wird, wird es MapiSendMail, aber in ulReserved es wird UTF8 Codepage-Nummer, so dass mein Kunde in der Lage ist, nationale Zeichen angezeigt werden soll. Aber es kommt nicht von MSIE (Datei | Senden | Link per E-Mail), die immer nationale Zeichen zu Fragezeichen mit meinem Kunden ersetzt.
Was soll ich zu meiner DLL hinzufügen, damit Windows Stub es als Unicode sieht und MapiSendMailW aufruft? Sollte ich registrieren andere Funktionen in der DLL implementieren, um dem Stub zu zeigen, dass es Unicode ist?
Ich habe zwei Tests gemacht:
1) Unter Windows 10 64-Bit. Die MAPI-DLL ist 32-Bit. Der Prozessmonitor (von Sysinternals) zeigt, dass MSIE einen Prozess fixmapi.exe ausführt, der wiederum die MAPI-Aufrufe aufruft.
2) Unter Windows 7 32-Bit. Es wird keine fixmapi.exe verwendet: MSIE ruft meine DLL direkt auf, ruft aber MapiSendMailW nicht auf.
Allerdings ruft meine MAPI-Testanwendung meine DLL mit MapiSendMailW auf.
Ich habe eine Lösung für dieses Problem gefunden. Mein Simple MAPI Provider war in Ordnung und MapiSendMailW wurde ordnungsgemäß deklariert. (: \ Windows \ System32 \ mapi32.dll C) und rufen Sie dann MapiSendMailW richtig funktionieren Eine einfache Anwendung, die Loadlibrary nur verwendet das MAPI-DLL von Windows-Systemordner zu laden. Ich habe gerade Microsoft Internet Explorer und Adobe Reader getestet, als ich zu dem Schluss kam, dass die "Unicode MapiSendMailW-Funktion meiner DLL nie aufgerufen wird". Aber ich habe später herausgefunden, dass diese Anwendungen mit MAPI nicht richtig funktionieren, wenn es um Unicode geht, das Problem lag bei diesen Anwendungen. Du musst nichts dagegen tun. Die anderen Programme funktionieren ordnungsgemäß mit der Unicode-MapiSendMailW-Funktion meiner DLL.
Außerdem habe ich es auch geschafft, die 64-Bit-Version des MAPI-DLL-Handlers zu kompilieren und zu registrieren. Sorgfalt muss nur mit Strukturgrößen genommen werden - 64 Bit Windows haben unterschiedliche Regeln der Ausrichtung dann 32-Bit. Alle Felder müssen um 8 Bytes ausgerichtet sein. Zeiger müssen 64-Bit sein, während Ganzzahlen (ULONG) 32-Bit sein müssen. Die Größe der TMapiMessageW-Struktur unter 64-Bit beträgt 96 Byte, während sie unter Win32 48 Byte beträgt.