.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 クライアントはインストールされないためです。したがって、ユーザーがすでにできることを達成できる必要があります。