Newsgroup: it.comp.lang.visual-basic
Titolo: Dichiarazioni API cosa c'è di sbagliato ?

Ho copiato queste 2 dichiarazioni di funzioni API in un modulo Standard 
.bas:
Public Declare Function GetFileSizeEx Lib "kernel32" (ByVal hFile As Long, 
lpFileSize As Currency) As Boolean
Public Declare Function CreateFile Lib "kernel32" (ByVal lpFileName As 
String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, 
lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As 
Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As 
Long
Quando eseguo il programma la prima passa tranquilla cioè la "GetFileSizeEx"
Invece per la seconda "CreateFile" mi da questo errore "Tipo definito 
dall'utente non definito"
Ora mi chiedo se fanno entrambe parte di Kernel32.dll perchè ho questo 
comportamento ?
Ivan
 

 comportamento ?
Perché non hai copiato la struttura SECURITY_ATTRIBUTES, che compare 
nella dichiarazione.

 Ivan
Postando le dichiarazioni API non ci hai evidenziato come le usi,
e dato che ti viene restituito un errore suppongo che possa
derivare da un errato utilizzo.
Saluti
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

In pratica devo solo aprire un file in lettura senza fare nulla, poi passare 
l'handle alla finzione API GetFileSizeEx per conoscerne le dimensioni in 
byte e riochiudere l'handle.
Per ragioni che non sto a ripetere (esiste un mio post precedente 
sull'argomento chi č interessato controlli limitazioni EOF) in pratica per 
colpa delle limitazioni di LOF o FileLen di VB6 e per non dover ricorrere a 
scripting FSO mi tocca usare ricorrere a tutto sto casino, che cosa 
vergognosa, un software come VB6 avrebbe meritato di rirornare valori 
Currency nelle funzioni LOF e FileLen cosě mi tocca scomodare le API 
altrimenti per i file da piu di 4 GIGA non posso conoscerne le dimensioni in 
byte per il programma che sto realizzando cosa irrinunciabile.
Cerco qualcuno che possa postarmi per intero la procedura corretta per 
leggere le dimensioni di un file con le API ''CreateFile'' e 
''GetFileSizeEx'' dichiarazioni comprese. 

 ''GetFileSizeEx'' dichiarazioni comprese.
Prima un po' di teoria che non fa mai male.
Quando fai una Declare tu "dichiari" (appunto) cosa vuoi usare e *come* vuoi
usarlo.
VB non sa niente del sistema che gli sta sotto e delle funzioni che usa,
devi dirgli tutto tu, struttura delle Type comprese.
Quando una Declare ti dice che non conosce il tipo di una variabile č perchč
non esiste la sua definizione.
Quali sono le definizioni sconosciute a VB in CreateFile()?
La SECURITY_ATTRIBUTES di sicuro, quindi una soluzione č cercare in MSDN
questa definizione.
Un'altra soluzione č sapere che c'č il tool API viewer che ti mostra una
buona parte delle dichiarazioni che potrebbero servirti.
Un'altra ancora migliore č scaricarsi l'API guide da qui
http://www.mentalis.org/index2.shtml
 dove troverai dichiarazioni e esempi.
Ciao

 ha
scritto:

Devi inserire le costanti, se no non va.
Ti copio il programma che usa la funzione CreateFile e la GetFileSizeEx 
Appena provato e FUNZIONA!
Copia il tutto in un modulo .BAS il codice e fallo partire da Main
 ( da VB >> Progetto >> Proprietà )
___________________________________
Const GENERIC_READ = &H80000000
Const FILE_SHARE_READ = &H1
Const OPEN_EXISTING = 3
Const FILE_TYPE_CHAR = &H2
Const FILE_TYPE_DISK = &H1
Const FILE_TYPE_PIPE = &H3
Const FILE_TYPE_UNKNOWN = &H0
Private Declare Function GetFileType Lib "kernel32" (ByVal hFile As Long) As
Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal
lpFileName As String, ByVal dwDesiredAccess As Long, _
     ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal
dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
     ByVal hTemplateFile As Long) As Long
Private Declare Function GetFileSizeEx Lib "kernel32" (ByVal hFile As Long,
lpFileSize As Currency) As Boolean
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As
Long
Private Sub Main()
    Dim hFile As Long, nSize As Currency, sSave As String,  MyFile as String
'Qui il NOME del FILE
MyFile ="F:\back\E_Drive.v2i"
    'open the file
    hFile = CreateFile(MyFile , GENERIC_READ, FILE_SHARE_READ, ByVal 0&,
OPEN_EXISTING, ByVal 0&, ByVal 0&)
    'get the filesize
    GetFileSizeEx hFile, nSize
    'close the file
    CloseHandle hFile
    MsgBox "File Size:" & Str$(nSize * 10000)  & " bytes"
End Sub
--
ciao
  Stefano

 wrote in message
news:eWQ8f.8567$
hC1....@tornado.fastwebnet.it

Const GENERIC_READ = &H80000000
Const FILE_SHARE_READ = &H1
Const OPEN_EXISTING = 3
Const FILE_TYPE_CHAR = &H2
Const FILE_TYPE_DISK = &H1
Const FILE_TYPE_PIPE = &H3
Const FILE_TYPE_UNKNOWN = &H0
Private Declare Function GetFileType Lib "kernel32" (ByVal hFile As
Long) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA"
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal
dwShareMode As Long, lpSecurityAttributes As Any, ByVal
dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal
hTemplateFile As Long) As Long
Private Declare Function GetFileSizeEx Lib "kernel32" (ByVal hFile As
Long, lpFileSize As Currency) As Boolean
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long) As Long
Private Sub Form_Paint()
    Dim hFile As Long, nSize As Currency, sSave As String
    'open the file
    hFile = CreateFile("c:\autoexec.bat", GENERIC_READ, FILE_SHARE_READ,
ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)
    'get the filesize
    GetFileSizeEx hFile, nSize
    'retrieve the file type
    Select Case GetFileType(hFile)
        Case FILE_TYPE_UNKNOWN
            sSave = "The type of the specified file is unknown"
        Case FILE_TYPE_DISK
            sSave = "The specified file is a disk file"
        Case FILE_TYPE_CHAR
            sSave = "The specified file is a character file, typically
an LPT device or a console"
        Case FILE_TYPE_PIPE
            sSave = "The specified file is either a named or anonymous
pipe"
    End Select
    'close the file
    CloseHandle hFile
    MsgBox "File Type: " + sSave + vbCrLf + "Size:" + Str$(nSize *
10000) + " bytes"
End Sub


     MsgBox "File Size:" & Str$(nSize * 10000)  & " bytes"
Ho provato pure io, ma nSize vale sempre 0
--
Greg

 End Sub
    'get the filesize
    x = GetFileSizeEx(hFile, nSize)  ' XXXX
    'close the file
    CloseHandle hFile
    MsgBox "File Size:" & Str$(nSize * 10000) & " bytes"
Se cambio quella riga (segnata dalle X) in quel modo funziona pure a me
--
Greg

     x = GetFileSizeEx(hFile, nSize)  ' XXXX
Non c'è alcuna differenza funzionale tra le due, se non che nella seconda
puoi sapere se la funzione ce l'ha fatta o no.
Ciao
--
Reporting tool: 
http://www.neodatatype.net



Ho modificato l'esempio di AllApi e a me funziona anche così:
  GetFileSizeEx hFile, nSize
Comunque il modo corretto di chiamare una funzione è il secondo, anche perchè il
valore booleano che fornisce dice anche se è riuscita o meno.
quindi meglio fare:
Dim X as Boolean
  X = GetFileSizeEx(hFile, nSize)
Oltretutto ApiGuide dice:
"If the function fails, the return value is zero. To get extended error
information, call GetLastError."
Quindi si può abbellire così:
__________________________________
Const GENERIC_READ = &H80000000
Const FILE_SHARE_READ = &H1
Const OPEN_EXISTING = 3
Const FILE_TYPE_CHAR = &H2
Const FILE_TYPE_DISK = &H1
Const FILE_TYPE_PIPE = &H3
Const FILE_TYPE_UNKNOWN = &H0
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal
lpFileName As String, ByVal dwDesiredAccess As Long, _
     ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal
dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
     ByVal hTemplateFile As Long) As Long
Private Declare Function GetFileSizeEx Lib "kernel32" (ByVal hFile As Long,
lpFileSize As Currency) As Boolean
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As
LongPrivate Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA"
(ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal
dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments
As Long) As Long
Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Const LANG_NEUTRAL = &H0
  Dim Buffer As String
 Dim X as Boolean
Private Sub Main()
    Dim hFile As Long, nSize As Currency, sSave As String,  MyFile as String
'Qui il NOME del FILE
MyFile ="F:\back\E_Drive.v2i"
    'open the file
    hFile = CreateFile(MyFile , GENERIC_READ, FILE_SHARE_READ, ByVal 0&,
OPEN_EXISTING, ByVal 0&, ByVal 0&)
   'close the file
    CloseHandle hFile
  X = GetFileSizeEx(hFile, nSize)
If X = False then
 
    Buffer = Space(200)
 
 L& = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError,
LANG_NEUTRAL, Buffer, 200, ByVal 0&)
 
    MsgBox Buffer
Else
     MsgBox "File Size:" & Str$(nSize * 10000)  & " bytes"
End If
End Sub
________________
--
ciao
  Stefano

 Ciao
Ok, ma se sono uguali resta il mistero del perchč, solo sul mio pc, una
funziona e l'altra no.
--
Greg