Ruby 1.9.0 problem with DL.dlopen


#1

Hi,

The following code runs with ruby 1.8.6 (2007-09-24 patchlevel 111)
[i386-mswin32] on Windows :

require ‘dl’
user32 = DL.dlopen(‘user32’)
msgbox = user32[‘MessageBoxA’, ‘ILSSI’]
msgbox.call(0, “Hello”, “Message Box”, 0)

A message box is displayed with just the OK button.

If I run the same code with ruby 1.9.0 (2007-12-25 revision 14709)
[i386-mswin32], the following error is output :

win_msgbox.rb:3:in []': wrong number of arguments(2 for 1) (ArgumentError) from win_msgbox.rb:3:in

If I just remove the ‘ILSSI’ argument, this does not work either.

Thanks for any help.

Chauk-Mean.


#2

In case it would be useful for someone else, I received the following
answer from the development team :


Date: 18/01/2008 07:47
Expéditeur: Usaku Nakamura

Not a bug.
Date: 18/01/2008 07:47
Expéditeur: Usaku Nakamura

1.9’s dl is not compatible with 1.8’s.
The following code may help you:

require ‘dl’
user32 = DL.dlopen(‘user32’)
msgbox = DL::CFunc.new(user32[‘MessageBoxA’], DL::TYPE_LONG,
‘MessageBox’)
msgbox.call([0, “Hello”, “Message Box”,
0].pack(‘L!ppL!’).unpack(‘L!*’))

Chauk-Mean.


#3

and , how to call GetPixel :

http://msdn.microsoft.com/en-us/library/windows/desktop/dd144909

COLORREF GetPixel(
In HDC hdc,
In int nXPos,
In int nYPos
);

how to call GetPixel , use dlopen ?


#4

$a = DL.dlopen(‘gdi32’)

def GetPixel hwnd,x,y
getp = $a[‘GetPixel’ ]
getp.call(hwnd,x,y)
end

def SetPixel hwnd,x,y
setp = $a[‘SetPixel’ ]
setp.call(hwnd,x,y)
end

p GetPixel 0,1,1

exit

err: NoMethodError: undefined method `call’ for 1997915093:Fixnum


#5

Kk Kk wrote in post #1122159:

$a = DL.dlopen(‘gdi32’)

def GetPixel hwnd,x,y
getp = $a[‘GetPixel’ ]
getp.call(hwnd,x,y)
end

def SetPixel hwnd,x,y
setp = $a[‘SetPixel’ ]
setp.call(hwnd,x,y)
end

p GetPixel 0,1,1

exit

err: NoMethodError: undefined method `call’ for 1997915093:Fixnum

You can call GetPixel like this:

require ‘dl/func’
$gdi32 = DL.dlopen(‘gdi32’)

def GetPixel hwnd,x,y
getpixel = DL::Function.new(DL::CFunc.new($gdi32[‘GetPixel’],
DL::TYPE_LONG,‘GetPixcel’),[DL::TYPE_LONG,DL::TYPE_INT,DL::TYPE_INT])
getpixel.call(hwnd,x,y)
end

p GetPixel 0,1,1

Regards,
Park H.