CreateFile library error - Printable Version +- QB64 Phoenix Edition (https://staging.qb64phoenix.com) +-- Forum: QB64 Rising (https://staging.qb64phoenix.com/forumdisplay.php?fid=1) +--- Forum: Code and Stuff (https://staging.qb64phoenix.com/forumdisplay.php?fid=3) +---- Forum: Help Me! (https://staging.qb64phoenix.com/forumdisplay.php?fid=10) +---- Thread: CreateFile library error (/showthread.php?tid=1731) |
CreateFile library error - eoredson - 06-05-2023 I have been using this code for awhile. It is a CreateFile library function call. Problem it work in Qb64pe-32 bit but in 64-bit throws a GNU C++ compilation error and I wanted to know why!? Erik. Code: (Select All) Rem $Dynamic RE: CreateFile library error - DSMan195276 - 06-05-2023 'CreateFileA' returns a HANDLE, which should be treated as an _Offset, but you wrote it as CreateFileA&, so the return value is treated as a 32-bit LONG. The C++ compiler isn't allowing you to make the mistake of casting the HANDLE value to a LONG (which is what QB64 will do to make your function definition work) because that's always a bug on 64-bit systems and chops-off the top-half of the 64-bit HANDLE value, making it useless. RE: CreateFile library error - eoredson - 06-05-2023 So if I modify the handle to: Code: (Select All) Dim hfind As _Unsigned Long Erik. RE: CreateFile library error - DSMan195276 - 06-05-2023 (06-05-2023, 10:35 PM)eoredson Wrote: So if I modify the handle to: You got it backwards. You correctly declared hfindas an _Offsettype, but you incorrectly declared the return type of CreateFileAto be a Longinstead of an _Offset. You need to declare it as CreateFileA%&so that QB64 knows it returns an _Offset type. RE: CreateFile library error - eoredson - 06-05-2023 Can you tell me if this is correct.. Code: (Select All) Rem $Dynamic RE: CreateFile library error - mnrvovrfc - 06-06-2023 In 64-bit _UNSIGNED LONG sometimes won't be good enough, and it won't be toward a parameter that expects a pointer. It's because LONG in QB64 is always 32-bit. It needs to be _INTEGER64 or better yet, _OFFSET. When converting 32-bit code to 64-bit be prepared to turn any LONG or _UNSIGNED LONG into _OFFSET, or less frequently _INTEGER64. But it depends on the context, such as that "size_t" that seems to be declared as different type in each C/C++ header file. Pointers are really a PITA which is why I gave up soon with C programming. Was repeatedly crashing my computer trying to program a cheap window manager out of the equivalent of SCREEN 0 limited to MS-DOS, many many years ago. RE: CreateFile library error - DSMan195276 - 06-06-2023 (06-05-2023, 11:58 PM)eoredson Wrote: If the entire problem is with the function declaration then I have got it wrong the whole time.The code looks good to me, and seems to work Yes it was technically wrong the whole time. The catch is that because _Offsetis 32-bits wide in 32-bit QB64, and a Longis also 32-bits wide, using CreateFileA&happens to work anyway when using 32-bit QB64. It's only when using 64-bit QB64 that the _Offsetvs Longdistinction matters. To make your code portable between 32-bit and 64-bit you should ensure you use _Offsetfor any value that needs to vary in size depending on the platform (That goes for all pointer types, such as HANDLEin Win32). RE: CreateFile library error - eoredson - 06-06-2023 That helps and is a real pita because: 32-bit = Long/_Unsigned Long 64-bit = _Integer64/_Offset never seemed clear to me because of the function declaration is CreateFile%& as well.. Erik. RE: CreateFile library error - eoredson - 06-06-2023 My ultimate goal was to make sure my projects are cross-platform compatible between 32-bit and 64-bit. I can't test this fact since I have no 64-bit version of Qb64pe that ever worked very well.. If I can get around the compilation errors then I can test the code. RE: CreateFile library error - DSMan195276 - 06-06-2023 (06-06-2023, 01:34 AM)eoredson Wrote: That helps and is a real pita because:That's note quite right, _Offsetis not the same thing as _Integer64. _Offsetis special, it is 32-bits wide on 32-bit QB64, and 64-bits wide on 64-bit QB64. It is a different size depending on the version used, which is also why you need to use it to represent types like HANDLEwhich also differ in size in C++ depending on the platform. To make cross-platform programs you have to use _Offsetto represent C++ types like pointers which are a different size on different platforms. |