Condividi tramite

Problema con conversione codice 32bit a 64bit

Anonimo
2017-03-25T10:07:12+00:00

divido da questo 3d:

https://answers.microsoft.com/it-it/msoffice/forum/msoffice\_access-mso\_other/allowbypasskey-property/311bd160-660e-4557-92ee-abeee85bd4fd

Buongiorno a tutti, 

ho modificato un database indicatomi dal moderatore di questa community Sandro, al quale vanno i miei grazie per la sua disponibilità,

che funziona perfettamente, finquando non lo eseguo su un sistema a 64bit.  il codice in oggetto è il seguente:

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _

"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

se lo modifico in questo modo:

Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _

"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Longlong

funziona a 64 bit, ma sia nell'uno che nell'altro caso sono limitato a 32bit o 64bit

per cui documentandomi un po, sono arrivato a questo punto:

if win64 then

Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _

"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Longlong

else

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _

"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

end if

credendo di aver risolto, ma comunque non funziona, anche in fase di compilazione database mi da errore.

Potreste aiutarmi a risolvere il problema?

Ringrazio tutti anticipatamente.

Microsoft 365 e Office | Accesso | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2017-03-25T12:33:40+00:00

    ciao Michele,

    ti sconsigliavo l'invocazione delle Api perché da A2010 in poi con l'introduzione di office a 64bit la loro invocazione che è di suo già molto complicata diventa estremamente complicata.

    Il FileDialog è la soluzione indipendentemente da Office 32 o 64 bit.

    Per sfruttare le Api con office 64 bit non è sempre e solo necessario modificare la dichiarazione, ma spesso e volentieri oltre che a sfruttare la compilazione condizionale per rendere fruibile il database con su più piattaforme devi correttamente dichiarare le variabili.

    L'argomento è molto vasto e complicato, mi fermo qua.

    Se vuoi utilizzare la demo del ns grande Giorgio apporta le seguenti modifiche.

    Estrai la dichiarazione Api impostale in un modulo standard :

    Option Compare Database

    Option Explicit

    #If Win64 Then

        Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

        Public Type OPENFILENAME

          lStructSize As Long

            hwndOwner As LongPtr

            hInstance As LongPtr

            lpstrFilter As String

            lpstrCustomFilter As String

            nMaxCustFilter As Long

            nFilterIndex As Long

            lpstrFile As String

            nMaxFile As Long

            lpstrFileTitle As String

            nMaxFileTitle As Long

            lpstrInitialDir As String

            lpstrTitle As String

            flags As Long

            nFileOffset As Integer

            nFileExtension As Integer

            lpstrDefExt As String

            lCustData As Long

            lpfnHook As LongPtr

            lpTemplateName As String

    End Type

    #Else

        Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

        Public Type OPENFILENAME

            lStructSize As Long

            hwndOwner As Long

            hInstance As Long

            lpstrFilter As String

            lpstrCustomFilter As String

            nMaxCustFilter As Long

            nFilterIndex As Long

            lpstrFile As String

            nMaxFile As Long

            lpstrFileTitle As String

            nMaxFileTitle As Long

            lpstrInitialDir As String

            lpstrTitle As String

            flags As Long

            nFileOffset As Integer

            nFileExtension As Integer

            lpstrDefExt As String

            lCustData As Long

            lpfnHook As Long

            lpTemplateName As String

    End Type

    #End If

    modifica questa parte  nella classe cls_cmdDialog

    #If Win64 Then

            OpenFile.nMaxFile = LenB(OpenFile.lpstrFile) - 1

            OpenFile.lStructSize = LenB(OpenFile)

        #Else

            OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1

            OpenFile.lStructSize = Len(OpenFile)

        #End If

    e questa nella form abilitaDisabilita:

         CmDlg.FiltroFiles = _

        "Database files (*.mdb, *.mde, *.mda, *.accdb)|" & _

         "*.mdb;*.mde;*.mda;*.accdb|"

    ti ho convito è il fileDialog è molto meglio....?

    Ora a scanso di ulteriori problemi di metto a disposizione le modifiche qui.

    Ovviamente ho testato sia su office a 64 bit che a 32 bit da me tutto ok.

    Facci sapere.

    Ciao, Sandro.

    La risposta è stata utile?

    3 persone hanno trovato utile questa risposta.
    0 commenti Nessun commento

2 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-04-02T05:38:23+00:00

    Volevo ringraziare Francesco e  Sandro per avermi aiutato con il mio problema. Tutti e due hanno contribuito ad aggiungere un tassello in più sulla mia conoscenza al VBA.

    Grazie ancora.

    Saluti Michele.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-03-25T10:45:45+00:00

    Prova a leggere qui: http://www.jkp-ads.com/articles/apideclarations.asp

    Occhio ad usare dll a 32 bit, oramai praticamente tutti i PC sono a 64...

    La risposta è stata utile?

    0 commenti Nessun commento