From: Norman Makoto Su Date: 2002-04-05T15:01:52+09:00 Subject: [ruby-list:34824] Re: win32api getdibits (long) ノーマンです。お返事、有難うございました。 > これだとlpvpxldataはStringではなくてIntegerになると思います。も そうですね。実はintegerになったら、GlobalLockはGlobalAllocと同じ値を戻します。す みません、それは間違えでした。 > しGetDIBits()がGlobalAlloc()を使わなくてもよいなら、こうすれば > できそうな気がします。 > > lpvpxldata = "\0" * (screenWidth * screenHeight * 3) それはいいアイデアだと思いますが、以上のようにしてみて、GetDIBitsの機能を呼んで から、lpvpxldataは変わりません(まだ、全ては0.chr)。気を付いたのがGetDIBitsの戻り 値は0です。GetDIBitsが失敗したという意味です。もしかしたら、bmInfoは間違えたか なぁ: Win32のAPIを読んだら, typedef struct tagBITMAPINFOHEADER{ DWORD biSize; 0:4 LONG biWidth; 4:4 LONG biHeight; 8:4 WORD biPlanes; 12:2 WORD biBitCount; 14:2 DWORD biCompression; 16:4 DWORD biSizeImage; 20:4 LONG biXPelsPerMeter; 24:4 LONG biYPelsPerMeter; 28:4 DWORD biClrUsed; 32:4 DWORD biClrImportant; 36:4 = 40 bytes } BITMAPINFOHEADER, *PBITMAPINFOHEADER そこで、Rubyで bmInfo = [40, screenWidth, screenHeight, 1, 24, 0, 0, 0, 0, 0, 0].pack('LLLIILLLLLL') は正しいと思いますか? また、lpvpxldataはIntegerにしても、MoveMemory等でGlobalAllocに取れたメモリにある データを読み込むことができるのでしょうか?例えば、 require 'Win32API' GlobalAlloc = Win32API.new('kernel32', 'GlobalAlloc', ['L', 'L'], 'L') MoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', ['P', 'I', 'I'], 'V') CopyMemory = Win32API.new('kernel32', 'RtlMoveMemory', ['I', 'P', 'I'], 'V') str = ["hello world"].pack('P') len = str.length hpxldata = GlobalAlloc.call(0, len) CopyMemory.call(hpxldata, str, len) test = 0.chr * len MoveMemory.call(test, hpxldata, len) p test.unpack('p156') でも、私のコードでGlobalAllocを使っても、全ては0.chrのままです。ああ、どうすれば いいのか分かりません。 -- ノーマン