Antiec Posted August 31, 2007 Posted August 31, 2007 Hi! I'm trying to use DLL to convert an image from a DICOM file into memory and then to grab it and show it with autoit. I'm passing the DLL a pointer and saving the image into it. I think I've been able to do everything else, but I don't know how to read the data from the pointer. I always only get the address where the pointer is pointing to. I have made the DLL myself, so it's possible to change its methods if you have any suggestions. I've tried to search the forums for it (and I think those stub-things do something like I want to) but I haven't been able to get anything worth of it. In other words, I'd like to know how I can get data from the pointer address (like *data in C++). Here's the code in autoit: CODE#include <A3LMemory.au3> $a = DllStructCreate("int size") <------------------- My DLL returns the amount of the data in bytes. $c = _MEM_GlobalAlloc( 2000000, $GMEM_FIXED ) <------------------- Allocating an overkill amount of memory DllCall( "proo.dll", "int:cdecl", "fnProo", "ptr", $c, "ptr", DllStructGetPtr($a, "size"), "str", "testi.dcm", "str", "humppa.bmp", "int", 1, "int", 0 ) /***** I really ain't sure if these work but I just use it to point to you what I want to do. I'd use something like: *******/ $data = GetDataFromPointer( $c, DllStructGetData($a, "size") ) <------------ This is would be a bit like what I want to do. I like to read "size" bytes from the pointer $c $BitToHBit = _GDIP_BitmapCreateHBITMAPFromBitmap($data) $hBitmap = _GDIP_BitmapCreateFromHBITMAP($BitToHBit) ************/ _Mem_GlobalFree( $c ) So do you have any ideas how to get the actual data from the $C? Thanks, Lassi
Zedna Posted August 31, 2007 Posted August 31, 2007 I'm not sure but if your DLL returns bitmap maybe try something like this: #include <A3LMemory.au3> $a = DllStructCreate("int size") $c = _MEM_GlobalAlloc( 2000000, $GMEM_FIXED ) DllCall( "proo.dll", "int:cdecl", "fnProo", "ptr", $c, "ptr", DllStructGetPtr($a, "size"), "str", "testi.dcm", "str", "humppa.bmp", "int", 1, "int", 0 ) $BitToHBit = _GDIP_BitmapCreateHBITMAPFromBitmap($c) ; use directly $c - pointer to memory with your bitmap $hBitmap = _GDIP_BitmapCreateFromHBITMAP($BitToHBit) _Mem_GlobalFree( $c ) Resources UDF ResourcesEx UDF AutoIt Forum Search
Antiec Posted September 5, 2007 Author Posted September 5, 2007 Thx for the fast reply! I haven't had time to check this before so I'm sorry that responding took so long... Now I'm sure that my DLL works and I can write a .bmp file with it. The DLL should return a bitmap, because I can write and show it with _GDIP_BitmapCreateFromFile() and the following code: CODE $a = DllStructCreate("int size") <------------------- My DLL returns the amount of the data in bytes. $c = _MEM_GlobalAlloc( 2000000, $GMEM_FIXED ) <------------------- Allocating an overkill amount of memory DllCall( "proo.dll", "int:cdecl", "fnProo", "ptr", $c, "ptr", DllStructGetPtr($a, "size"), "str", $name, "str", "humppa.bmp", "int", $plap, "int", $plop ) $humppa = DllStructCreate( "char[" & DllStructGetData($a, "size") & "]", $c ) $ham = FileOpen( "test.bmp", 17 ) $i = 0 while ($i <= DllStructGetData($a, "size")) $i = $i + 1 FileWrite( $ham, DllStructGetData($humppa, 1, $i) ) WEnd FileClose($ham) Though I need to use ANSI-version of Autoit (with unicode it just doesn't show properly, but you can still view it). Neither _GDIP_BitmapCreateHBITMAPFromBitmap($c) or _GDIP_BitmapCreateFromHBITMAP($c) worked. Is there any way to "cast" from $humppa to string or to something which isn't an array? I'll try to make it working myself, but I'd really appreciate any help from you guys <3.
Antiec Posted September 6, 2007 Author Posted September 6, 2007 Hi once again! Haven't made almost any progress. Though I can read $humppa to a string with the same loop as with filewrite. But does anyone have any idea why none of the gdip-functions can use that string? What about any idea about how to convert that string to a proper format? It's starting to look like I have to make that HBitmap object in the DLL and return a handle to it. Though I'd prefer to do it in the autoit... Thanks!
Antiec Posted September 17, 2007 Author Posted September 17, 2007 Still haven't been able to do it... But I realized (or so I think) that it should be a bit same as using a string read from a file: #include <A3LGDIPlus.au3> $str = FileRead( "test.bmp" ) $BitToHBit = _GDIP_BitmapCreateHBITMAPFromBitmap( $str ) $hBitmap = _GDIP_BitmapCreateFromHBITMAP( $BitToHBit ) ... But this doesn't work either. Does anyone have any idea how to make it work with a string? This way I could read it from a pointer to a string and it would work /
Zedna Posted September 17, 2007 Posted September 17, 2007 Still haven't been able to do it... But I realized (or so I think) that it should be a bit same as using a string read from a file: #include <A3LGDIPlus.au3> $str = FileRead( "test.bmp" ) $BitToHBit = _GDIP_BitmapCreateHBITMAPFromBitmap( $str ) $hBitmap = _GDIP_BitmapCreateFromHBITMAP( $BitToHBit ) ... But this doesn't work either. Does anyone have any idea how to make it work with a string? This way I could read it from a pointer to a string and it would work / At least you must open file in binary mode I think. Look at FileOpen. Resources UDF ResourcesEx UDF AutoIt Forum Search
Antiec Posted September 17, 2007 Author Posted September 17, 2007 At least you must open file in binary mode I think.Look at FileOpen.Yeah, forgot about that one, but reading it with mode 16 didn't help. Maybe I'll just have to convert my script to c++ (which isn't nice considering about developing it etc. And I'm a noob with C). Or maybe I'll just forget about that thumbnail-thing. Though it would be great to find some way to make it work.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now