Help with FFI structure pointer
nicolas cellier
ncellier at ifrance.com
Tue Aug 1 20:04:44 UTC 2006
I do not understand how this code works.
If external code is allocating the structure, shouldn't it return a pointer to
the structure rather than a structure by value, what i understand as a copy?
Wouldn't it be
<apicall: MyStruct * 'MyAPICall' (MyStruct *) module: 'my.dll'>
In which case, you can pass nil to the pointer and have a single MyApiCall
declared in Smalltalk.
If MyStruct is just an opaque handle you do not access but thru external code,
maybe you can write:
<apicall: long 'MyAPICall' (long) module: 'my.dll'>
<apicall: void 'FreeContext' (long) module: 'my.dll'>
Nicolas
Le Mardi 01 Août 2006 21:30, Ron Teitelbaum a écrit :
> All,
>
> I'm sure someone saw this coming. I could use some help.
>
> Ok I built a structure but the use of the structure is kinda odd.
>
> What I need to do is pass the structure in as null for the first call. Then
> I need to pass the real structure in for subsequent calls.
> Finally I need to free the structure through the API using the structure
> pointer.
>
> I handled the first two problems by implementing
>
> <apicall: MyStruct 'MyAPICall' (long) module: 'my.dll'> and sending in
> nil. And
> <apicall: MyStruct 'MyAPICall' (MyStruct) module: 'my.dll'> <- this is so
> cool! I assume that Andreas wrote this code, it is beautiful!
>
> Ok now here it the problem:
>
> I have to call
>
> <apicall: void 'FreeContext' (MyStruct *) module: 'my.dll'> or something.
>
> The pointer needs to be sent to the apicall. Did I do this correctly
> (using MyStruct *) and it just doesn't work or is there another way to get
> the handle of the structure. The structure itself has a handle ivar but
> it's a byteArray.
>
> The result using MyStruct * is:
> ---------------------------------------------------------------------
> Tue Aug 01 14:28:54 2006
>
> Exception code: C0000005
> ============
> which appears to be a buffer overrun:
> // MessageId: STATUS_ACCESS_VIOLATION
> //
> // MessageText:
> //
> // The instruction at "0x%08lx" referenced memory at "0x%08lx". The memory
> could not be "%s".
> //
> #define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L) //
> winnt ============
> Exception addr: 77A8CE7E
> Access violation (read access) at 0000000D
> EAX:000C04E0 EBX:7C809794 ECX:00000000 EDX:00000001
> ESI:00000001 EDI:000C04E0 EBP:0006FB80 ESP:0006FB74
> EIP:77A8CE7E EFL:00210202
> FP Control: FFFF037F
> FP Status: FFFF4000
> FP Tag: FFFFFFFF
> VM Version: Squeak 3.7.1 (release) from Sep 23 2004
> Compiler: gcc 2.95.2 19991024 (release)
>
> Current byte code: 225
> Primitive index: 120
>
> Loaded plugins:
> SoundGenerationPlugin 23 September 2004 (i)
> SoundPlugin 23 September 2004 (i)
> crypt32.dll
> SqueakFFIPrims 23 September 2004 (e)
> ZipPlugin 23 September 2004 (i)
> SocketPlugin 23 September 2004 (i)
> DSAPrims 23 September 2004 (i)
> UUIDPlugin 23 September 2004 (i)
> LargeIntegers v1.3 23 September 2004 (i)
> Matrix2x3Plugin 23 September 2004 (i)
> FloatArrayPlugin 23 September 2004 (i)
> B2DPlugin 23 September 2004 (i)
> BitBltPlugin 23 September 2004 (i)
> SecurityPlugin 23 September 2004 (i)
> FilePlugin 23 September 2004 (i)
> MiscPrimitivePlugin 23 September 2004 (i)
>
>
> Stack dump:
>
> 619600144 Win32FFICertificateStore>freeCertContext
> 619599740 Win32FFICertificateStore>?
> .
>
> Thank you for any help!
>
> Ron Teitelbaum
More information about the Squeak-dev
mailing list
|