1

Microsoft Word には、ドキュメントが添付された新しいメッセージを Outlook で作成する「添付ファイルとして送信」機能があります。

Outlook をカスタム メール エージェントに置き換えたいのですが、その方法がわかりません。現在、私のメール エージェントは単なる実行プログラムであり、ファイル名をパラメーターとして受け取ります。

私の知る限り、「添付ファイルとして送信」は MAPI と呼ばれる DLL/API を使用しています。ファイル名の引数を単に受け入れるのではなく、「添付ファイルとして送信」するときに MS Word が使用する MAPI(?) 呼び出しを受信できるように、アプリを変更する必要があります。

さらに、アプリにリダイレクトするだけの独自の MAPI32.dll スタブを作成して、既定のメール エージェントを変更する必要があります。

これをどのように達成できるかについて、誰かがより多くの情報を持っていれば幸いです!

4

2 に答える 2

1

独自の mapi 実装を作成する場合、システム スタブ mapi dll (c:\windows\system32\mapi32.dll、mapistub.dll と同じである必要があります) のために、適切なエクスポートと呼び出し規約の両方で dll を作成することが重要です。呼び出しを dll に渡します。MAPI 関数は、__stdcall 呼び出し規約で呼び出されます。また、システム スタブによって mapi dll が選択されるように、適切なレジストリ キーを設定することも重要です。アプリケーションが mapi 呼び出しを行うときに使用する特定の mapi dll を指定するために、適切なレジストリ キーを既に見つけているようです。

私はつい最近、これとまったく同じことをしました。独自のスケルトン mapi dll を作成しましたが、拡張された mapi 関数を呼び出すシステム スタブを取得するのに多くの問題がありました。重要なのは、mapi32.dll が、mapi インターフェイスの「foo」エントリポイントではなく、「foo@x」エントリポイントで GetProcAddress を呼び出して、dll が拡張 mapi に「準拠」しているかどうかをテストすることでした (簡単な方法だと思います)。 mapi は、「foo@x」を使用せず、プレーンな「foo」エントリポイント名を呼び出します)。また、すべてのシンボル名を正しくするために、自分のプロジェクトでスケルトン ライブラリ インターフェイス ファイルを "As C++" ではなく "As C" でコンパイルする必要がありました。

たとえば、MAPIInitialize はソース コードで次のように宣言する必要があります。

HRESULT __stdcall MAPIInitialize( LPVOID lpMapiInit )
...

次のようなエントリを含む .def ファイルを指定する必要があります。

EXPORTS
    MAPIInitialize@4=_MAPIInitialize@4
    MAPIInitialize=_MAPIInitialize@4

単純な mapi 呼び出し (拡張 mapi 呼び出しとは対照的に) の場合、「二重エクスポート」は必要ない場合があります。動作中の mapi 実装のエクスポートがどのように見えるかを確認するには、次のようにします (システムに Outlook がインストールされている場合)。

c:\> dumpbin /exports c:\Program Files\Common Files\SYSTEM\MSMAPI\1033\msmapi32.dll

(または のレジストリで見つけたパスに置き換えますHKLM\Software\Clients\Mail\Microsoft Outlook\DLLPathEx)

于 2010-04-20T10:32:07.253 に答える
0

わかりました、私自身の質問に答えます。「MAPISendDocuments」および/または「MAPISendMail」関数が定義された DLL をビルドする必要があります。

この DLL には任意の名前を付けることができ、HKLM/Software/Clients/Mail/MyMailApp/DLLPath のレジストリで参照されます。

Delphi を使用した例が見つかりました...

于 2009-09-27T08:37:31.600 に答える