独自の 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
)