Newsgroup: it.comp.lang.visual-basic
Titolo: API Read File - as Any

Salve a tutti,
sto scrivendo un programmino tipo WinZip che consenta di compimere ed
affettuare il multiple spanning di alcuni files. Siccome provengo dal
mondo C/C++ preferisco usare le API quando posso. ho pero` qualche
problema nella conversione dei tipi VOID in VB. Infatti per utilizzare
la API ReadFile devo passarle un puntatore void ad un buffer in RAM dove
voglio che lei scriva. Il problema e` il seguante: il VB mi dice di
dichiarare quell'argomento come as Any, e mi informa anche che cosi`
verra` disabilitato il controllo sui tipi, e fino a qui tutto OK. Allora
definisco una matrice di byte (il mio buffer) e gliela passo come
argomento. Il risultato e` "Tipi non corrispondenti"!!!!
Ma che fa mi prende in giro???
Aggiungo che l'handle al file viene generato correttamente, ecc. Se
invece di as Any ci metto As byte allora compila, ma non legge niente,
ovveroil parametro dell'api che ritornail num. di bytes letti e` zero, e
cosi` sono anche tutti gli elemtni di mybuffer)
Dim mybuffer() as byte
Dim success as long
.....
Redim mybuffer(1024) as byte
....
success=CreateFile(...)
success=ReadFile(....,mybuffer,....)
--------------------------------------
*        Lorenzo Tanganelli          *
* Dipartimento Sistemi & Informatica *
* Universita` degli Studi di Firenze *
--------------------------------------

 --------------------------------------
Prova a leggere questo file potrebbe esserti di aiuto
--------------537464D6ED
Content-Type: text/plain; charset=us-ascii; name="byte from multibyte.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="byte from multibyte.txt"
DOCUMENT:Q171652  23-JUL-1997  [vbwin]
TITLE   :HOWTO: Retrieve Individual Bytes from a Multi-Byte Type in VB
PRODUCT :Microsoft Visual Basic for Windows
PROD/VER:4.0 5.0 7.0 97
OPER/SYS:WINDOWS
KEYWORDS:PrgOther vb432 vb4win vb5all VBKBWinAPI kbhowto
======================================================================
---------------------------------------------------------------------
The information in this article applies to:
 - Microsoft Visual Basic Learning, Professional, and Enterprise Editions
   for Windows, version 5.0
   on the following platform: x86
 - Microsoft Visual Basic Standard, Professional, and Enterprise Editions,
   32-bit only, for Windows, version 4.0
 - Microsoft Access versions 7.0, 97
 - Microsoft Excel 97 for Windows
 - Microsoft Excel for Windows 95, version 7.0
 - Microsoft Word 97 for Windows
---------------------------------------------------------------------
SUMMARY
=======
This article demonstrates how to copy the individual bytes of data in a
multi-byte data type, such as a long integer or a single-precision floating-
point number, into a byte array. It also illustrates how to take an array
of bytes and turn it into a specific data type that Visual Basic (and VBA)
will recognize.
MORE INFORMATION
================
This code shows how to move the separate bytes of a long integer into a
four-element byte array and also how to turn the byte array back into a
long integer. In a Visual Basic project, place the following code in the
declarations section:
   Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" ( _
           ByRef Destination As Any, _
           ByRef Source As Any, _
           ByVal numbytes As Long)
A long integer consists of four bytes. These four bytes are recognized by
Visual Basic to be one number. Use the following subroutine to move the
individual bytes into a byte array:
   Public Sub LongToBytes(ByRef TheArray() As Byte, ByRef TheLong As Long)
     Call CopyMemory(TheArray(LBound(TheArray)), TheLong, 4)
   End Sub
The first parameter passed to CopyMemory is the first element of the array
into which the bytes will be stored. (NOTE: The entire array is passed to
longToBytes.) The second parameter is the source variable. The third
parameter is how many bytes will be moved. Because a long integer consists
of four bytes, this parameter has been set to 4.
To go the other way, turning a byte array back into a long integer
variable, use the following code:
   Public Function BytesToLong(TheArray() As Byte) As Long
   Dim TempLong As Long
     Call CopyMemory(TempLong, TheArray(LBound(TheArray)), 4)
     BytesToLong = TempLong
   End Function
NOTE: As with any API call, passing improper memory addresses can cause
data corruption or could cause your program to terminate abnormally.
REFERENCES
==========
For more information on the use of the RtlMoveMemory function in Visual
Basic, please see the following article in the Microsoft Knowledge Base:
    ARTICLE ID: Q129947
    TITLE     : Win32 Replacement for the hmemcpy Function
======================================================================
Keywords            : PrgOther vb432 vb4win vb5all VBKBWinAPI kbhowto
Version             : 4.0 5.0 7.0 97
Platform            : WINDOWS
=============================================================================
THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS
PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.  MICROSOFT DISCLAIMS
ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  IN NO
EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR
ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL,
CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF
MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.  SOME STATES DO NOT ALLOW THE EXCLUSION
OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES
SO THE FOREGOING LIMITATION MAY NOT APPLY.
Copyright Microsoft Corporation 1997.
--------------537464D6ED--