「C言語/C++/wmpdlg」の編集履歴(バックアップ)一覧に戻る

C言語/C++/wmpdlg - (2012/09/22 (土) 15:30:02) のソース

|開発環境|Microsoft Visual C++ 2010 Express (SP1)|
|実行環境|Microsoft Windows XP Home Edition (SP3)|
|プロジェクトの種類|Win32 プロジェクト|
|プロジェクト名|wmpdlg|
|アプリケーションの種類|Windows アプリケーション|
|追加のオプション|空のプロジェクト|

参考
-[[IEコンポーネントのクラス(VC++ 2005) - 無職日記~無限回廊編~>http://d.hatena.ne.jp/iamjack/20070225/1172417507]]
-[[IEコンポーネントの使い方>http://www.nitoyon.com/vc/tips/ie_component.htm]]

wmpdlg.cpp
#highlight(cpp){{
/*
Windows Media Player
HKEY_CLASSES_ROOT\CLSID\{6BF52A52-394A-11d3-B153-00C04F79FAA6}
InprocServer32
C:\WINDOWS\system32\wmp.dll
ThreadingModel:Apartment
ProgID:WMPlayer.OCX.7
*/
#include <Windows.h>
#include "resource.h"

#import "wmp.dll" high_method_prefix("M") named_guids no_namespace

// 関数型定義
typedef BOOL (WINAPI *ATLAXWININIT)();
typedef HRESULT (WINAPI *ATLAXGETCONTROL)(HWND, IUnknown **);

// 関数プロトタイプ宣言
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

// 外部変数
ATLAXGETCONTROL AtlAxGetControl;

//==============================================================================
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow)
{
	HMODULE hMod;
	HRESULT hr;
	BOOL b;
	int i;

	hMod = LoadLibrary(TEXT("atl100.dll"));
	if (hMod == NULL) return 0;

	hr = CoInitialize(NULL);
	if (FAILED(hr)) return 0;

	ATLAXWININIT AtlAxWinInit = (ATLAXWININIT)GetProcAddress(hMod, "AtlAxWinInit");
	if (AtlAxWinInit == NULL) return 0;
	AtlAxGetControl = (ATLAXGETCONTROL)GetProcAddress(hMod, "AtlAxGetControl");
	if (AtlAxGetControl == NULL) return 0;

	b = AtlAxWinInit();
	if (b == FALSE) return 0;

	i = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc);

	// b = AtlAxWinTerm();	// 必要があれば呼ぶ
	CoUninitialize();
	b = FreeLibrary(hMod);
	return 0;
}

//------------------------------------------------------------------------------
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static IWMPPlayer4 *player;
	HWND hWnd;
	HRESULT hr;
	INT_PTR iResult = TRUE;

	switch (uMsg) {
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDC_BUTTON1:
			{
				TCHAR strFile[MAX_PATH] = {0};
				OPENFILENAME ofn;

				ZeroMemory(&ofn, sizeof ofn);
				ofn.lStructSize = sizeof ofn;
				ofn.hwndOwner = hDlg;
				ofn.Flags = OFN_FILEMUSTEXIST;
				ofn.lpstrFile = strFile;
				ofn.nMaxFile = sizeof strFile;
				BOOL b = GetOpenFileName(&ofn);
				if (b == FALSE) break;

				hWnd = GetDlgItem(hDlg, IDC_LABEL1);
				SetWindowText(hWnd, strFile);
				hr = player->put_URL(strFile);
			}
			break;
		}
		break;
	case WM_INITDIALOG:
		{
			IUnknown *pUnk;

			hWnd = GetDlgItem(hDlg, IDC_OCX1);
			hr = AtlAxGetControl(hWnd, &pUnk);
			pUnk->QueryInterface(IID_PPV_ARGS(&player));
		}
		break;
	case WM_CLOSE:
		EndDialog(hDlg, IDOK);
		break;
	default:
		iResult = FALSE;
	}
	return iResult;
}
}}

resource.h
#highlight(cpp){{
#define IDD_DIALOG	100

#define IDC_LABEL1	1000
#define IDC_BUTTON1	1001
#define IDC_OCX1	1002
}}

wmpdlg.rc
#highlight(cpp){{
// リソーススクリプト
#include <windows.h>
#include "resource.h"

IDD_DIALOG DIALOGEX 100, 100, 320, 240
STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX
EXSTYLE WS_EX_APPWINDOW
CAPTION "wmpdlg"
FONT 9, "MS Pゴシック"
BEGIN
	LTEXT		"label1",IDC_LABEL1,4,4,204,8
	PUSHBUTTON	"選択",IDC_BUTTON1,4,16,56,16
	CONTROL		"{6BF52A52-394A-11D3-B153-00C04F79FAA6}",IDC_OCX1,"AtlAxWin100",
			WS_TABSTOP,4,36,312,200
END
}}