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