Loading ...
Sorry, an error occurred while loading the content.

46059Re: Passing / Receiving large (64bit) parameters in API Calls

Expand Messages
  • mike_collins_23
    Jan 21, 2013
    • 0 Attachment
      Hi Stefan,

      I think I understand your example, at least in terms of passing pointers to the structures. I didn't really understand the "GetProcAddress" part and what the different values for "pGetDiskFreeSpaceEx" meant (don't think it matters for the purpose of our discussion).

      I still have a problem receiving a 64bit number as the returned value. When I try the following code, Liberty disappears with no error messages:

      struct ChannelMask,_
      ChannelMaskLow as ulong,_
      ChannelMaskHigh as ulong

      calldll #CAN, "xlGetChannelMask",_
      hwType as short,_
      hwIndex as short,_
      hwChannel as short,_
      ChannelMask as struct

      print "xlGetChannelMask = "; ChannelMask.ChannelMaskLow.struct + ChannelMask.ChannelMaskLow.struct * hexdec("&H100000000")

      Obviously there was some prior code to open the DLL etc. and I have called some other simple functions of this DLL which return with a good status.

      It behaves OK if I make ChannelMask a Long but presumably I'm not then getting the full return value ?

      Mike

      --- In libertybasic@yahoogroups.com, Stefan Pendl wrote:
      >
      > Am 18.01.2013 10:35, schrieb mike_collins_23:
      > > Hi, I would like to use Liberty Basic to access a Vector Informatik dll (vxlapi.dll). Some of the calls require the transfer (or return) of a 64bit value (this is actually a bit mask). If parameters are passed on a stack to Windows API's then possibly 2 LONG parameters would look like a 64 bit value. The problem would still be how to handle the returned 64bit value ?
      > > Any information would be appreciated.
      > > Mike
      > >
      >
      > See the code below, which is used to get the free space of a drive.
      > GetDiskFreeSpaceEx uses a LONG_INTEGER type, which is 64-bit.
      >
      >
      > '---code start (watch for line wraps)
      >
      > i = 1
      > while word$(Drives$, i) <> ""
      > drive$ = word$(Drives$, i)
      > print drive$; " ... "; GetDiskFreeSpace(drive$); " Bytes free"
      > i=i+1
      > wend
      > end
      >
      > function GetDiskFreeSpace(driveLetter$)
      > calldll #kernel32, "GetModuleHandleA" , _
      > "kernel32.dll" as ptr, _
      > hKernel as ulong
      >
      > calldll #kernel32, "GetProcAddress" , _
      > hKernel as ulong, _
      > "GetDiskFreeSpaceExA" as ptr, _
      > pGetDiskFreeSpaceEx as ulong
      >
      > if pGetDiskFreeSpaceEx = 0 then
      > struct lpSectorsPerCluster, value as ulong
      > struct lpBytesPerSector, value as ulong
      > struct lpNumberOfFreeClusters, value as ulong
      > struct lpTotalNumberOfClusters, value as ulong
      >
      > calldll #kernel32, "GetDiskFreeSpaceA" , _
      > driveLetter$ as ptr, _
      > lpSectorsPerCluster as struct, _
      > lpBytesPerSector as struct, _
      > lpNumberOfFreeClusters as struct, _
      > lpTotalNumberOfClusters as struct, _
      > infoOK as ulong
      >
      > GetDiskFreeSpace = lpBytesPerSector.value.struct *
      > lpSectorsPerCluster.value.struct * _
      > lpNumberOfFreeClusters.value.struct
      > else
      > struct lpFreeBytesAvailableToCaller, LowByte as ulong, HighByte
      > as ulong
      > struct lpTotalNumberOfBytes, LowByte as ulong, HighByte as ulong
      > struct lpTotalNumberOfFreeBytes, LowByte as ulong, HighByte as
      > ulong
      >
      > calldll #kernel32, "GetDiskFreeSpaceExA" , _
      > driveLetter$ as ptr, _
      > lpFreeBytesAvailableToCaller as struct, _
      > lpTotalNumberOfBytes as struct, _
      > lpTotalNumberOfFreeBytes as struct, _
      > infoOK as ulong
      >
      > GetDiskFreeSpace = lpTotalNumberOfFreeBytes.HighByte.struct *
      > HexDec("100000000") + _
      > lpTotalNumberOfFreeBytes.LowByte.struct
      > end if
      > end function
      >
      > '---code end
      >
      > --
      > Stefan Pendl
      > http://stefanpendl.runbasichosting.com/
      >
      > LB 4.04 Pro ... http://www.libertybasic.com/assist.html
      > LB 4.04 ....... http://www.libertybasic.com/lb404setup.exe
      >
      > LB Community Wiki .............. http://basic.wikispaces.com/
      > LB Programmer's Encyclopedia ... http://lbpe.wikispaces.com/
      > LB Bug Tracker ................. http://libertybasicbugs.wikispaces.com/
      >
      > Books at http://www.lulu.com/ and http://www.amazon.com/
      > Alyce Watson ... APIs for Liberty BASIC
      > Carl Gundel .... Beginning Programming with Liberty BASIC
      >
      > Windows 7 Home Premium 64-bit SP1
      > AMD Turion X2 RM-70 2GHz, 4GB RAM
      >
    • Show all 9 messages in this topic