zio Ken ha scritto:
@Alex ha scritto:
Se usi in modo corretto la compilazione condizionale si.
ciao Alex, perdonami ma ho provato a convertire l'applicativo da 32 a 64 bit dove giusto qualche chiamata alle API era da settare.
Però ho riscontrato che se ad esempio, in fase di creazione documento, sul 32 bit nel caso in cui tentavo di salvare, sul btnSalva vi erano una serie di controlli, quali il metodo di pagamento e varie.
Il metodo di pagamento è indicizzato e nel caso in cui non inserito ho inserito un allert dove veniva richiesto.
diversamente nel 64 bit tale controllo viene totalmente ignorato e compare a video l'allert di access dove richiede l'inserimento del dato perchè non previsti valori nulli.
Come mai questo "comportamento"? Anche i controlli bisogna gestire? Mi sembrava di aver capito che la questione fosse relativa solo a chiamate API e function
Il codice Nativo di Access non subisce varianti... quindi la risposta teorica è SI non serve alcuna precauzione... tuttavia sai anche tu che chi scrive codice alcune volte fa cose per scontate non sempre in piena consapevolezza e magari incappa in qualche rogna.
Ad esempio quando dici che solo le API hanno il problema, l'affermazione può essere FALSA... perchè mal interpretata.
Ti faccio un esempio banale:
Versione 32Bit
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Versione 64Bit
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Cosa significa per te concretamente che le API generano il problema...?
Se la tua idea è che ti basta sostituire la 2° alla 1°... beh direi che stai sbagliando...!
Come vedi le 2 Chiamate, al di la del PTRSAFE, restituiscono un Valore che altro non è che l'Handle della Finestra, ma mentre nella versione a 32Bit è un [Long], nella versione a 64Bit è un [LongPtr].
Quindi dove usi queste chiamate, se hai a versione 32 dichiari
Dim hWnd As Long
mentre dove hai la versione 64 Bit non va bene e devi dichiarare
Dim hWnd As LongPtr
Ne consegue che anche il Codice che interagisce con le API deve essere considerato e gestito con la Compilazione condizionale...!
Andrà quindi scritta una cosa simile
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "USER32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
Public Sub Tua Function(ByVal WindowTitle As String)
#If VBA7 Then
Dim hwnd As LongPtr
#Else
Dim hwnd As Long
#End If
hwnd = FindWindow(vbNullString, WindowTitle)
' ecc....
End Sub
Chiarito questo, mi chiedo tuttavia se, prima di COMPILARE tu non abbia fatto un DEBUG serio sulla versione 64Bit... ti fidi a compilare e sperare che funzioni tutto...? Non conviene provare la versione ACCDB e testarla prima...?
Come fai DEBUG sulla versione COMPILATA...? (non si può se non hai predisposto un tool apposito di LOG interno...)
Insomma secondo me serve un minimo di metodo... che probabilmente devi consolidare.