閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

アプリケーションを ROT(Running Object Table) に登録する

.NET2.0 の場合、 IRunningTableObject を使用すれば良いようです。これは .NET2.0 から追加されたクラスで、それ以前の場合は UCOMIRunningTableObject になるようですが、使い方はたぶん、大体同じ。なので .NET1.0 でのサンプルでも、 UCOMxxx の UCOM を取っ払えば .NET2.0 に転用できます。

とりあえず登録は、こんな感じでできるようです。

class OLE32
{
    [DllImport("Ole32.Dll")]
    public static extern int CreateBindCtx(
        int reserved, 
        out IBindCtx bindCtx);

    [DllImport("Ole32.Dll")]
    public static extern int CreateItemMoniker(
        [MarshalAs(UnmanagedType.LPWStr)] string lpszDelim, 
        [MarshalAs(UnmanagedType.LPWStr)] string lpszItem,
        out IMoniker ppmk);
}

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        // ここから ----
        IBindCtx bc;
        OLE32.CreateBindCtx(0, out bc);

        IRunningObjectTable tbl;
        bc.GetRunningObjectTable(out tbl);

        IMoniker moniker;
        OLE32.CreateItemMoniker("!", "hoge", out moniker);

        tbl.Register(0, this, moniker);
        // ---- ここまで
    }
}

これをビルドして実行し、 ROT Viewer で見ると hoge が登録されます。ただ IRunningObjectTable::Register メソッドに渡す引数が正しいのかとか、そもそも ROT ってなんやねん状態なので色々怪しいので、あまり上記コードは信用しない方が良いと思われます。もうちょっと理解が進んだらまた書きます。

しかし思いのほか面倒です。 exe でなければとても簡単なのに……。これならまだ素直に VC + ATL でやった方が楽なのかもしれないなあ。