ページ 11

HDCとDWord

Posted: 2005年12月13日(火) 12:33
by BingoMan
いつもお世話になります。

コード: 全て選択


Function BitBlt2(hDC As *HDC,Width As Long,Height As Long)As Long
	BitBlt(hDC[1],0,0,Width,Height,hDC[0],0,0,SRCCOPY)
EndFunction

Dim hMainDC[1] As HDC
Dim hMainBmp[1]As HBITMAP

'デバイスコンテキスト及びビットマップを作成(省略)

BitBlt2(hMainDC,100,100)

'デバイスコンテキスト及びビットマップを破棄(省略)
BitBlt2関数のhDCにはhMainDCの先頭ポインタ(*HDC)がはいるので、関数内のhDCはHDC型として扱われるはずなのに次のようなエラーが出てしまいました。
[警告] "BitBlt"の第6パラメータが、DWordからHDCに強制変換されています。
[警告] "BitBlt"の第1パラメータが、DWordからHDCに強制変換されています。
強制変換といわれてもHDCはDWordと同じではないのでしょうか?

警告の原因を教えてください。よろしくお願いします。

Re: HDCとDWord

Posted: 2005年12月13日(火) 12:46
by NoWest
> 強制変換といわれてもHDCはDWordと同じではないのでしょうか?
>
> 警告の原因を教えてください。よろしくお願いします。

ActiveBasicはポインタに対応しているとはいえ、
変数型すべてのポインタに対応しているわけではないんです。

TypeDefで作成された変数型はその基本となった変数型に変更されます。
また、基本の変数型も、整数型では符号無し整数型に統一されてしまいます。


例えば

TypeDef HOGE = Long

というような変数型を作成し

Dim ph As *HOGE
ph=malloc(SizeOf(HOGE)*2)

のようにメモリを確保して

ph[0]=100

のようにアクセスすると

ActiveBasicのコンパイラは

Dim ph As DWordPtr
ph=malloc((SizeOf(Long)*2)

ph[0]=100

と判断してしまいます。


バグではないんですが、こういう仕様になっているといった感じです。
※以前から問題にはなっていたが放置状態。


AB4.12で試しているなら関係ない話ですが、
私はAB4.12では直っているかどうか試したことが無いので
もしかしたら、直っているかも。。。