D - out struct parameters are by value!?
- Matthew Wilson (31/31) Oct 10 2003 I have a C function, whose effective signature is:
- Matthew Wilson (5/36) Oct 10 2003 Clarification: the size is not FILETIME. (That's the time!). It's actual...
- Walter (5/36) Oct 11 2003 The struct *is* passed by reference. It's the name mangling generated by...
I have a C function, whose effective signature is:
void __stdcall Recls_GetSizeProperty(recls_info_t fileInfo,
recls_filesize_t *size);
recls_info_t is actually a typedef of a pointer to a structure. Hence, the
first argument is 4 bytes.
recls_filesize_t is, in Win32, a FILETIME structure. Hence the second
argument is 4 bytes.
In D, I declared it as
public struct recls_time_t
{
uint dwLowDateTime;
uint dwHighDateTime;
};
extern(Windows)
{
. . .
private void Recls_GetSizeProperty(in recls_info_t fileInfo, out
recls_filesize_t size);
However, this fails to link. It cannot find _Recls_GetSizeProperty 12 which
clearly indicates that the out parameter is by value. If I define it as
extern(Windows)
{
. . .
private void Recls_GetSizeProperty(in recls_info_t fileInfo,
recls_filesize_t *size);
It links fine.
This seems more than a little odd. What if the struct is very large?
In fact, why is an out parameter passed by value? And how is the out-ness
effected? Very odd.
Please explain.
Matthew
Oct 10 2003
Clarification: the size is not FILETIME. (That's the time!). It's actually a ulong. "Matthew Wilson" <matthew stlsoft.org> wrote in message news:bm7hj0$20pq$1 digitaldaemon.com...I have a C function, whose effective signature is: void __stdcall Recls_GetSizeProperty(recls_info_t fileInfo, recls_filesize_t *size); recls_info_t is actually a typedef of a pointer to a structure. Hence, the first argument is 4 bytes. recls_filesize_t is, in Win32, a FILETIME structure. Hence the second argument is 4 bytes. In D, I declared it as public struct recls_time_t { uint dwLowDateTime; uint dwHighDateTime; }; extern(Windows) { . . . private void Recls_GetSizeProperty(in recls_info_t fileInfo, out recls_filesize_t size); However, this fails to link. It cannot find _Recls_GetSizeProperty 12whichclearly indicates that the out parameter is by value. If I define it as extern(Windows) { . . . private void Recls_GetSizeProperty(in recls_info_t fileInfo, recls_filesize_t *size); It links fine. This seems more than a little odd. What if the struct is very large? In fact, why is an out parameter passed by value? And how is the out-ness effected? Very odd. Please explain. Matthew
Oct 10 2003
The struct *is* passed by reference. It's the name mangling generated by the compiler that's wrong. "Matthew Wilson" <matthew stlsoft.org> wrote in message news:bm7hj0$20pq$1 digitaldaemon.com...I have a C function, whose effective signature is: void __stdcall Recls_GetSizeProperty(recls_info_t fileInfo, recls_filesize_t *size); recls_info_t is actually a typedef of a pointer to a structure. Hence, the first argument is 4 bytes. recls_filesize_t is, in Win32, a FILETIME structure. Hence the second argument is 4 bytes. In D, I declared it as public struct recls_time_t { uint dwLowDateTime; uint dwHighDateTime; }; extern(Windows) { . . . private void Recls_GetSizeProperty(in recls_info_t fileInfo, out recls_filesize_t size); However, this fails to link. It cannot find _Recls_GetSizeProperty 12whichclearly indicates that the out parameter is by value. If I define it as extern(Windows) { . . . private void Recls_GetSizeProperty(in recls_info_t fileInfo, recls_filesize_t *size); It links fine. This seems more than a little odd. What if the struct is very large? In fact, why is an out parameter passed by value? And how is the out-ness effected? Very odd. Please explain. Matthew
Oct 11 2003









"Matthew Wilson" <matthew stlsoft.org> 