今回はATLを使ってウィンドウ上にFlashを埋め込んでみます ATLとはActive Template Libraryの略で、COMプログラミングを簡単に行えるようにするための マイクロソフトによるテンプレートベースのC++専用ライブラリです 今回はFlashをすでにCOMで実装されている機能を使ってウィンドウに関連付け、再生します ここで注意ですがFlash Playerの既存の機能を使っているため IE(インターネットエクスプローラ)上でFlashが見れなければ埋め込みは失敗します &ref(flashwindow.JPG); 計算Flashを埋め込んでみました ---------------------------------------------------- 今回の全ソースコードです #include <tchar.h> #include <windows.h> // ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if(msg == WM_DESTROY) PostQuitMessage(0); return (DefWindowProc(hWnd, msg, wParam, lParam)); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { const TCHAR* WC_BASIC = _T("Basic"); // ウィンドウクラス名 /********************************************/ /* ウィンドウクラスの定義と登録 */ /********************************************/ // シンプルウィンドウクラス設定 WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, WndProc, 0,0,hInstance, (HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED), (HCURSOR)LoadImage(NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED), (HBRUSH)GetStockObject(WHITE_BRUSH), NULL, WC_BASIC , NULL}; // シンプルウィンドウクラス登録 RegisterClassEx(&wcex); /********************************************/ /* ウィンドウの作成 */ /********************************************/ HWND hWnd = CreateWindowEx( 0, //拡張ウィンドウスタイル WC_BASIC, //ウィンドウクラス名 _T("タイトル"), //タイトルバーにこの名前が表示されます WS_OVERLAPPEDWINDOW | WS_VISIBLE, //ウィンドウスタイル CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 640, //幅 480, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドルorリソースID hInstance, //インスタンスハンドル NULL); RECT rect; GetClientRect(hWnd,&rect); void* init = GetProcAddress(LoadLibrary(_T("atl")),"AtlAxWinInit"); _asm call init; CreateWindow(_T("AtlAxWin"), _T("C:\\k3.swf"), WS_CHILD | WS_VISIBLE,0,0,rect.right - rect.top,rect.bottom - rect.top,hWnd,NULL,hInstance,NULL); MSG msg={0}; while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg); }; 肝心のフラッシュ埋め込みですが実質3行です void* init = GetProcAddress(LoadLibrary(_T("atl")),"AtlAxWinInit"); _asm call init; CreateWindow(_T("AtlAxWin"), _T("C:\\k3.swf"), WS_CHILD | WS_VISIBLE,0,0,rect.right - rect.top,rect.bottom - rect.top,hWnd,NULL,hInstance,NULL); LoadLibrary関数でATLをロードします その後、voidポインタにAtlAxWinInit関数ポインタを取得します void* init = GetProcAddress(LoadLibrary(_T("atl")),"AtlAxWinInit"); そして、AtlAxInit関数の呼び出しを行っています AtlAxInit関数はATLを初期化します これはあとで使うAtlAxWinクラスを登録しています _asm call init; ここで、_asmキーワードというものが出てきます VC++ではインラインアセンブラというものが使えます (gccやg++などのコンパイラでは使えませんが・・・) VC++ではC/C++のソースコードは一度アセンブラコードに落とされるのですが インラインアセンブラを使うとC/C++ソースコード上でアセンブラで直接命令することができます インラインアセンブラ命令であるcall命令を行うとサブルーチン(関数)の先頭ポインタの呼び出しがされます その後、サブルーチン(関数)の処理がされます 関数ポインタの型を考えなくてよいのでトリッキーですがかなり便利な方法です 今回は子ウィンドウとしてFlashの張り付けを行っています CreateWindow(_T("AtlAxWin"), _T("C:\\k3.swf"), WS_CHILD | WS_VISIBLE,0,0,rect.right - rect.top,rect.bottom - rect.top,hWnd,NULL,hInstance,NULL); 第一引数のウィンドウクラス名にはAtlAxWinを指定します 第二引数にはここで注意してほしいのはURI指定しなければいけません ローカル(自分のPC)のファイルならば絶対パス指定となります たとえば、Cドライブ直下にこのFlashファイル(.swf)を置くならば次のような指定になります C:\\k3.swf もちろん指定のファイルは指定の場所に存在していなければなりません また、URI指定なのでインターネット上のファイルのアドレスを指定することで そのファイルを埋め込むこともできます 試しに次のアドレスを指定するとネットワーク上の.swfが埋め込まれます http://k3tec.net/neko_wiki/index.php?plugin=attach&refer=%A3%D7%A3%E9%A3%EE%A3%B3%A3%B2%A3%C1%A3%D0%A3%C9%B9%D6%BA%C211%B2%F3&openfile=k3.swf このようにCOMは、ローカルやインターネット上限らず、モジュールを部品のように使うことができます。 (COMはOLE(ローカル上でのモジュール通信)とActiveX(インターネット上でのモジュール通信)の両方を包括しています) 全ソースコードは下から &ref(main.cpp); 今回使ったFlashは下から &ref(k3.swf); #vote((^ω^)やったお[0],何これwww意味不すぎwww[0],。(`ω´#)。あぁん?最近、だらしねぇな[0]) |(^ω^)やったお|0| |何これwww意味不すぎwww|0| |。(`ω´#)。あぁん?最近、だらしねぇな|0|