Calling VB DLL from ruby code

I am facing a problem while calling a VB DLL (for which I do not have a
source code, just know the function signatures which DLL exposes) from a
ruby code.
DLL Function signature is as follows:

Public Declare Function GetContentsStream Lib
"C:\VisualCsource\SLStrucStorageContents\Debug\SSGetContents.dll" _
'(arg1 As Byte, _
' ByVal lElements As Long, _
' ByVal sStreamName As String) As Long
Following is the explanation given by DLL author regarding argument
types & how that DLL should be called:

   lLen = GetContentsStream(arrayObj(0), UBound(arrayObj), sStreamName)

Parameter1: arrayObj is an array of Bytes. We pass the the first
element of the
array by Reference, arrayObj (0), which really means we are passing the
address of the
start of the array.
Parameter2: Ubound (arrayObj) is the length of the array.
Parameter3: Stream name of type string.

I have written following code to call this dll:

require ‘Win32API’
getdllfun = Win32API.new('C:\WINDOWS\system32\SSGetContents.dll',
“GetContentsStream", ['P','L','P'], 'L')
sStreamName = "CONTENTS"
arrayObj=New Array
## arrayObj stores some binary bitmap data
val=getdllfun.Call
(GetContentsStream.Call, arrObj.pack(“C*”),arrObj.size,sStreamName)
puts "\n value: " + val.to_s

When I execute this code, I get following error while executing function
getdllgun.Call:

storeLOBData.rb:211: in `fgetContentsStream': uninitialized constant
GetContentsS
tream (NameError)

May be there is a problem with argument types which I am specifying
i.e. ['P','L','P'] & argument which I am passing to DLL.
Any help regarding mapping VB parameter types to Ruby would be really
appreciated.

Thanks and Regards,
Medha.

···

--
Posted via http://www.ruby-forum.com/.

I am facing a problem while calling a VB DLL (for which I do not have a
source code, just know the function signatures which DLL exposes) from a
ruby code.
DLL Function signature is as follows:

Public Declare Function GetContentsStream Lib
"C:\VisualCsource\SLStrucStorageContents\Debug\SSGetContents.dll" _
'(arg1 As Byte, _
' ByVal lElements As Long, _
' ByVal sStreamName As String) As Long
Following is the explanation given by DLL author regarding argument
types & how that DLL should be called:

   lLen = GetContentsStream(arrayObj(0), UBound(arrayObj), sStreamName)

Parameter1: arrayObj is an array of Bytes. We pass the the first
element of the
array by Reference, arrayObj (0), which really means we are passing the
address of the
start of the array.
Parameter2: Ubound (arrayObj) is the length of the array.
Parameter3: Stream name of type string.

I have written following code to call this dll:

require 'Win32API'
getdllfun = Win32API.new('C:\WINDOWS\system32\SSGetContents.dll',
"GetContentsStream", ['P','L','P'], 'L')
sStreamName = "CONTENTS"
arrayObj=New Array
## arrayObj stores some binary bitmap data
val=getdllfun.Call
(GetContentsStream.Call, arrObj.pack("C*"),arrObj.size,sStreamName)
puts "\n value: " + val.to_s

When I execute this code, I get following error while executing function
getdllgun.Call:

storeLOBData.rb:211: in `fgetContentsStream': uninitialized constant
GetContentsS
tream (NameError)

May be there is a problem with argument types which I am specifying
i.e. ['P','L','P'] & argument which I am passing to DLL.
Any help regarding mapping VB parameter types to Ruby would be really
appreciated.

Thanks and Regards,
Medha.

[disclaimer] I am not an expert on the Win32 API [/disclaimer]

Your problem does not look like an argument problem. It is ruby
telling you that the constant 'GetContentsStream' does not exist. I
wonder what it is doing there. Perhaps you meant:

val = getdllfun.Call(arrObj.pack("C*"),arrObj.size,sStreamName)

Reading error messages can help you. Don't jump to conclusions.

···

On 9/5/06, Medha Kulkarni <medha_19@yahoo.com> wrote:

--
Posted via http://www.ruby-forum.com/\.