<   2005年 11月 ( 9 )   > この月の画像一覧

e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Windows Media Player SDK の DSPプラグイン

ただいま、DSPプラグインを開発中です。

DSPとは、Digital Signal Processor の略。
メディアファイルから読み込んで、表示用にフォーマットしたフレーム画像(とか音声とか)のデータを、表示直前に受け取って、加工するための機能をプラグインすることができます。

といっても、画面にXライン、Yラインを表示するだけの非常に簡単なもの。
Windows Media Player SDKにVC++ .NET用のテンプレートが付いてくるので、非常に簡単に実装できました。

でも、問題があります。

なぜか、MPEG2ファイルを再生するときには、プラグインが実行されないようなのです。
プラグインの読み込みさえされない様子です。。。 (;_;)
AVIでもWMVでもMPEG1でもその他のフォーマットであれば、動くのですが、、、

これができたら、再生中のDVDの各フレームが捕れてしまうから、『だめよ』 という事なのだろうか?

これができなきゃ、ダメなのにぃ~~! (><)
[PR]
by isoq | 2005-11-30 17:04 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Windows Media Player SDK で プレーヤをフルスクリーン表示できない問題が解決!

思い起こせば、昨日の午後。
長々と悩んでいた問題が、フルスクリーンにならない!ということ。

m_spWMPPlayer->put_fullScreen(true);

で、できると思っていたけど、どうやら、
m_spWMPPlayer->put_fullScreen(VARIANT_TRUE);

にしないとだめみたい。。。

なんでやねん!

定義を見てみると、VARIANT_TRUE は、 short 型の -1 と。
typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)

はたまた、TRUE は、1 と定義されている。
#define FALSE 0
#define TRUE 1
#define NULL 0

true は、VCの場合、組み込み型だから明示的に定義されてはいないみたいだけど、トレースしてみると、1バイトの 1 らしい。
true = 1
sizeof(true) = 1


このように、普通 論理値 True というのは、1 だったり -1 だったり、実装によってまちまちなのは事実です。
だから、True は、0 以外の数値と考える事が常識です。
0以外の数値、たとえば、2 でも 3 でも -999 でも、0以外ならばそれは 『ある』 ということで True と解釈するのです。

そう考えると、普通だったら、VARIANT_TRUE でも TRUE でも ture でも、どれを使ってもOKのはずだけど、次のようなコードを書いていたりするとその互換性が崩れてしまいます。
if(bInput == VARIANT_TRUE) ...

これは、こんな風に書くべき。
if(bInput) ... // または、
if(bInput != VARIANT_FALSE) ...

値を TRUE と比較するな! というのは、常識のはずだけど、、、
論理値を評価するときは、必ず、FALSE と比較する。
ほとんどの実装では、FALSE は 0 と決まっているからです。

if(bValue == FALSE)... // フォールスの時
if(bValue != FALSE)... // トゥルーの時
if(bValue)... // トゥルーの時


でも、WMP コントロールのすべてのBOOL値をとる関数は、-1 の True しか受け付けないようです。
VB や COM の世界では、入力を True と比較する事は常識なのかもしれません (^^;)

-追記-
MFCのCOMラッパは、その辺を自動的に変換してくれていたみたいです。
なので、BOOL を渡すと、VARIANT_BOOL に自動的に変換してくれていたので、COMラッパの場合は動いていたんですね~!
疑問が解決しました。
[PR]
by isoq | 2005-11-30 10:12 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Windows Media Player SDK を勉強中

Windows Media Player SDK とは、Windows Media Player をプログラムの中に埋め込むためのSDK(Software Development Kit)です。

埋め込み自体も何とかできて、ビデオに図形や文字を上書き表示する方法(DSP プラグイン)も見つけました。
でも、とっても簡単な事でつまずいています。

それは、フルスクリーン表示する事。

m_spWMPPlayer->put_fullScreen(true);


これをコールするだけで、フルスクリーンになるはずなのです。。。が、、、、
何度呼べど、なりません。

Windows Media Player SDK を使う前に、 単純なMFCのCOMラッパを使っていたのですが、そのときは、嫌というほど最大化してくれたのに、、、(;_;)

なんでやねん!!

もう、WMPが嫌になってきました。
[PR]
by isoq | 2005-11-29 18:21 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

_com_util::ConvertStringToBSTR() のリンクエラー

#include <comutil.h>
#pragma comment(lib, "comsupp.lib")

を.cppファイルの先頭に入れているのに、
wchar_t * __stdcall _com_util::ConvertStringToBSTR(char const *)

がリンクエラーになってしまうのはなぜ!?

UNICODEでビルドしたらうまくいくのに~、、、

しょうがないので、VC.NET 2003のフォルダから、comsupp.lib を探してみると、なんと、4種類のcomsuppを発見しました。

comsupp.lib
comsuppd.lib
comsuppw.lib
comsuppwd.lib


どうやら、リリース版、デバッグ版のそれぞれに、ANSI文字列版とUNICODE版があったみたいです。

#include <comutil.h>
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "comsuppw.lib")


とする事で、リンクに成功しました~ (^^) ホッ

こういう不可解なリンクエラーって本当に困るんですよね~
焦っているときなんかは、焦りをイライラに変える起爆剤になったりして。。。

-追記&修正-

ちなみに、この関数と、逆の仕事をする関数
char* BSTR __stdcall ConvertStringToBSTR(const char* pSrc)
char* __stdcall ConvertBSTRToString(BSTR pSrc)

は、内部で戻り値のためのメモリを割り当てるので、受け取ったcharポインタは、自力で削除する必要があります。
BSTR は、 SysFreeString() にて、 char* は、 delete [] にて削除する必要があります。

削除することで、原因不明のメモリーリークが治りました (^^;)
[PR]
by isoq | 2005-11-28 13:28 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

身近な秋

更新さぼり気味だったので、身近な秋の写真を撮ってみました。
コクワも冬眠に入ってしまったようで、マットに潜って出てこなくなってしまいました。
携帯のカメラなので、あまりきれいに撮れないですね、、、
ちょっとだけPhotoshopで調整しました(^^;)
a0002261_1014726.jpg

a0002261_10135057.jpg

a0002261_10144297.jpg

[PR]
by isoq | 2005-11-28 10:17 | 日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

コクワ

a0002261_21142851.jpg

コクワにダニがついたので、外で飼っていますが、今日、こんな姿を発見しました(^^)

これはアレでしょうか?
餌を交換したかったので、替えたら、雌はそそくさとマットに潜っていきました。

残された雄はなんだか寂しそう。

おじゃましてごめんねぇ~(^_^;)

もう11月で、肌寒くなってきましたが、まだ冬眠しないで活動しているみたいです。
[PR]
by isoq | 2005-11-05 21:14 | 携帯からの投稿
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

隔離中

a0002261_1738070.jpg

白いりゅうきんを隔離治療中です。

尻尾の先に水カビ病ができてしまいました。

虫かごにグリーンF溶液を入れています。

メチレンブルー(主成分)で水が青くなっています。
[PR]
by isoq | 2005-11-05 17:38 | 携帯からの投稿
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

ダイアログボックスの背景色を取得するには

ダイアログボックスに何か書き込もうと思ったけど、背景色がわからなくて(というか環境によって変わってしまって)なんだか醜くなってしまう事がある。

ダイアログの背景色は、システムの設定に依るので、システムに問い合わせて、現在の背景色を取得する必要がある。

次の関数で、背景色を取得できる。
DWORD bkColor = GetSysColor(COLOR_3DFACE);


これは、RGB()マクロが作るのと同じ32ビットカラー値なので、COLORREFで色を指定しないといけないところならどこにでも指定する事ができる。
[PR]
by isoq | 2005-11-02 13:57 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

AVGが自動アップデートできない!?

ここ数日、AVG(アンチウィルス)の調子がおかしかった。

自動アップデートを試みると、すぐに
「Update was unsuccessful」(アップデートは失敗しました)
というメッセージが表示される。
アップデートボタンをクリック直後に表示されるので、ネットワーク接続とか何もしないでメッセージを表示しているみたい。

AVG Test Centerを起動すると、
「アップデートしたから再起動しろ」というようなメッセージが表示される。
何度再起動しても、AVG Test Centerを起動すると同じメッセージが表示される。

だめだ~と思って、一度再インストールしてみたけど、やっぱりだめ。
何か、壊れたファイルなどが残っているのだろうか。。。

そこで、次の手順でアンインストール・再インストールを行ってみると、うまくいった。

1.AVG Anti Virusをアンインストール
 処理中のダイアログで次のチェックボックスを両方ともチェック。
  ・Remove user settings(ユーザー設定も削除)
  ・Including objects in Virus Vault(隔離中のオブジェクトも削除)

2.再起動(これ重要)

3.レジストリの削除はしなくて良いみたい。
 もしあれば以下を削除します。(2.の再起動できれいに無くなった)
  HKEY_CURRENT_USER\Software\Grisoft
  HKEY_LOCAL_MACHINE\SOFTWARE\Grisoft
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Avg7*

4.フォルダを削除
 アンインストーラで削除されないファイルがあると、以下のフォルダが残ります。
 消してしまいましょう。
  C:\Documents and Settings\All Users\Application Data\Avg7
  C:\Program Files\Grisoft
 もしあれば、
  c:\AVG*** というファイルを削除すること。

5.AVG Anti Virusを再インストール
 治った~ばんざ~い!

原因は、不明ですが、特別にやったことというと「4.フォルダを削除」の部分だけです。
なにか、壊れたファイルが残っていたのだろうと思います。

不安だったので、avast!4 をインストールして、現在 アンチウィルスソフトを2本立てで使っています。

入出力メールなども両方のメールスキャナでスキャンされてから、popfile で仕分けされるので、安心も2倍!
かかる時間も2倍近いかも。。。

使い勝手や、見た目は avast! の方が優れていますね。
標準で日本語にも対応しているし。

[PR]
by isoq | 2005-11-02 12:00 | コンピュータ
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇