4

.MAPIMailいくつかのファイル (またはシェル ファイル オブジェクト) を指定して、登録済みのシェル拡張ハンドラーを呼び出すにはどうすればよいですか?


質問

コンピューターにいくつかのファイルがあります。

  • C:\Users\ian\AppData\Local\Temp\Contoso_Invoice_141174.pdf
  • C:\Users\ian\AppData\Local\Temp\Contoso_Invoice_141173.pdf
  • C:\Users\ian\AppData\Local\Temp\Contoso_Invoice_141171.pdf

登録されたハンドラーにそれらをドロップするのと同等のプログラムを実行したい:.MAPIMail

ここに画像の説明を入力

[送信先] フォルダーの [メール受信者] オプションは、実際には特別に登録された.MAPIMail拡張子です。

ここに画像の説明を入力

システムに登録されているファイルの種類は次のとおりです。

HKEY_CLASSES_ROOT\.mapimail

.mapimail一時ファイルへのドロップを呼び出すにはどうすればよいですか?

レジストリを見ていただけませんか?

.mapimailさて、私は悪い開発者であり、エントリのデフォルト値であるレジストリを綴る可能性があります。

CLSID\{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}

clsid{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}を抽出し、クラスが登録されていることを確認します。

HKEY_CLASSES_ROOT\CLSID\{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}
    (default) = Desktop Shortcut
    \InProcServer32
        (default) = %SystemRoot%\System32\sendmail.dll

そしてCoCreateInstance、その COM オブジェクトを作成するために使用します。

IUnknown unk = CreateComObject("{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}");

そして、私は文書化されておらず、サポートされていない世界にいます。そこでは、どのインターフェースが必要なQueryInterfaceのか、どのメソッドをどの順序で呼び出すべきかわかりません。

残りはシェルプログラミングです

私が望むのは、おそらくシェルに関係するものです(疑似コード):

IShellFolder desktop;
OleCheck(SHGetDesktopFolder(out desktop));

List<pidl> pidls = new List<pidl>();

ULONG chEaten = 0;
ULONG dwAttributes = 0;
PIDL pidl;

foreach (String filename in Files) do
{
    OleCheck(desktop.ParseDisplayName(0, nil, filename, out chEaten, out pidl, ref dwAttributes));

    pidls.Add(pidl);
}

//Get the shell folder of the temp folder
IShellFolder tempShellFolder;
desktop.ParseDisplayName(0, nil, GetTemporaryPath, out chEaten, out pidl, ref dwAttributes));
desktop.BindToObject(pidl, nil, IShellFolder, tempShellFolder);

//i have no idea what i've been doing; just throwing reasonable looking code together
//nobody will actually ever read this

IDontCare context;

tempShellFolder.GetUIObjectOf(0, pidls.Count, pidls, IDontCareAnymore, nil, ref context); 

そのすべてのコードが、私が持っていないコンテキストメニューの存在に依存していることを除いて。.MAPIMailそれがどのような状況にあってもいいとは誰も言いません [送信先] メニュー。

ファイルをファイルにドロップする方法を尋ねていました.mapimail

そして私の神。

なぜ MAPI を使用しないのですか?

Office 64 ビットがインストールされた Windows 64 ビットで実行されている 32 ビット アプリケーションの場合、MAPI クライアントはインストールされないためです。したがって、ユーザーがすでにできることを達成できる必要があります。

4

1 に答える 1