「ファイル名を指定して実行」ダイアログを表示する

 またまた隠し関数ネタを含んでます。このダイアログを表示する方法は2種類あるので、簡単な方から(といってもインターフェイス関係を使いますが)ご紹介しましょう。

 シェル関係のインターフェイスを利用するのは、ショートカット作成以来2度目ですが、今回はIE4以上限定のコードになります。あまりおすすめできませんので、コードと少しの解説にとどめさせていただきます。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <shlobj.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine, int       nCmdShow )
{
    IShellDispatch *pShell;
    HRESULT         hr;
    CoInitialize(NULL);

    hr = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER,
             IID_IShellDispatch, (void**)&pShell);
    //↑インターフェイスのポインタを取得
    pShell->FileRun();   // ←ダイアログの表示
    pShell->Release();
    CoUninitialize();
    return 0;
}

IShellDispatchインターフェイスを作成し、そのインターフェイスのFileRunメソッドを呼び出します。呼び出し方がシンプルな分だけ、指定できるオプションがありません。詳細に指定したい・どのアプリを実行したか知りたい場合は下のAPI版をご利用ください。


 次は、お待ちかね、Shell32.dllの隠し関数を使用する方法です。もう慣れた思いますが、LoadLibrary、GetProcAddress、呼び出し、FreeLibraryの順で行うだけです。今回の関数のインデックスは、61です。

以前分からなかった引数も判明し、やっと完全になりました(00/05)
WindowsNTでも正常に動作するために、このドキュメント もご覧ください

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine, int       nCmdShow )
{
#define SHRD_DEFAULT       0x00    // 通常の画面
#define SHRD_NOBROWSE      0x01    // 参照ボタンを非表示
#define SHRD_NOMRU         0x02    // MRUを非表示
#define SHRD_CALCDIRECTORY 0x04    // 現在のフォルダの中身を探す
#define SHRD_NOLABEL       0x08    // エディットボックスのラベルを削除
#define SHRD_OSEPARATEMEM  0x20    // メモリ空間を分けるチェックボックスを削除

    // 関数型宣言
    typedef void (WINAPI *SHRUNDIALOG)
        (HWND hWnd, HICON hIcon, LPCTSTR lpszPath,
        LPCTSTR lpszTitle, LPCTSTR lpszPrompt, int uFlags);

    SHRUNDIALOG SHRunDialog;
    HANDLE  hShell32;

    hShell32 = LoadLibrary(TEXT("SHELL32.DLL"));

    if (hShell32)
    {
        SHRunDialog = (SHRUNDIALOG)
                GetProcAddress((HINSTANCE)hShell32, (LPCSTR)61);

        if (SHRunDialog){
            // 文字列引数に注意
            SHRunDialog(NULL, NULL, TEXT("C:\\Windows\\system"), TEXT("アプリの起動"),
                TEXT("\n起動するパスを設定してね"), 0);
        }
        FreeLibrary((HINSTANCE)hShell32);
    }
    return 0;
}

関数についての情報は、SHRunDialog関数 の解説をごらんください。

サンプルソースのダウンロード(2番目の方法です)


記事の無断転載は禁止です。 Copyright 1999-2001 Runan. All Rights Reserved.