Re: calling a method in a dll that returns a pointer

"Mcnamara, Sean D." <[email protected]> Wed, 3 Jan 2007 15:37:11 -0500
Newsgroups gmane.comp.windows.devel.jawin
Message-ID <57F935D6BB6B2543AF5D835DCE7CAF270396456C@MD61EX100.ad.honeywell-tsi.com>
If your "unsigned char*" is pointing to a single character, this might
be possible. My intuition, based on the function name you specified,
suggests that this is an array of raw 1-byte little-endian data of an
image. There are documented ways to deal with VT_ARRAYs (SafeArrays in
COM) with Jawin, because SafeArrays have a dope vector which specifies
the length of the array. Looking at the native source of Jawin, it seems
like it is not well suited to returning native arrays at all, because
AFAIK a character pointer does not imply any kind of length of an array
in any language. COM gets away with returning arrays without a length
because SafeArrays specify the length in the binary format of the array,
very much like a Java array does (so much so that the native code
streams one type into another without changing the format of it.)

I am rather surprised that your GetImageBuffer method doesn't have an
out parameter specifying the length of the returned buffer. I would be
really surprised if the method returned a single character, in which
case it's more sane to get the result, but otherwise it seems that the
compiler you're using should somehow include a dope vector with arrays.
When marshalling back the data, the first thing Jawin would need to know
(even if this were supported) is the length of the array to allocate.
You might need to manually specify this in the instruction string.

What compiler and version is the DLL compiled with? (hint: use
Dependency Walker and look at the DLL's dependencies on e.g.
msvcrt*.dll, libc6.dll, etc. for a clue if you have a closed source
DLL.)

Also: I'm not sure what your level of proficiency is with Jawin yet, so
if you haven't already, read *everything* on
http://jawinproject.sourceforge.net/jawinuserguide_dll.html and
http://jawinproject.sourceforge.net/instruction_docs.html

The minimum you should be able to code is the generic invoke/bytestream
process, including everything but the instruction string (which I'm not
too sure of myself right now.) All of that is boilerplate code.

You may want to try a very basic instruction string and examine the
byte[] contents of the invoke method. If you get a single 32-bit value
(the pointer to the array that the method returns) and nothing else, you
then obviously have to find out how to coerce Jawin to perform
"indirection" on this pointer to get to the first element of the array.
Of course, without knowing where the array ends, you could keep scanning
the rest of your process's virtual address space as part of the array
until you get a page fault. :) If this native method was written without
any way to get the length of the returned buffer, you wouldn't be able
to use it in either C or Java.

-Sean

-----Original Message-----
From: Discussion of Java/Win32/COM integration with Jawin
[mailto:[email protected]] On Behalf Of Ravi Kiran
Sent: Wednesday, January 03, 2007 3:42 AM
To: [email protected]
Subject: [JAWIN] calling a method in a dll that returns a pointer

hi,this is ravikiran,

i am using jawin to call thirdparty dlls.

in my dll there is a method with the following signature

unsigned char* SF_GetImageBuffer()

i have no idea how to make a call to the above method, so that i can get
the content of the pointer that the method is returning.

can any one help me how to do this in jawin. i am new to jawin and i
didnt find any examples that suite my requiements.

please help me.

thanks in advance.