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 P... Windows Media P... >>