Newsgroup: it.comp.appl.access
Titolo: Conversione  codice VBA da 32 bit a 64 bit , esistono tools ?

Buongiorno,  
esistono tools  anche a pagamento che effettuano la  conversione del codice VBA da versione access a 32 bit  a 64 bit  ?
 
Se si  qualcuno li ha provati ... sono sufficientemente affidabili ?  Nel senso  che richiedono pochi interventi a "mano" .
 
Grazie


cosa vorresti convertire?
hai provato a andare nella sezione moduli, aprire un modulo in modo da andare nell'editor VBa  e dal menu sceglire la vode DEBUG e "Compila Access" in modo da vedere eventuali errori in x64

Il giorno lunedì 7 dicembre 2020 alle 10:40:39 UTC+1 scaronic ha scritto:

Le cose che vanno convertite sono le API, per il resto... mi sfugge se hai sviluppato con il codice NATIVO di Access.
 
@Alex


Utilizzo  moduli con chiamate ad API  ,
utilizzando PTRSAFE   è possibile  gestire   32 bit  e 64 bit ,    quello che cerco (se esiste ?)  un tools che  effettui  per me la ricerca  e proponga la sostituzione  con PTRSAFE   o altro

 Il giorno lunedì 7 dicembre 2020 alle 12:12:09 UTC+1 @Alex ha scritto:> Il giorno lunedì 7 dicembre 2020 alle 10:40:39 UTC+1 scaronic ha scritto:> > Buongiorno, > > esistono tools anche a pagamento che effettuano la conversione del codice VBA da versione access a 32 bit a 64 bit ? > > > > Se si qualcuno li ha provati ... sono sufficientemente affidabili ? Nel senso che richiedono pochi interventi a "mano" . > > > > Grazie> Le cose che vanno convertite sono le API, per il resto... mi sfugge se hai sviluppato con il codice NATIVO di Access. > > @AlexUtilizzo  moduli con chiamate ad API  ,utilizzando PTRSAFE   è possibile  gestire   32 bit  e 64 bit ,    quello che cerco (se esiste ?)  un tools che  effettui  per me la ricerca  e proponga la sostituzione  con PTRSAFE   o altro
 
Che io sappia non esiste nulla.
Se usi le API e ne hai competenza con pazienza puoi scrivere
 codice che supporta la compilazione condizionale e renderlo
 usabile in entrambi i sistemi, delegando al compilatore l'azione
 di riconoscimento.
Se non ne hai discreta competenza... temo sarà una cosa che
 potrebbe darti grattacapi.
 
@Alex
-- 
@Alex
 
 
----Android NewsGroup Reader----
https://piaohong.s3-us-west-2.amazonaws.com/usenet/index.html
 

It happens that scaronic formulated :

 Laddove hai errore su:
 Private Declare Function...
 Private Declare Sub...
 
 modifica con:
 Private Declare PtrSafe Function...
 Private Declare PtrSafe Sub...
 
Bruno


Secondo me Bruno hai dato una risposta, tanto veloce quanto sbagliata... ma magari è perchè non usi le API...!
 
Diciamo che questi esempi sottoriportati li metto solo perchè a me non mi piace banalizzare le risposte.
 
1) convertire le Variabili dichiarate LONG alle chiamate a 32b mentre sono LongPtr nelle 64Bit...? 
    Faccio Esempio 32Bit:
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
    Private Sub NomeButton_Click()
          Dim mHwnd As Long
          mHwnd = FindWindow (......)
    End Sub
 
Esempio a 64Bit:
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
 
    Private Sub NomeButton_Click()
          Dim mHwnd As LongPtr
          mHwnd = FindWindow (......)
    End Sub
 
2) Convertire le Strutture dati, sia nella definizione che nell'eventuale Casting dei dati nell'Utilizzo.
Esempio 32Bit Struttura BROWSERINFO
Public Type BROWSEINFO
     hOwner As Long
     lngRoot As Long
     strDisplay As String
     strTitle As String
     lngFlags As Long
     lptPFN As Long
     lptParam As Long
     lngImage As Long
End Type
 
Esempio 64Bit Struttura BROWSERINFO
Public Type BROWSEINFO
     hOwner As LongPtr
     lngRoot As Long
     strDisplay As String
     strTitle As String
     lngFlags As Long
     lptPFN As LongPtr     
     lptParam As LongPtr
     lngImage As Long
End Type
 
3) Operatori di Conversione, ovviamente presenti solo nella versione 64Bit:
CLngPtr
CLngLng
 
Ovviamente, come sicuramente si sa, non è che tutti i LONG diventano LongPtr, quindi in particolare per le strutture dati, se non si sa come andare a verificare come convertirli, serve COPIARLI...
Per i più avanti si parte dalle dichiarazioni in C/C++
 
Saluti
@Alex

 Private Declare PtrSafe Sub... 
 
utilizzando  un trova - sostituisci   ..........  Funzionerebbe ???
 
Ho vari moduli   che indicano delle Function Pubbliche 
 
ad esempio 
 
Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, _
        lpRect As RECT) As Long
Declare Function IsZoomed Lib "user32" (ByVal hwnd As Long) As Long
Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal _
         nCmdShow As Long) As Long
Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal _
         X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight _
         As Long, ByVal bRepaint As Long) As Long
Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
 
 
cosa dovrei fare  ?
 


Buongiorno,
 
in contemporanea  a quando rispondevo / ponevo dei quesiti  a Bruno ,
ho ricevuto la risposta di ALEX
 
 
che mi pone  ulteriori  problemi per la risoluzione .
 
in particolare  l'affermazione di alex :
 
"Ovviamente, come sicuramente si sa, non è che tutti i LONG diventano LongPtr, quindi in particolare per le strutture dati, se non si sa come andare a verificare come convertirli, serve COPIARLI...
Per i più avanti si parte dalle dichiarazioni in C/C++ 
 
 
Cosa  vuol dire serve  COPIARLI ?
Io intenderei mantenere la struttura dati  vedi tabelle BE  in formato mdb  (access 2000) , o devono essere  per forza convertite ?
 

 Io intenderei mantenere la struttura dati vedi tabelle BE in formato mdb (access 2000) , o devono essere per forza convertite ?
 
Non hai compreso a mio avviso la cosa...!
Si chiamano strutture dati le dichiarazioni che spesso sono necessarie alle API rappresentate da Tipi di strutture complesse.
Esempio riagganciandomi a quanto pubblicato sopra:
 
Private Declare PtrSafe Function SHBrowseForFolderA Lib "shell32.dll" (lpBrowseInfo As BrowseInfo) As Long
 
Questa chiamata come vedi richiede venga passata una Variabile Strutturata definita BrowseInfo.
 
Come pubblicato sopra, la struttura a 64Bit è questa, ovviamente diversa da quella a 32:
Public Type BROWSEINFO
.....hOwner As LongPtr
.....lngRoot As Long
.....strDisplay As String
.....strTitle As String
.....lngFlags As Long
.....lptPFN As LongPtr
.....lptParam As LongPtr
.....lngImage As Long
End Type
 
Quì trovi un esempio:
https://stackoverflow.com/questions/57292321/select-folder-using-shbrowseforfoldera-does-not-work-on-windows-10-platform
 
 
Come dicevo poi ovviamente, vanno riviste anche tutte le Variabili LOCALI nelle Function/Sub in Maschere e/o Moduli che interagiscono con le Chiamate API.
 
Non ha nulla a che vedere con le Tabella ed il fatto tu abbia le idee poco chiare, penso possa rappresentare un discreto limite operativo.
 
@Alex


Alex  hai ragione ,  io non ho alcuna esperienza  delle API  ,  è proprio  per questo che   ,  ritornando  al quesito iniziale  : esistono  dei tools  (anche a pagamento )   che facciano  il lavoro per me ? 
Oppure  le chiamate alle API  sono quelle  che negli anni ho trovato negli esempi  degli appassionati  di Access in tutto il mondo ,
tu hai riportato BROWSEINFO , io  ho citato GetWindowRect ; IsZoomed; IsZoomed; 
altre che utilizzo  GetParent; GetVolumeInformation ,MAPISendMailOE,  MAPISendMail, OleTranslateColor, GetOpenFileName, apiRegOpenKeyEx,    ( non sono farina del mio sacco..) 
 
cosa dovrei fare  secondo te ?
 
grazie per l'attenzione

 magari è perchè non usi le API...!
 
Non sai nemmeno leggere... ho scritto "Laddove hai errore su:"
 
e tutti i programmi scritti a 32 bit li ho trasformati in 64 bit
semplicemente premettendo PtrSafe prima di Function/Sub.
 
Su altri errori non mi pronuncio, non ne ho verificati.
 
Bruno

scaronic explained :

Penso di sì, provare non costa niente.
Io non l'ho fatto perché delle Declare Function/Sub in ogni programma
ne ho verramente poche e complessivamente le avrò sul 5/10% dei
programmo.
Quando posso farne a meno uso le "vespe" e non le API.
 
Puoi anche provare solo sulla prima che ti dà errore poi col Debug
vedere se quella corretta "passa".
 
Ripeto ad abundantiam: se l'errore è su Declare Function/Sub
 
Bruno

 Bruno
 
So leggere... chiedeva cosa serve fare per la conversione da 32 a 64.... e quindi penso servisse un ventaglio di cose che con le API di norma è comune fare e sapere.
Evidentemente il tuo alveare ha solo 2 Insetti... 1 Fuco, ed una vespa.
 
@Alex
 


Ragazzi ..io sono un anziano .. (Alex  e Bruno )   vi  ricordo   che la polemica  (serve solo ai giornalisti e ai politici ) , lo scopo di un  Gruppo è  aiutare chi pone dei quesiti ,  è ovvio , che chi pone dei quesiti è ignorante , altrimenti non  porrebbe dei quesiti  . 
 
Caro Alex  ti seguo  da almeno 10 anni ,   devo dirti  che non cambi l'atteggiamento , sei un professore  che sa tutto ,  ma non spieghi la soluzione  per l'allievo (io)  , che ovviamente è ignorante ,   apprezzo l'atteggiamento ,  di Bruno  che  sostanzialmente  mi  dice PROVA ...
 
Al professor  Alex  ripeto  , io non è che non ci ho messo "la schiena" e voglio la pappa pronta .
l'esempio che  ha  riportato  è disponibile sul web da tempo l'avevo già visto
se vuoi è come distinguere i 
hOwner As LongPtr
e  
lngRoot As Long 
che va lasciato così
 
Alex  non prendertela  , penso che il tuo atteggiamento  sia caratteriale ,  ho sempre  ammirato la tua disponibilità ed ho attinto da i tuoi esempi  disponibili in rete .
 
Spero  che intervenga KARL   , che da buon austro/tedesco  non si perde  in discorsi  ma fornisce spesso la soluzione 
 
 
 
 
 
 

 l'atteggiamento ,  di Bruno  che  sostanzialmente  mi  dice PROVA ...
E in tanti anni hai imparato a far lunghe chiacchierate.
Ma una PROVA, una sola l'hai fatta?
Mica ti si rovina il PC se non funziona!
 
Bruno

 Spero che intervenga KARL , che da buon austro/tedesco non si perde in discorsi ma fornisce spesso la soluzione
 
Karl in questo specifico tema ha poco da aggiungere... ma è sempre il Benvenuto come tutti del resto.
 
Saluti
@Alex

 esistono tools  anche a pagamento che effettuano la  conversione del codice VBA da versione access a 32 bit  a 64 bit  ?
 
No.
 
Per il necessario lavoro manuale c'è un ottimo articolo di Philipp 
Stiefel: 
https://codekabinett.com/rdumps.php?Lang=2&targetDoc=windows-api-declaration-vba-64-bit
 
 
Recentemente, Phil ha aggiunto all'articolo un foglio di imbroglio per i 
tipi di dati corretti. Puoi trovarlo nella sezione "API Conversion 
Resources".
 
-- 
Ciao
Karl
*********
http://AccessDevCon.com
 
Access FAQ: 
https://www.donkarl.com/it
 


Ringrazio  per i link all'articolo  di phillipp  ,
 
Chiedo  un consiglio su come  procedere  :
Mi sono fatta questa idea  che potrebbe essere sbagliata data la mia ignoranza :
1)  utilizzare  nelle PRIVATE DECLARE FUNCTION    >  private declare PTRSAFE  function
2)  utilizzare la tabella  
https://codekabinett.com/download/win32api-data-types-vba.pdf
 , per sostituire  i dati LONG con LONGPTR (consultare  anche Win32API_PtrSafe.TXT)
3)  utilizzare la formattazione  condizionale nel caso voglia mantenere la compatibilità  32-64 bit .
per intendersi  quella indicata nell'articolo come esempio :
 #If VBA7 Then
    Dim hwnd As LongPtr
#Else
    Dim hwnd As Long
#End If
 
Grazie mille  !!
 
 
 
 

 
 
Definire "..foglio di imbroglio.." please
In italiano per 'imbroglio' si intende una truffa, un inganno

 #End If
 
Suona bene, ma non so quali siano le tue esigenze esatte, né quali 
funzioni API usi, né con quali versioni di Access devi rimanere 
compatibile. Forse si trova da qualche parte nella discussione, ma è 
troppo lunga e non abbastanza eccitante da poter leggere ogni post ;-)


 In italiano per 'imbroglio' si intende una truffa, un inganno
 
Phil chiama il suo foglio "cheat sheet", che è quello che una persona di 
lingua inglese segretamente ha sotto la scrivania quando non ha 
studiato. Per questo, l'"imbroglio" del software di traduzione mi sembra 
una buona scelta. Non è vero?



Le cose giuste da fare sono TUTTE quelle che servono... 
Quindi non esiste una lista, tutto quello che ti ho espresso nel mio post, che poi è quanto indica Philip nel suo link, è da conoscere ed applicare la dove serve e se serve in relazione a cosa si è fatto e come lo si è fatto.
Non basta quindi fare il Replace del PtrSafe a meno tu non stia utilizzando una chiamata API che non richiede altre considerazioni.
A mio avviso non serve andare a tentoni, ma capire cosa si sta facendo.
 
Sulla Compilazione condizionale, la retrocompatibilità al 32 la si usa se ha senso... se tu hai un sistema solo a 64Bit non ha alcun senso scrivere codice compatibile a 32.
Ti ricordo che poi la compatibilità si riscontra solo nel momento in cui il Compilatore che sarà a 32 o 64 fa il suo mestiere riconoscendo le condizioni #...#
 
Riassumendo, se hai poche API e non hai chiaro cosa sia da fare, posta le righe e qualcuno magari ti farà le modifiche ... per il Copy/Paste
 
@Alex

 Karl 
 
E' il bigliettino segreto, qualcuno li chiamava "pizzini", ma direi che il senso è quello che hai detto... 
 
Ciao Karl
@Alex