Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   MAPI umbiegen (https://www.delphipraxis.net/122530-mapi-umbiegen.html)

hmb 17. Okt 2008 16:45


MAPI umbiegen
 
Hallo,
ich suche eine Möglichkeit in Windows die MAPI-Schnittstelle so umzubiegen, dass mit "Datei Senden an E-Mail-Empfänger" nicht Thunderbird oder Outlook aufgerufen wird sondern ein von mir selbst erstelltes Programm. Es sollen auch alle anderen Aufrufe, wie z.B.: aus Acrobat-Reader oder Open Office heraus funktionieren.
Hat da jemand eine Idee???

mkinzler 17. Okt 2008 17:04

Re: MAPI umbiegen
 
Dein Programm muss dafür MAPI implementieren

hmb 17. Okt 2008 17:18

Re: MAPI umbiegen
 
Hallo,
ich habe mir mal den Code von Thunderbird runtergeladen und ein bisschen angeschaut:
:gruebel: :gruebel:
Ist zu heftig, denk ich.
Gibt es nicht irgendwelche Tools, Hacks etc...?

Xeres 17. Okt 2008 17:20

Re: MAPI umbiegen
 
Du musst hierfür eine eigene MAPI-DLL schreiben. Folgender Thread hat mir hierbei geholfen:

Simple MAPI-DLL erstellen

Ansonsten sei noch gesagt, dass sich viele Programme unterschiedlich verhalten bei der Ansteuerung der MAPI-DLL... Du solltest also jedes Programm testen, dass deine MAPI-DLL anspricht.
Dein Programm musst du dann natürlich als Standard-EMailprogramm im System integrieren. Hierfür gibt es auch fertige Routinen.

Achja der Firefox sendet übrigens bei "Link senden an E-Mailempfänger" ein einfaches mailto-> Kannst du wieder per Parameter-Abfrage im Programm bewerkstelligen.

hmb 17. Okt 2008 18:26

Re: MAPI umbiegen
 
Hey, das geht ja richtig flott,
:P

wenn ich den Code und die Antwort richtig verstehe wird hier eine eigene Mapi.Dll erzeugt (MyMapi)
in der Funktion
Delphi-Quellcode:
function MapiSendDocuments(ulUIParam: Cardinal; lpszDelimChar: LPSTR;
  lpszFilePaths: LPSTR; lpszFileNames: LPSTR; ulReserved: Cardinal): Cardinal; stdcall;
begin
//    MessageBeep(0);

    {
    ShowMessage('SendDocuments : Deli : "'+lpszDelimChar+'"'+#13+#10+
        'FilePAth : "'+lpszFilePaths+'"'+#13+#10+
        'lpszFileNames : "'+lpszFileNames+'"'
    );
    }
    SendMAPIDocuments(lpszDelimChar, lpszFilePaths, lpszFileNames);
    Result := SUCCESS_SUCCESS;
end;
wird dann nicht einfach die Funktion aus der ursprünglichen MAPI (MS) aufgerufen?
Woher weiß dann das Betriebssystem, welche Mapi es verwenden soll?
Eigentlich, so wie ich das verstehe, müsste ich an der Stelle, anstatt SendMAPIDocuments aufzurufen, meine eigene Suppe kochen. (= Zimbra Server mit SOAP ansprechen) Dann muss nur noch das Betriebssystem meine myMapi.dll anstatt der herkömmlichen Mapi nehmen un das wärs?? Oder verstehe ich alles falsch?.

hmb 20. Okt 2008 07:47

Re: MAPI umbiegen
 
Nachtrag:

Zitat:

Dein Programm musst du dann natürlich als Standard-EMailprogramm im System integrieren. Hierfür gibt es auch fertige Routinen.
Wo gibt es diese Routinen?

Xeres 20. Okt 2008 09:44

Re: MAPI umbiegen
 
Ich weiß leider nicht mehr woher ich diese Routinen genau hab. Hab sie aber auf jeden Fall auch angepasst gehabt. Leider gibt es ab und zu bei manchen Rechner trotzdem noch Probleme, dass sich z.B. Outlook statt unser Mailprogramm öffnet. Bei 95-99% aller Rechner funktionierts aber komischer weise:

Delphi-Quellcode:
procedure SetDefaultMailTo(AppName,Clientname : string);
var
  Reg : TRegistry;
  DW : DWord;
  aClient, strOMHelperPath : string;
begin
  aClient := Appname;
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if Reg.OpenKey('\mailto\shell\open\command',True)
      then Reg.WriteExpandString('',aClient+' %1');
    Reg.CloseKey;
    if Reg.OpenKey('\mailto\DefaultIcon',True)
      then Reg.WriteExpandString('',aClient+',0');
    Reg.CloseKey;
  finally
    Reg.Free;
  end;
  DW := 2;
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\Software\Clients\Mail',True) then Reg.WriteString('',ClientName);
    Reg.CloseKey;
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName,True) then Reg.WriteString('',ClientName);
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName,True) then Reg.WriteString('DLLPath',ExtractFilepath(aClient)+'om_mapi_dll.dll');
    Reg.CloseKey;
    strOMHelperPath := ExtractFileDir(Application.ExeName) + '\om_Helper.exe';
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\InstallInfo\',True) then Reg.WriteString('HideIconsCommand', strOMHelperPath + ' -HideShortcuts');
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\InstallInfo\',True) then Reg.WriteString('ReinstallCommand', strOMHelperPath + ' -SetAsDefaultMail');
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\InstallInfo\',True) then Reg.WriteString('ShowIconsCommand', strOMHelperPath + ' -ShowShortcuts');
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\InstallInfo\',True) then begin
    Reg.WriteInteger('IconsVisible',0);
    Reg.CloseKey;
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\protocols\mailto\',True) then Reg.WriteString('','URL:MailTo Protocol');
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\protocols\mailto\',True) then Reg.WriteBinaryData('EditFlags',dw,SizeOf(DWord));
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\protocols\mailto\',True) then Reg.WriteString('URL Protocol','');
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\protocols\mailto\DefaultIcon',True) then Reg.WriteExpandString('',aClient+',0');
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\protocols\mailto\shell\open\command',True) then Reg.WriteExpandString('',aClient+' %1');
    Reg.CloseKey;
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName+'\shell\open\command',True) then Reg.WriteExpandString('',aClient+' %1');
    Reg.CloseKey;
  finally
    Reg.Free;
  end;
end;


function CheckDefaultMailTo(strAppName,strClientname : string) : Boolean;
var
  Reg : TRegistry;
  blnStandardClient : Boolean;
begin
  blnStandardClient := false;
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if Reg.OpenKey('\mailto\shell\open\command',false)
      then blnStandardClient := (AnsiUpperCase(Reg.ReadString('')) = AnsiUpperCase(strAppName)+' %1');
    Reg.CloseKey;
    if blnStandardClient then begin
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      if Reg.OpenKey('\Software\Clients\Mail',True)
        then blnStandardClient := (AnsiUpperCase(Reg.ReadString('')) = AnsiUpperCase(strClientname));
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
  result := blnStandardClient;
end;

Wichtig ist hierbei noch:
Die om_helper.exe die da oben auftaucht ist ein Programm, dass über Parameter aufgerufen werden kann und auch diese Funktionen beinhaltet.
Sie wird benutzt wenn der User über "Start->Einstellungen->Systemsteuerung->Software->Programmzugriff und -standards festlegen->E-Mail-Standardprogramm" die Optionen für mein Programm ändert.

Zu deinen Fragen vom 17.10.:
1.) Mach einfach mal ne Showmessage rein und lass dir die Resultate ausgeben. Dann wirst du es am besten verstehen, was hier übergeben wird und wie hiermit umzugehen ist.
2.) Das wird durch die Routine, die ich oben gepostet habe erledigt:

Delphi-Quellcode:
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName,True) then Reg.WriteString('',ClientName);
    if Reg.OpenKey('\Software\Clients\Mail\'+ClientName,True) then Reg.WriteString('DLLPath',ExtractFilepath(aClient)+'om_mapi_dll.dll');
Hier sieht man es gut :)

3+4.) Das hast du richtig verstanden.


Viel Erfolg.

P.S.: Wenn du den Fehler in der Routine oben finden solltest, der dafür sorgt, dass es nicht bei jedem User funktioniert, dann geb bescheid ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz