RukeとLuNaYuの日記
I know the truth.
I know whole.
And I...know you.
平凡な大学生活の日記です。時折まじめな長文を書く病気になります。興味がなければ読み飛ばしてください。
201708 << 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >> 201710
スポンサーサイト (--/--/--(--) --:--:--)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
アイチューンズ (2006/05/31(水) 06:03:29)

http://www.s34.co.jp/cpptechdoc/misc/comevent/
http://www.nitoyon.com/vc/tips/ie_component.htm
ここを参考にしてiTunes.exeの制御プログラムの雛形らしき物がようやく作れたのだが、なんだかおかしい。関数を呼び出すだけならまったく問題ないのだが、イベントでこっちの関数を呼んでもらうのの挙動がおかしい。時々invokeされなかったり、イベントのidがイベントに対してユニークでない(というより、引数の受け渡し時にアドレスがずれているような気がする)。はじめの一回は必ずinvokeされなくて、その後GUIの応答がなくなる(iTunes->Play()等は有効)のも、頓珍漢なアドレスを呼びに行って帰ってきていないような気がする。

とりあえずソースを張っておこう。ATLを使っていてstdafx.hの中で関連するヘッダをインクルードしている。何かわかる人教えてください。

#include "stdafx.h"
#include<windows.h>
#include <conio.h> 

#include<iostream>
#include <string> 

//iTunes
#undef GetFreeSpace
#import "c:\program files\itunes\itunes.exe" named_guids

//COM
CComModule _Module;

class CComInitializer {
	bool initialized_;

public:
	CComInitializer() : initialized_(false) { }
	HRESULT init() {
		HRESULT hr;
		hr = ::CoInitialize(NULL);
		if ( initialized_ = SUCCEEDED(hr) )
			_Module.Init(NULL, ::GetModuleHandle(NULL));
		return hr;
	}

	~CComInitializer() {
		if ( initialized_ ) {
			_Module.Term();
			::CoUninitialize();
		}
	}
};
/* com_assert : エラーチェックと例外送出 */
void com_assert(HRESULT result, const std::string& msg) {
	if ( FAILED(result) )
		throw std::runtime_error(msg);
}

#define SINKID_iTunesEvents 0

/* iTunesEvents : シンク(イベント受付窓口)クラス */
class ATL_NO_VTABLE iTunesEvents :
	public CComObjectRootEx<CComSingleThreadModel>,
	public IDispEventImpl<SINKID_iTunesEvents, iTunesEvents, 
	&iTunesLib::DIID__IiTunesEvents,&iTunesLib::LIBID_iTunesLib, 1, 7>
{
private:
	CComPtr<iTunesLib::IiTunes> m_piTunes;
public:
	iTunesEvents() {}

	HRESULT AdviseToiTunes( CComPtr<iTunesLib::IiTunes> piTunes)
	{
		m_piTunes = piTunes;
		// タイプ ライブラリへのポインタやバージョン情報の設定
		AtlGetObjectSourceInterface((IUnknown *)piTunes.p, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum) ;

		// イベントをDispatch
		HRESULT hr = this->DispEventAdvise((IUnknown *)piTunes.p);

		return hr ;
	}

	BEGIN_COM_MAP(iTunesEvents)
		COM_INTERFACE_ENTRY_IID(iTunesLib::DIID__IiTunesEvents, iTunesEvents)
	END_COM_MAP()

	BEGIN_SINK_MAP(iTunesEvents)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventDatabaseChanged,handle_OnDatabaseChangedEvent)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventPlayerPlay,handle_OnPlayerPlayEvent)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventPlayerStop,handle_OnPlayerStopEvent)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventPlayerPlayingTrackChanged,handle_OnPlayerPlayingTrackChangedEvent)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventUserInterfaceEnabled,handle_OnUserInterfaceEnabledEvent)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventCOMCallsDisabled,handle_OnCOMCallsDisabledEvent)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventCOMCallsEnabled,handle_OnCOMCallsEnabledEvent)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventQuitting,handle_OnQuittingEvent)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventAboutToPromptUserToQuit,handle_OnAboutToPromptUserToQuitEvent)
		SINK_ENTRY_EX(SINKID_iTunesEvents, iTunesLib::DIID__IiTunesEvents,iTunesLib::ITEventSoundVolumeChanged,handle_OnSoundVolumeChangedEvent)
	END_SINK_MAP()
	
	HRESULT _stdcall handle_OnDatabaseChangedEvent(VARIANT deletedObjectIDs,VARIANT changedObjectIDs){OnDatabaseChangedEvent(deletedObjectIDs,changedObjectIDs);return S_OK;}
	HRESULT _stdcall handle_OnPlayerPlayEvent(VARIANT iTrack){OnPlayerPlayEvent(iTrack);return S_OK;}
	HRESULT _stdcall handle_OnPlayerStopEvent(VARIANT iTrack){OnPlayerStopEvent(iTrack);return S_OK;}
	HRESULT _stdcall handle_OnPlayerPlayingTrackChangedEvent(VARIANT iTrack){OnPlayerPlayingTrackChangedEvent(iTrack);return S_OK;}
	HRESULT _stdcall handle_OnUserInterfaceEnabledEvent(){OnUserInterfaceEnabledEvent();return S_OK;}
	HRESULT _stdcall handle_OnCOMCallsDisabledEvent (iTunesLib::ITCOMDisabledReason reason){OnCOMCallsDisabledEvent(reason);return S_OK;}
	HRESULT _stdcall handle_OnCOMCallsEnabledEvent(){OnCOMCallsEnabledEvent();return S_OK;}	
	HRESULT _stdcall handle_OnQuittingEvent(){OnQuittingEvent();return S_OK;}	
	HRESULT _stdcall handle_OnAboutToPromptUserToQuitEvent(){OnAboutToPromptUserToQuitEvent();return S_OK;}	
	HRESULT _stdcall handle_OnSoundVolumeChangedEvent(long newVolume){OnSoundVolumeChangedEvent(newVolume);return S_OK;}
	
	void OnDatabaseChangedEvent(VARIANT deletedObjectIDs,VARIANT changedObjectIDs){
		std::cout<<"DatabaseChanged is fired.\n";
		std::cout.flush();
	};
	void OnPlayerPlayEvent(VARIANT iTrack) {
		std::cout<<"PlayerPlay is fired.\n";
		std::cout.flush();
	}
	void OnPlayerStopEvent(VARIANT iTrack) {
		std::cout<<"PlayerStop is fired.\n";
		std::cout.flush();
	}
	virtual void OnPlayerPlayingTrackChangedEvent (VARIANT iTrack){
		std::cout<<"PlayerPlayingTrackChange is fired.\n";
		std::cout.flush();
	};	
	virtual void OnUserInterfaceEnabledEvent(){
		std::cout<<"UserInterfaceEnabled is fired.\n";
		std::cout.flush();
	};
	virtual void OnCOMCallsDisabledEvent (iTunesLib::ITCOMDisabledReason reason){
		std::cout<<"ComCallsDisabled is fired.\n";
		std::cout.flush();
	};
	virtual void OnCOMCallsEnabledEvent(){
		std::cout<<"ComCallsEnabled is fired.\n";
		std::cout.flush();
	};
	virtual void OnQuittingEvent(){
		std::cout<<"Quitting is fired.\n";
		std::cout.flush();
	};
	virtual void OnAboutToPromptUserToQuitEvent(){
		std::cout<<"AboutToPromptUserToQuit is fired.\n";
		std::cout.flush();
	};
	virtual void OnSoundVolumeChangedEvent(long newVolume){
		std::cout<<"SoundVolumeChanged is fired.\n";
		std::cout.flush();
	};

 };

int main()
{
	try {
		HRESULT hr;
		CComInitializer com;
		hr = com.init();
		com_assert(hr, "CoInitialize failed");
		// iTunesオブジェクトの生成
		CComPtr<iTunesLib::IiTunes> iTunes; 
		hr = iTunes.CoCreateInstance(iTunesLib::CLSID_iTunesApp);
		com_assert(hr, "Creation of iTunesAppClass failed");
		// イベントハンドラの生成
		CComObject<iTunesEvents> * sink;
		CComObject<iTunesEvents>::CreateInstance(&sink);
		// 接続
		hr = sink->AdviseToiTunes(iTunes);
		com_assert(hr, "AdviseToiTunes failed");
		while(1){
			//入力を待って各種処理
			std::cout << "x:quit current iTunes, q:exit this program, spacebar: play/pause, b:back track, n:next track, m:toggle visibility of browser window.\n";
			char inputchar=_getch();
			if(inputchar=='x'){
					iTunes->Quit();
			}else if(inputchar=='q'){
				break;
			}else if(inputchar==' '){
				iTunes->PlayPause();
			}else if(inputchar=='b'){
				iTunes->BackTrack();
			}else if(inputchar=='n'){
					iTunes->NextTrack();
			}else if(inputchar=='m'){
				if(iTunes->BrowserWindow->Minimized==VARIANT_TRUE){
					iTunes->BrowserWindow->Minimized=VARIANT_FALSE;
				}else{
					iTunes->BrowserWindow->Minimized=VARIANT_TRUE;
				}
			}
		}
		// 解放
		hr = sink->DispEventUnadvise(iTunes);
		iTunes.Release();
		com_assert(hr, "DispEventUnadvise failed");
	} catch ( std::exception& ex ) {
		std::cout << ex.what() << std::endl;
		return -1;
	}
	return 0;
}


スポンサーサイト
コメント
この記事へのコメント
neploxo tak, i`m glad,
2008/07/19(土) 20:19:05 |name|URL | #-[ 編集]
neploxo tak, i`m glad,
介護福祉の情報掲示板
2008/08/06(水) 09:58:06 |石井 清|URL | #-[ 編集]
介護福祉の情報掲示板. 介護福祉に関して日頃感じていることや疑問、情報提供などお気軽にカキコキして下さい。 http://www2.rocketbbs.com/200/akanekai.html
東京都内公共職業訓練
2008/08/11(月) 08:58:53 |山田 宏|URL | #-[ 編集]
雇用・能力開発機構が実施する訓練と東京都が実施する訓練があります。 http://www.hat.hi-ho.ne.jp/heart_thoughts/t/tokyo.htm
Nice day, <a href="http://my.passion.ru/bustik/blog/">癰髓窶譛鱚?/a>, [url="http://my.passion.ru/bustik/blog/"]癰髓窶譛鱚
2008/11/16(日) 21:58:47 |Kvkhfyjd|URL | #-[ 編集]
Nice day, <a href="http://my.passion.ru/bustik/blog/">癰髓窶譛鱚?/a>, [url="http://my.passion.ru/bustik/blog/"]癰髓窶譛鱚?/url], http://my.passion.ru/bustik/blog/ 癰髓窶譛鱚? =-OO,
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
博士とヌレちゃんは、「なぜ、右乳首なのか!!」という講演会を見に行っている為、今日はお休みです。なんなのその講演会・・・・私もある意味、見てみたいかも(笑)
2006/05/31(水) 06:28:11 | ZUPPORI
(C)Copyright 2003-2007 by Ruke All rights reserved. Powered By FC2. VALID HTML? VALID CSS?
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。