Sooky Boo wrote:
I put the function in a for loop and passed I as the size paramater
until it succeeded,
the size of the structure it expects is 40.
BTW what is the value of dwCount?
40 is equal to GetMem(sizeOf(SSLPROTOCOLS) + (2) * sizeOf(SSLPROTOCOL));
Indeed.
so
protocols := LPSSLPROTOCOLS(GetMem(sizeOf(SSLPROTOCOLS) + (2) *
sizeOf(SSLPROTOCOL)));
but the size of protocols^ is always 16 no matter what I put in GetMem.
(16 is the size of SSLPROTOCOL on its own)
Well, SSLPROTOCOL has size 12 and SSLPROTOCOLS has size 16. (Note that the
SSLPROTOCOLS record type holds one DWORD and one SSLPROTOCOL.)
The point is that neither C nor Pascal has a way to declare a record/struct of
varying size. The compiler itself is not aware of the fact that
SSLPROTOCOLS.ProtocolList is actually an array of of dwCount items.
But you can still use a trick: allocate a block of memory using GetMem, then
cast the pointer to the memory block to LPSSLPROTOCOLS ( = ^SSLPROTOCOLS). This
allows you to interpret the first SizeOf(SSLPROTOCOLS) bytes of the memory
block as if it is a SSLPROTOCOLS record. Moreover, when range checking is off,
you can use the syntax
protocols^.ProtocolList[i]
to access any i-th element (as long as you allocated a memory block that is
large enough).
How do I now GetMem for protocols^.ProtocolList.
//protocols^.ProtocolList := (GetMem((2) *
sizeOf(SSLPROTOCOL)));//Error: Incompatible types: got "Pointer"
expected "Array[0..0] Of SSLPROTOCOL"
The compiler error tells you precisely what is wrong here. An 'array[0..0] of
anyThing' is not a pointer type in Pascal (and neither is the 'anyThing[1]'
type in C). Instead an 'array[0..0] of anyThing' holds room for (and has the
same size as) one 'anyThing'.
You can't do
var i:integer;
...
i := GetMem(SizeOf(integer));
but you can do
var pi:^integer; // pointer to integer
...
pi := ^integer(GetMem(SizeOf(integer)));
Bram
On Sun, Feb 24, 2008 at 12:31 PM, Bram Kuijvenhoven
<[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> wrote:
Sooky Boo wrote:
> On 2/23/08, ik <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:
>> {$PACKRECORDS C}
>>
>> On Sat, Feb 23, 2008 at 5:59 AM, Sooky Boo <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> wrote:
>>>
>>> Please help I am unsure how to port from C++ to fpc this code.
>>> The function this must be passed to says that the structure
pointer or
>> size
>>> is invalid.
>>>
>>> ----C++----
>>>
>>> typedef struct _SSLPROTOCOLS {
>>> DWORD dwCount;
>>> SSLPROTOCOL ProtocolList[1]; // array of 'count' structures
>>> } SSLPROTOCOLS, FAR *LPSSLPROTOCOLS;
>>>
>>> ----My Attempt FPC Delphi Mode----
>>>
>>> type SSLPROTOCOLS = record
>>> dwCount :DWORD;
>>> ProtocolList : array[0..0] of SSLPROTOCOL; // array of 'count'
structures
>>> end;
>
> Unfortunately still doesn't work :(
The actual size of the SSLPROTOCOLS struct/record should match the
value of dwCount. Allocating such a record probably should go like
LPSSLPROTOCOLS(GetMem(sizeOf(SSLPROTOCOLS) + (dwCount - 1) *
sizeOf(SSLPROTOCOL)))
Sometimes a dummy record is to be appended at the end of the array,
similar to the null character at the end of a null-terminated
string. In that case it is possible that this 'sentinel' record is
not counted in dwCount, but you should still allocate the space of
course. Please refer to the documentation of the header file (I hope
there is).
I hope this helps.
Regards,
Bram
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
<mailto:fpc-devel@lists.freepascal.org>
http://lists.freepascal.org/mailman/listinfo/fpc-devel
------------------------------------------------------------------------
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel