From: Brian May <bam@snoopy.apana.org.au>
Subject: Thick Ada bindings to C Win32
Date: Wed, 10 Nov 2004 13:41:57 +1100
Date: 2004-11-10T13:41:57+11:00 [thread overview]
Message-ID: <sa4y8haifwq.fsf@snoopy.apana.org.au> (raw)
Hello,
I have a program that uses Win32 serial I/O. Initially I found a set
of thick bindings to do this on the Internet, but I found a number of
limitations, and have been working to enhance it.
One issue that still remains though.
I have the following functions:
type Byte_Array is array (Positive range <>) of Byte;
procedure Get(Handle : in Handle_Type; Item : out Byte; Done : out Boolean);
procedure Put(Handle : Handle_Type; Item : in Byte_Array);
(hmmm... ideally the Get function should read in a Byte_Array, but
lets not confuse matters... My application only wants one byte at a
time anyway)
However, the equivalent Win32 functions require a Win32.Lpcvoid (null
terminator not required). How do I convert to/from the required types?
At the moment, my somewhat not-elegant code, found via
trial-and-error, is:
function Convert_Char_Ptr_To_Lpvoid is new
Ada.Unchecked_Conversion
(Source => Char_Ptr,
Target => Win32.Lpvoid);
function Convert_Byte_Array_Ptr_To_Char_Array_Ptr is new
Ada.Unchecked_Conversion
(Source => Byte_Array_Access,
Target => Interfaces.C.Strings.Char_Array_Access);
function Convert_Chars_Ptr_To_Lpcvoid is new
Ada.Unchecked_Conversion
(Source => Interfaces.C.Strings.Chars_Ptr,
Target => Win32.Lpcvoid);
procedure Get(Handle : in Handle_Type; Item : out Byte; Done : out Boolean) is
...
char_item : character;
Bool_Result : Win32.Bool;
NumberOfBytesRead : aliased Win32.dword;
Char_Buffer : aliased Interfaces.C.Char;
...
begin
...
Result := Win32.Winbase.ReadFile( ...
lpBuffer => Convert_Char_Ptr_To_Lpvoid(Char_Buffer'Unchecked_Access), nNumberOfBytesToRead => Win32.Dword(1),
....);
...
char_item := Interfaces.C.To_Ada(Char_Buffer);
Item := char_to_byte(char_item);
...
end Get;
procedure Put(Handle : Handle_Type; Item : in Byte_Array) is
...
Buffer : aliased Byte_Array := Item;
A : Interfaces.C.Strings.Char_Array_Access
:= Convert_Byte_Array_Ptr_To_Char_Array_Ptr(Buffer'Unchecked_Access);
B : Interfaces.C.Strings.Chars_Ptr
:= Interfaces.C.Strings.To_Chars_Ptr(A,False);
Buffer_Ptr : Win32.Lpcvoid
:= Convert_Chars_Ptr_To_Lpcvoid(B);
begin
Bool_Result :=
Win32.Winbase.WriteFile
( ...
lpBuffer => Buffer_Ptr, -- Win32.Lpcvoid
nNumberOfBytesToWrite => Win32.Dword(Item'Length), -- Win32.Dword => 1 bytes
... )
end Put;
While the get function is OK, I think the put function is horrible. It
also requires copying the data, ideally I don't want this as I want to
maximize efficiency, even for large transactions (not currently a
strict requirement though). Is there anyway this could be improved?
Thanks in advance for any suggestions.
Alternatively, if somebody knows of a good quality set of thick
bindings that I could use, preferably GPL (or compatible), then please
let me know. Thanks.
--
Brian May <bam@snoopy.apana.org.au>
next reply other threads:[~2004-11-10 2:41 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-11-10 2:41 Brian May [this message]
2004-11-10 4:36 ` Thick Ada bindings to C Win32 tmoran
2004-11-10 19:31 ` Jeffrey Carter
2004-11-12 1:51 ` Brian May
2004-11-12 12:09 ` Nick Roberts
2004-11-12 17:57 ` tmoran
2004-11-12 18:50 ` Martin Krischik
2004-11-12 23:29 ` Brian May
2004-11-13 0:51 ` Jeffrey Carter
2004-11-25 23:19 ` Brian May
2004-11-26 9:50 ` Martin Krischik
2004-11-26 12:23 ` Frank J. Lhota
2004-11-26 19:19 ` Jeffrey Carter
2004-11-27 23:56 ` Brian May
2004-11-28 18:57 ` Jeffrey Carter
2004-11-28 23:45 ` Brian May
2004-11-29 7:50 ` Message-ID: <sa4vfbpzgfu.fsf@snoo tmoran
2004-11-29 14:34 ` Thick Ada bindings to C Win32 Frank J. Lhota
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox