Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Conversione codice VBA da 32 bit a 64 bit , esistono tools ?

236 views
Skip to first unread message

scaronic

unread,
Dec 7, 2020, 4:40:39 AM12/7/20
to
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

pfmarro

unread,
Dec 7, 2020, 5:10:57 AM12/7/20
to
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

@Alex

unread,
Dec 7, 2020, 6:12:09 AM12/7/20
to
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

scaronic

unread,
Dec 7, 2020, 1:45:04 PM12/7/20
to
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

Alex

unread,
Dec 7, 2020, 3:00:46 PM12/7/20
to
scaronic <carlo....@gmail.com> ha scritto:r
> 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

Bruno Campanini

unread,
Dec 8, 2020, 8:11:35 AM12/8/20
to
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

@Alex

unread,
Dec 8, 2020, 9:21:05 AM12/8/20
to
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

scaronic

unread,
Dec 8, 2020, 9:26:13 AM12/8/20
to
Il giorno martedì 8 dicembre 2020 alle 14:11:35 UTC+1 Bruno Campanini ha scritto:
Ringrazio della risposta ,

premetto che non ho installato una versione a 64 bit ,
il motivo è che ho acquistato office 2026 (completo) , e purtroppo mi impedisce di mantenere più versioni di access ( 200-2003 -.. installate sullo stesso PC) . di fatto dopo alcune prove di compatibilità (32 bit) l'ho disinstallato.
Quindi mi trovo a lavorare " al buio" pessima cosa.

Però posso fare prove con clienti "Amici" che hanno installato access a 64 bit .

Di seguito , indico la sequenza che dovrei percorrere :

Installare il mio programma in access , avviarlo ... dove da errore , dalla finestra Microfoft Visul basic sostituire come da te indicato ?

Scusa la BESTIALITA' e se sostituissi TUTTI i
> Private Declare Function...
> Private Declare Sub...
con
> Private Declare PtrSafe Function...
> 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 ?

scaronic

unread,
Dec 8, 2020, 9:39:10 AM12/8/20
to
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 ?

@Alex

unread,
Dec 8, 2020, 9:46:53 AM12/8/20
to
.....
> 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 ?

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

scaronic

unread,
Dec 8, 2020, 10:17:16 AM12/8/20
to
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

Bruno Campanini

unread,
Dec 8, 2020, 10:27:04 AM12/8/20
to
@Alex was thinking very hard :
> Il giorno martedì 8 dicembre 2020 alle 14:11:35 UTC+1 Bruno Campanini ha
> scritto:
>> It happens that scaronic formulated :
>>> 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
>> 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...!

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

Bruno Campanini

unread,
Dec 8, 2020, 10:38:53 AM12/8/20
to
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

@Alex

unread,
Dec 8, 2020, 11:05:16 AM12/8/20
to
> 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

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

scaronic

unread,
Dec 8, 2020, 11:06:24 AM12/8/20
to
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






Bruno Campanini

unread,
Dec 8, 2020, 11:15:56 AM12/8/20
to
scaronic pretended :
Io invece sono un giovane (85).

[...]
> 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 ...
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

@Alex

unread,
Dec 8, 2020, 12:33:39 PM12/8/20
to
> 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 ...

Nessuna polemica ho solo aggiunto cose che Bruno ha omesso ma sono strettamente legate all'uso delle API, e credo che sia meglio saperlo che semplicemente fare un Replace... che poi rischi non funzioni.

> 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 ci limitiamo al Copia/Incolla senza voler approfondire, Bruno ti ha dato l'indicazione giusta..., peraltro se non sei tu a sapere che API hai usato e che tipo di codice devi convertire... ne io ne Bruno possiamo immaginarlo.
Se vuoi capire quello che fai nel caso in cui capitassero situazioni che vanno al di la della semplice Dichiarazione, e se usi le API questo è frequente..., credo sia meglio capire nell'insieme, altrimenti di fermi 1mm dopo aver fatto quello che ha detto Bruno.

> 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 .

Ma io non me la prendo, perchè mai dovrei.... quando incapperai negli esempi che ti ho esposto... magari ti ricorderai, e magari serve anche a 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

Karl Donaubauer

unread,
Dec 9, 2020, 9:41:02 AM12/9/20
to
Salve,

scaronic:
> 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

scaronic

unread,
Dec 9, 2020, 4:38:17 PM12/9/20
to
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 !!




RobertoA

unread,
Dec 10, 2020, 3:17:01 AM12/10/20
to
Il 09/12/2020 15:41, Karl Donaubauer ha scritto:
> Salve,
>
> scaronic:
>> 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".
>

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

Karl Donaubauer

unread,
Dec 10, 2020, 7:49:47 AM12/10/20
to
Salve,

scaronic:
> Karl Donaubauer ha scritto:
>> ...
>> 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".
>
> 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

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 ;-)

Karl Donaubauer

unread,
Dec 10, 2020, 7:57:05 AM12/10/20
to
Salve,

RobertoA:
> Karl Donaubauer ha scritto:
>> ...
>> 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".
>
> Definire "..foglio di imbroglio.." please
> 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?

@Alex

unread,
Dec 11, 2020, 7:10:35 AM12/11/20
to
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

@Alex

unread,
Dec 11, 2020, 7:14:37 AM12/11/20
to
> > Definire "..foglio di imbroglio.." please
> > 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?
> --
> Ciao
> Karl

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

Ciao Karl
@Alex
0 new messages