2017-09-26 15 views
0

Windows 32ビットでvbaコードを使用しました。今度はWindows 10 64ビットに移行しました。「このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります。Declareステートメントを確認して更新し、PtrSafe属性でマークしてください。私が持って宣言コマンドは次のとおりです。Win64 VBAオフィスのDeclareステートメント

Public Declare Function GetUserNameEx Lib "Secur32.dll" Alias "GetUserNameExA" (_ 
    ByVal NameFormat As EXTENDED_NAME_FORMAT, _ 
    ByVal lpNameBuffer As String, _ 
    ByRef lpnSize As Long) As Long 

Public Enum EXTENDED_NAME_FORMAT 
    NameUnknown = 0 
    NameFullyQualifiedDN = 1 
    NameSamCompatible = 2 
    NameDisplay = 3 
    NameUniqueId = 6 
    NameCanonical = 7 
    NameUserPrincipal = 8 
    NameCanonicalEx = 9 
    NameServicePrincipal = 10 
    NameDnsDomain = 12 
End Enum 

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

Private 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 

Public Declare Function ShellExecute _ 
    Lib "shell32.dll" _ 
    Alias "ShellExecuteA" (_ 
    ByVal hwnd As Long, _ 
    ByVal lpOperation As String, _ 
    ByVal lpFile As String, _ 
    ByVal lpParameters As String, _ 
    ByVal lpDirectory As String, _ 
    ByVal nShowCmd As Long) _ 
    As Long 

私はいくつかのドキュメントを見てきましたが、LONGLONGとLongPtrステートメントを使用しているとき、私は本当に理解することはできません。あるいは、DeclareステートメントでPtrSafeだけを宣言している場合です。 Microsoftのマニュアルを

リンク https://msdn.microsoft.com/en-us/library/office/ee691831(v=office.14).aspx

誰かが私を助けることができますか?

+0

データ型がポインタまたは(例えばハンドル)ポインタのサイズのデータ​​型を表すために必要があるときあなたは 'LongPtr'を使用しています。 'LongLong'は、ポインタの大きさにかかわらず常に64ビットの64ビット整数が必要なときに使います。使用している関数と構造体の元のC++シグネチャをMSDNで検索するには、https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspxを参照してください。どのプラットフォームが「PVOID」になっているのかを知るか、プラットフォームによってサイズが異なる「#if」を持ち、それらは「LongPtr」になります。 – GSerg

答えて

0


GetUserNameEx 64ビット/ 64ビット

Public Enum EXTENDED_NAME_FORMAT 
    NameUnknown = 0 
    NameFullyQualifiedDN = 1 
    NameSamCompatible = 2 
    NameDisplay = 3 
    NameUniqueId = 6 
    NameCanonical = 7 
    NameUserPrincipal = 8 
    NameCanonicalEx = 9 
    NameServicePrincipal = 10 
    NameDnsDomain = 12 
End Enum 

#If VBA7 Then 
    Public Declare PtrSafe Function GetUserNameEx Lib "Secur32.dll" Alias "GetUserNameExA" (ByVal NameFormat As EXTENDED_NAME_FORMAT, ByVal lpNameBuffer As String, ByRef lpnSize As Long) As Long 
#Else 
    Public Declare Function GetUserNameEx Lib "Secur32.dll" Alias "GetUserNameExA" (ByVal NameFormat As EXTENDED_NAME_FORMAT, ByVal lpNameBuffer As String, ByRef lpnSize As Long) As Long 
#End If 

GetOpenFileName関数 64ビット/ 64ビット

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 LongPtr 
     lpfnHook As LongPtr 
     lpTemplateName As String 
'#if (_WIN32_WINNT >= 0x0500) 
     pvReserved As LongPtr 
     dwReserved As Long 
     FlagsEx As Long 
'#endif // (_WIN32_WINNT >= 0x0500) 
End Type 

#If VBA7 Then 
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long 
#Else 
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long 
#End If 
これらの(未テスト)でそれらを交換してください

のShellExecute 64ビット/ 64ビット

#If VBA7 Then 
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr 
#Else 
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 
#End If 
+0

私はあなたの 'ロング'のいくつかがVBA 7のために 'LongPtr'であるべきだと信じています。私はこれらの機能すべてに精通していません。 –

+0

ポール・ビカさんに感謝します。それがうまくいくかどうかはまだわかりません。私は、RecordCountを処理するすべてのLong変数をLongLongに変更する必要があることを認識しています。だから私はあなたのソリューションが動作するかどうか実際にテストすることはできません。最初に私はすべての私の長い変数を変換する必要があり、多くがあります。 –

+1

'Function ShellExecute ...(ByVal hwnd As LongPtr、...)LongPtr'として、そうでないと正しいと思います。 – GSerg

0

それだけの数であるとき、それはメモリアドレスとロングに関係するときは、LongPtrを使用しています。宣言でLongPtrを使用するたびにPtrSafeをインクルードします。 だからあなたのShellExecute宣言は(テスト)次のようになります。

#If VBA7 Then 
Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (_ 
     ByVal hWnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _ 
     ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr 
#Else 
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ 
    (ByVal hWnd As Long, ByVal lpOperation As String, _ 
    ByVal lpFile As String, ByVal lpParameters As String, _ 
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 
#End If 
+0

'メモリアドレスに関係するとき' - いいえ、ポインタサイズのものに関係するときです。これには、OSハンドル(メモリアドレスではない)が含まれます。 – GSerg

+0

ポインタサイズのものがあれば、そこにメモリアドレスが入る必要があるからです。しばしば1つのハンドルのように。 – itsLex

関連する問題