Condividi tramite

Da 64-bit a 32-bit.

Anonimo
2018-08-24T16:00:59+00:00

Inizialmente avevo il codice vba 32-bit ma poi decisi di modificarlo per funzionare col sistema 64-bit.

Mi funziona non ci sono problemi ma vorrei riottenere il codice vba per il funzionamento a 32-bit per ottenere compatibilità con vecchi sistemi.

\\

Declare PtrSafe Function sndPlaySound32 Lib "WINMM.DLL" Alias "sndPlaySoundA" _

(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

///

Ricordo di aver modificato "Ptrsafe" ma non ricordo cosa era scritto in precedenza.

Domandone è possibile creare una condizione di scelta?

Se possiedi Excel 32 bit utilizza la dichiarazione (32-bit) else dichiarazione 64-bit, in questo modo otterrei compatibilità.

\\

Ho trovato questo ma credo riguardi se Win 32 o 64 io vorrei che riconoscesse la versione di Excel.

Comunque da questo esempio credo di aver capito che basta togliere Ptrsafe.  ma per capire la versione di Excel(32-64)?

#If Win64 Then

    Private Declare PtrSafe Function SHFileOperation Lib "shell32.dll" Alias _

        "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

#Else

    Private Declare Function SHFileOperation Lib "shell32.dll" Alias _

        "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

#End If

///

\\

Ho provato con

Declare Function sndPlaySound32 Lib "WINMM.DLL" Alias "sndPlaySoundA" _

(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Ma segna tutto in rosso e mi chiede di mettere ptrsafe per 64bit, lo chiede perché riconosce la mia versione e da errore ma in quella 32bit sarebbe giusta?

///

Microsoft 365 e Office | Excel | 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

Anonimo
2018-08-24T18:43:39+00:00

Ho riletto più volte le tue risposte ma questo codice non l'ho trovato?!… mi potresti incollare la tua risposta che dici era uguale in modo da confermare (Risolto).

#If VBA7 Then 'riga dichiarata in caso di office a 64bit

Declare PtrSafe Function sndPlaySound32 Lib "WINMM.DLL" Alias "sndPlaySoundA" _

(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long ' senza Ptr

#Else

Declare PtrSafe Function sndPlaySound32 Lib "WINMM.DLL" Alias "sndPlaySoundA" _

(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

#End If

Ti ho dato esempi dell'uso delle costanti  di compilazione condizionale # If Win 64 e # If VBA7 e ho dato un  esempio dell'uso delle due costanti in congiunto. Ti ho anche indicato la corretta sintassi per la funzione sndPlaySound32in un ambiente 32 bit per VBA6 - o, come dicevi tu:

ma vorrei riottenere il codice vba per il funzionamento a 32-bit per ottenere compatibilità con vecchi sistemi.

Ho anche indicato che in questo modo la funzione API funzione senza alcun problema.

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-08-24T17:48:39+00:00

Ciao #F ,

Vengo da questa guida e non leggendo inglese anche col traduttore sono in difficoltà.

Questo codice è utile da prendere in esempio? O serve per riconoscere Win? Io vorrei che la condizione sia tramite riconoscimento della versione di Excel.

#If Win64 Then

    Private Declare PtrSafe Function Lib "shell32.dll" Alias _

        "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

#Else

    Private Declare Function SHFileOperation Lib "shell32.dll" Alias _

        "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

#End If

\\

Oppure la soluzione è modificare PTRSAFE con LONGPTR ? No provato non funziona!

///

Sto cercando in internet ma non trovo nulla!

Vedo che, forse nella luce della mia risposta, hai modificato la tua domanda originale e ha aumentato sostanzialmente il suo ambito!

Comunque, il suggerimento offerto da me funzione senza alcun problema per me. Io l'ho provato così:

'=========>>

Option Explicit

Public Declare Function sndPlaySound32 _

                         Lib "winmm.dll" _

                             Alias "sndPlaySoundA" ( _

                             ByVal lpszSoundName As String, _

                             ByVal uFlags As Long) As Long

'--------->>

Public Sub Tester()

    sndPlaySound32 "C:\Windows\Media\Chimes.wav", 0&

    sndPlaySound32 "C:\Program Files\OpenOffice 4" _

                   & "share\gallery\sounds\Applause.wav", 0&

End Sub

'<<=========

Per utilizzare questa funzione API sia nell'ambiente 32 bit che 64 bit, il mio codice di prova diventerebbe:

'=========>>

Option Explicit

#If Win64 Then

    Public Declare PtrSafe Function sndPlaySound32 _

    Lib "winmm.dll" _

    Alias "sndPlaySoundA" _

           (ByVal lpszSoundName As String, _

           ByVal uFlags As Long) As Long

#Else

    Public Declare Function sndPlaySound32 _

                         Lib "winmm.dll" _

                             Alias "sndPlaySoundA" _

                             (ByVal lpszSoundName As String, _

                             ByVal uFlags As Long) As Long

#End If

'--------->>

Public Sub Tester()

    sndPlaySound32 "C:\Windows\Media\Chimes.wav", 0&

    sndPlaySound32 "C:\Program Files\OpenOffice 4" _

                   & "share\gallery\sounds\Applause.wav", 0&

End Sub

'<<=========

Per urtilizzare la funzione API SHFileOperation Lib sia con VB6 (Excel 2007 e versioni precedenti) o VB7 (Excel 2010 +),  prrova una dichiarazione con la compilazione condizionale del seguente genere:

'=========>>

Option Explicit

#If VBA7 Then

Type SHFILEOPSTRUCT

    hWnd As Longptr

    wFunc As Long

    pFrom As String

    pTo As String

    fFlags As Integer

    fAborted As Boolean

    hNameMaps As Longptr

    sProgress As String

End Type

Declare PtrSafe Function SHFileOperation _

        Lib "shell32.dll" _

        Alias "SHFileOperationA" _

        (lpFileOp As SHFILEOPSTRUCT) As LongPtr

#Else

Type SHFILEOPSTRUCT

    hWnd As Long

    wFunc As Long

    pFrom As String

    pTo As String

    fFlags As Integer

    fAborted As Boolean

    hNameMaps As Long

    sProgress As String

End Type

Declare Function SHFileOperation _

                  Lib "shell32.dll" _

                      Alias "SHFileOperationA" _

                      (lpFileOp As SHFILEOPSTRUCT) As Long

#End If

'<<=========

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

12 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2018-08-24T17:21:00+00:00

    Ciao se l'intenzione è condizionare a Excel 32/64 bit il "tag" per riconoscere la versione è VBA7.

    Quindi ad es.

    #If VBA7 Then 'riga dichiarata in caso di office a 64bit

        Private Declare PtrSafe Function SHFileOperation Lib "shell32.dll" Alias _

            "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As LongPtr

    #Else

        Private Declare Function SHFileOperation Lib "shell32.dll" Alias _

            "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

    #End If

    Per quanto riguarda l'utilizzo di LongPtr, da quello che ho capito io, ha senso l'utilizzo se o un argomento della API o il suo risultato in caso di function sia un elemento della memoria in quanto con Excel o win a 64bit i valori restituiti sono superiori ai valori massimi di Long.

    In caso di questa funzione sembrerebbe necessario dichiarare LongPtr

    Vedi questo link dove sono presenti diversi esempi per diverese API (tra le quali quella da te indicata):

    https://www.jkp-ads.com/articles/apideclarations.asp

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-08-24T16:28:37+00:00

    Vengo da questa guida e non leggendo inglese anche col traduttore sono in difficoltà.

    Questo codice è utile da prendere in esempio? O serve per riconoscere Win? Io vorrei che la condizione sia tramite riconoscimento della versione di Excel.

    #If Win64 Then

        Private Declare PtrSafe Function SHFileOperation Lib "shell32.dll" Alias _

            "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

    #Else

        Private Declare Function SHFileOperation Lib "shell32.dll" Alias _

            "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

    #End If


    \\

    Oppure la soluzione è modificare PTRSAFE con LONGPTR ? No provato non funziona!

    ///

    Sto cercando in internet ma non trovo nulla!

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2018-08-24T16:17:09+00:00

    Ciao ,

    Inizialmente avevo il codice vba 32-bit ma poi decisi di modificarlo per funzionare col sistema 64-bit.

    Mi funziona non ci sono problemi ma vorrei riottenere il codice vba per il funzionamento a 32-bit per ottenere compatibilità con vecchi sistemi.

    Declare PtrSafe Function sndPlaySound32 Lib "WINMM.DLL" Alias "sndPlaySoundA" _

    (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

    Ricordo di aver modificato "Ptrsafe" ma non ricordo cosa era scritto in precedenza.

    Grazie!

    Prova:

    Public Declare Function sndPlaySound32 _

        Lib "winmm.dll" _

        Alias "sndPlaySoundA" ( _

            ByVal lpszSoundName As String, _

            ByVal uFlags As Long) As Long

    Nota che sfruttando la complilazione condizionale, si può utilizzare la stessa procedura sia in ambiente 32 bit che 64 bit.. A questo proposito, vedi (in inglese) Qui.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento