Kuroda Software Service
HTMLダイアログの表示
 

コンテンツ内メニュー

表示モード 全項表示  部分表示



マークの色と認証の関係

一般公開

無料認証

購入認証


認証についての説明

無料アカウント作成フォーム

有料ページ購入フォーム


ほかのコンテンツトップページ

HTMLダイアログの表示

MSHTML.DLLの関数を呼び出してHTMLダイアログを表示します。

/*--------------------------------------------------------------------------------

HTMLダイアログの表示

Kuroda Software Service 黒田英之

--------------------------------------------------------------------------------*/

#include <windows.h>

#include <comdef.h>

#include <urlmon.h>                  //CreateURLMoniker

#pragma comment(lib, "urlmon.lib")   //CreateURLMoniker

 

class Console

{

    HANDLE CONIN; HANDLE CONOUT;

    TCHAR Buf[0x800];DWORD Len;

 

    public:

    Console()

    {

        AllocConsole();

        CONIN  = CreateFile(TEXT("CONIN$"),  GENERIC_READ,  0, NULL, OPEN_EXISTING, 0, NULL);

        CONOUT = CreateFile(TEXT("CONOUT$"), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

    }

    void SetColor(WORD color){SetConsoleTextAttribute(CONOUT, color);}

    _bstr_t Input()

    {

        //\r\nの\rを踏み潰し改行無しの文字列としていることに注意

        ReadConsole(CONIN, Buf, sizeof(Buf), &Len, NULL); Buf[Len - 2] = 0x00; return(Buf);

    }

    void Print(const _bstr_t &str)

    {

        //長大な書き込みは無視されるので自身バッファ長に分割して出力

        LPTSTR st = (LPTSTR)str; LPTSTR en = st + lstrlen(str); DWORD size = sizeof(Buf);

        while(st < en){WriteConsole(CONOUT, st, (st + size < en)? size: en - st, &Len, NULL); st += Len;}

    }

    void Println(const _bstr_t &str){Print(str);Print("\r\n");}

    void Printf(const _bstr_t format, ...){wvsprintf(Buf, format, (va_list)(&format + 1));Print(Buf);}

    ~Console()

    {

        if(CONIN  != NULL) CloseHandle(CONIN);

        if(CONOUT != NULL) CloseHandle(CONOUT);

        FreeConsole();

    }

}CONSOLE;

 

//コンソール呼び出しの簡略化

#define SetColor CONSOLE.SetColor

#define Input    CONSOLE.Input

#define Print    CONSOLE.Print

#define Println  CONSOLE.Println

#define Printf   CONSOLE.Printf

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

   

    MSG Msg;

    HINSTANCE Dll;

    try

    {

        SetColor(0x0A); Println("<<< HTMLダイアログの表示 >>>");

        CoInitialize(NULL);

        //関数を動的に取得するための関数型定義(VC7以降であればmshtmhst.hを利用することもできる)

        typedef HRESULT (WINAPI *_ShowHTMLDialogEx)(HWND, IMoniker*, DWORD, VARIANT*, WCHAR*, VARIANT*);

        _ShowHTMLDialogEx ShowHTMLDialogEx; Dll = LoadLibrary(TEXT("mshtml.dll"));

        ShowHTMLDialogEx = (_ShowHTMLDialogEx)GetProcAddress(Dll,"ShowHTMLDialogEx");

        IMonikerPtr mon; CreateURLMoniker(NULL, L"about:blank", &mon);

        ShowHTMLDialogEx(NULL, mon, 0x40, NULL , NULL, NULL);

        SetColor(0x0A); Println("<<< ウインドウを閉じてください >>>");

        //Consoleウインドウに対するWM_CLOSEはスレッドにWM_QUITを送るのでメッセージループは終了する

        while(GetMessage(&Msg, NULL, 0, 0 ) != 0){TranslateMessage(&Msg); DispatchMessage(&Msg);}

    }

    catch(...)

    {

        MessageBox(NULL, TEXT("Unknown Erroe"), TEXT("Console C++"), 0);

    }

   

    FreeLibrary(Dll);

    CoUninitialize();

    return(0);

}

実行結果




l         CoInitializeとは何か?

 CoInitialize(NULL)はCOM環境をSTA
(シングルスレッドアパートメント)に初期化します。COMインスタンスは生成元スレッドが所有します。他スレッドからの呼び出しはマーシャリング経由で所有スレッドへ伝達されます。これに対してMTA(マルチスレッドアパートメント)の場合は異なるスレッド間でCOMインスタンスを利用可能です。COMのジュールの設計にもよりますがSTAの方が安全であると表現できます。

 上記コードではCoInitialize(NULL)とCoUninitialize()のスコープが異なることに注意してください。もしtryブロックにCoUninitialize()が存在した場合、COMインスタンスの消滅前にCoUninitialize()が呼ばれる可能性が出てしまいます。必ずCOMインスタンスが完全に消滅した後のスコープでCoUninitialize()しなければなりません。

l         動的なDLL呼び出しとは?

 上記コードではMSHTML.DLL中に存在するShowHTMLDialogEx関数アドレスを取得し呼び出しています。そのためには引数情報が必要ですから事前にtypedefで関数ポインターの型を宣言する必要があります。このテクニックはヘッダやライブラリが用意されていないDLL関数を呼ぶ場合に多用される手法ですので十分に理解する必要があります。


 

©クロダ ソフトウェア サービス programmed by hidebou