- 追加された行はこの色です。
- 削除された行はこの色です。
今回は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を初期化します
_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指定なのでインターネット上のファイルのアドレスを指定することで
そのファイルを埋め込むことができます
このようにCOMは、ローカルやインターネット上限らず、モジュールを部品のように使うことができます。
(COMはOLE(ローカル上でのモジュール通信)とActiveX(インターネット上でのモジュール通信)の両方を包括している)
全ソースコードは下から
&ref(main.cpp);
今回使ったフラッシュは下から
今回使ったFlashは下から
&ref(k3.swf);
#vote((^ω^)やったお[0],何これwww意味不すぎwww[0],。(`ω´#)。あぁん?最近、だらしねぇな[0])