今回はATLを使ってウィンドウ上にFlashを埋め込んでみます
ATLとはActive Template Libraryの略で、COMプログラミングを簡単に行えるようにするための
マイクロソフトによるテンプレートベースのC++専用ライブラリです
今回はFlashをすでにCOMで実装されている機能を使ってウィンドウに関連付け、再生します
ここで注意ですがFlash Playerの既存の機能を使っているため
IE(インターネットエクスプローラ)上でFlashが見れなければ埋め込みは失敗します

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(インターネット上でのモジュール通信)の両方を包括しています)

全ソースコードは下から
filemain.cpp
今回使ったFlashは下から
filek3.swf

選択肢 投票
(^ω^)やったお 0  
何これwww意味不すぎwww 0  
。(`ω´#)。あぁん?最近、だらしねぇな 0  

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS