メモリの開放についてです。(ハンドルを取得後開放できなくなってしまいました)


かんぷら  2004-06-25 10:15:03  No: 114299  IP: [192.*.*.*]

VB.NETです。
表示しているビットマップを
退避するためにBITBLTを使用しています。
退避後に開放ができなくて困っております。
教えていただければ幸いです。m(__)m

'API宣言(BITBLT)
    Public Const SRCCOPY = &HCC0020     '描画元BMPをコピー
    Private Shared Function BitBlt(ByVal hdcDest As IntPtr, _
        ByVal nXDest As Integer, ByVal nYDest As Integer, _
        ByVal nWidth As Integer, ByVal nHeight As Integer, _
        ByVal hdcSrc As IntPtr, _
        ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
        ByVal dwRop As Integer) As Boolean
    End Function

        Dim img_imgg As Bitmap
        Dim gggg As Graphics
        Dim img_pct1_hdl As IntPtr
        Dim img_imgg2 As Bitmap
        Dim gggg2 As Graphics
        Dim img_pct1_hdl2 As IntPtr

        img_imgg = New Bitmap(1000, 1000)
        gggg = Graphics.FromImage(img_imgg)
        img_pct1_hdl = gggg.GetHdc

        img_imgg2 = New Bitmap(1000, 1000)
        gggg2 = Graphics.FromImage(img_imgg2)
        img_pct1_hdl2 = gggg2.GetHdc

        Call BitBlt(img_pct1_hdl, 0, 0, 1000, 1000, img_pct1_hdl2, 0, 0, SRCCOPY)

        img_imgg.Dispose()
        img_imgg2.Dispose()
        gggg.ReleaseHdc(img_pct1_hdl)
        gggg2.ReleaseHdc(img_pct1_hdl2)
        gggg = Nothing
        gggg2 = Nothing
        img_pct1_hdl = Nothing
        img_pct1_hdl2 = Nothing


とやっているのですが、どれをやってもタスクマネージャーで確認してみると
開放されている様子がありません。


ちなみに
        img_imgg = New Bitmap(1000, 1000)
        img_imgg.Dispose()

とやると開放されているようです。
どうぞよろしくお願いします。

編集    削除
特攻隊長まるるう  2004-06-25 18:01:51  No: 114300  IP: [192.*.*.*]

とりあえず
>'API宣言(BITBLT)
>    Public Const SRCCOPY = &HCC0020     '描画元BMPをコピー
>    Private Shared Function BitBlt(ByVal hdcDest As IntPtr, _
>        ByVal nXDest As Integer, ByVal nYDest As Integer, _
>        ByVal nWidth As Integer, ByVal nHeight As Integer, _
>        ByVal hdcSrc As IntPtr, _
>        ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
>        ByVal dwRop As Integer) As Boolean
>    End Function
は関数の宣言であってAPIの宣言はされてませんが
DllImport とかはちゃんと書いてあるんでしょうか?

編集    削除
かんぷら  2004-06-26 01:59:23  No: 114301  IP: [192.*.*.*]

特攻隊長まるるうさんありがとうございます。
>'API宣言(BITBLT)
>    Public Const SRCCOPY = &HCC0020     '描画元BMPをコピー
>    Private Shared Function BitBlt(ByVal hdcDest As IntPtr, _
>        ByVal nXDest As Integer, ByVal nYDest As Integer, _
>        ByVal nWidth As Integer, ByVal nHeight As Integer, _
>        ByVal hdcSrc As IntPtr, _
>        ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
>        ByVal dwRop As Integer) As Boolean
>    End Function
は関数でAPIの宣言ではありませんでした(^^;

DllImport は書いていません、DllImportを知りませんでした。
自分なりに今日  DllImport  を調べてみたのですが、
うまく動いてくれません。

よろしかったら、教えていただけないでしょうか?

編集    削除
特攻隊長まるるう  2004-06-28 20:04:43  No: 114302  IP: [192.*.*.*]

>DllImport は書いていません、DllImportを知りませんでした。
…という事は BitBlt 自体動いてなかったはずなのですが…そもそも
ハンドルが取れてないという事には気づかなかったんでしょうか?
戻り値の判定とかしなかったんですか?

…それはいいとして、何故か Shared 宣言はしてあるし、ハンドルも
IntPtr 型でちゃんと取ってある。Long → Integer も考えてある
…その知識はどこで手に入れたんですか?。どこかのサイトか参考書
なら、同じ場所に DllImport についても書いてあると思うんですが…。

>うまく動いてくれません。
ボクの環境ではうまく動くのでこんな事を書かれても何を答えれば
いいのか検討もつきません。エラーが出ているなら、少なくとも
エラーメッセージを書くべきですし、分からないにしても、もう少し
まとをしぼって質問して頂かないと答えられません。特に[.NET]は
色々な知識を必要としますし、説明も膨大な量になってしまいます。
少なくとも、ヘルプに載ってるくらいの内容は自分で理解していただ
かないとはじまりません。
どこを見ればいいのか分からない場合は、まず[DllImportAttribute クラス]
を参照して下さい。(ヘルプに載ってます。オンラインヘルプは↓)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemruntimeinteropservicesdllimportattributeclasstopic.asp

使用例の通り、<DllImport で始まる『属性』の指定を行って下さい。

とりあえず[VB6.0]の知識があるなら Declare 宣言も使えます。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200406/04060123.txt
…というか MSDN ライブラリ(2003年7月リリース)の解説には書いてある
んですが、
>Declare ステートメントが使用された場合にコンパイラによってこの属性が出力されます。
というのが[DllImportAttribute クラス]のようです。

編集    削除