システムwiki

64ビットシステムで使用するためにms-accessApplicationを更新します

Jake104 受付中 最終更新日:2022-01-03 17:21

古いAccessApplicationがあります.32ビットOSを参照するステートメントがいくつかあります:

関数ShellExecuteLib "shell32.dll"エイリアスを宣言します_

"ShellExecuteA"(ByVal Hwnd As Long、ByVal lpOperation _

As String、ByVal lpFile As String、ByVal lpParameters _

As String、ByVal lpDirectory As String、ByVal nShowCmd _

限り)限り

関数apiGetcomputerNameLib "kernel32"エイリアスを宣言します_

"GetcomputerNameA"(ByVal lpBuffer As String、nSize As Long)As Long

関数apiGetUserNameLib "advapi32.dll"エイリアスを宣言します_

"GetUserNameA"(ByVal lpBuffer As String、nSize As Long)As Long

パブリック宣言関数GetOpenFileNameLib "comdlg32.dll"エイリアス_

"GetOpenFileNameA"(pOpenfilename As OPENFILENAME)As Long

' 特別なフォルダのITEMIDLIST構造へのポインタを取得します.

プライベート宣言関数apiSHGetSpecialFolderLocationLib "shell32" _

エイリアス "SHGetSpecialFolderLocation" _

(ByVal hwndOwner As Long、_

ByVal nFolder As Long、_

ppidl As Long)_

長い間

' アイテム識別子リストをファイルシステムパスに変換します.

プライベート宣言関数apiSHGetPathFromIDListLib "shell32" _

エイリアス "SHGetPathFromIDList" _

(pidl As Long、_

ByVal pszPath As String)_

長い間

' の呼び出しによって以前に割り当てられたタスクメモリのブロックを解放します

' CoTaskMemAllocまたはCoTaskMemRealloc関数.

プライベート宣言サブsapiCoTaskMemFreeLib "ole32" _

エイリアス "CoTaskMemFree" _

(ByVal pv As Long)

今、私はWin10を搭載した新しいPCで実行しようとしていますが、次のメッセージで失敗します:

「このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります.Declareステートメントを確認して更新してから、PtrSafe属性でマークしてください.」

私はそれをWin10で実行していました-同じversion20H2とOSBuild19042.1052 ...しかし今は新しいPCでは動作しません.

また、Excelスプレッドシートがこのコードで失敗しています(上記と同じメッセージが表示されます):

プライベート宣言関数GetTimeLib "Winmm.dll"エイリアス "timeGetTime"()As Long

同じレベルのOSで失敗するのはなぜですか?

ここで何をすべきかについて何か提案はありますか?

返信リスト(回答:10)

4 #
Scottge

File APIを使用する代わりに、FileDialogプロパティを使用することを検討してください.FileDialogプロパティがAccessVBAに追加され、ファイルの検索と選択におけるAPIの必要性が置き換えられました.

応答4# ->にスキップ
3 #
Jake104

こんにちはスコット、

私はそれを検討しますが、私の最初の怠惰なアプローチは、既存の宣言を修正するだけでよいという希望に基づいていました.そうすれば、API関数の実際の使用法とコンテキストを調査しなくても機能します.

ですから、ここからの回答に基づいてそれを行うことができれば、はるかに簡単になります...

しかし、FileDialogオブジェクトは間違いなく新しいプログラミングを進める方法であることがわかります.

ジェイク

応答3# ->にスキップ
2 #
DanielP

おそらく列挙型を64ビットに更新する必要があります.

次に、プロシージャの入力引数が変更された変数宣言を更新する必要があります.

応答2# ->にスキップ
1 #
Jake104

わかっています.

しかし、私はずさんな解決策を選び、このロジックを必要とする特定の機能を無効にしました.とにかくこれを使用しないので、損失ではありません.

6 #
MiaZhao

こんにちは、

お気軽に投稿してください.

よろしくお願いいたします.

ミア

応答6# ->にスキップ
5 #
Jake104

これまでのところ、Excel-VBAのみを更新しており、32ビットと64ビットの両方のExcelで動作します.

Accessの変更はまもなく行います...

ジェイク

8 #
DanielP

OS(Windows 10)が原因で失敗しているのではなく、Officeのビットネスが原因で失敗しています.

以前はOffice...32ビットを実行していましたが、現在はOffice 36564ビットを実行しています. したがって、32ビットから64ビットのOfficeに移行しました.これには、すべてのAPI宣言を変更したり、ActiveXコントロールを変更したりする必要があります...

問題は、Officeがデフォルトで64ビットインストールになっていることです. インストーラーは選択肢さえ提供しません. ただし、Microsoftアカウントポータルから32ビットversionを簡単にインストールできます.を参照してください. https://support.Microsoft.com/ja-jp/Office/download-and-install-or-reinstall-Microsoft-365-or-Office-2019-on-a-pc-or-mac-4414eaaf-0478-48be-9c42-23adc4716658#installsteps= pc_step-by-step

したがって、選択はあなた次第です.必要なコード、ActiveXコントロールなどを更新するか、Officeを32ビットに切り替えて、以前と同じように動作し続けるようにします.

9 #
HansVMV

どうやら、新しいPCには64ビットのMicrosoft 365があり、もう一方のPCには32ビットがあります(どちらも64ビットのWindows 10を実行しています)

両方で機能するはずの変更されたコードは次のとおりです.

一部のデータ型の変更された定義を含めました.

プライベート宣言PtrSafe関数ShellExecuteLib "shell32.dll"エイリアス "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
PtrSafe関数apiGetcomputerNameLib "kernel32"エイリアスを宣言します_
"GetcomputerNameA"(ByVal lpBuffer As String、nSize As Long)As Long
PtrSafe関数apiGetUserNameLib "advapi32.dll"エイリアスを宣言します_
"GetUserNameA"(ByVal lpBuffer As String、nSize As Long)As Long
パブリック宣言PtrSafe関数GetOpenFileNameLib "comdlg32.dll"エイリアス_
"GetOpenFileNameA"(pOpenfilename As OPENFILENAME)As Long
パブリックタイプ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
フラグAsLong
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As LongPtr
lpfnHook As LongPtr
lpTemplateName As String
終了タイプ
'特別なフォルダのITEMIDLIST構造へのポインタを取得します.
プライベート宣言PtrSafe関数SHGetSpecialFolderLocationLib _
"shell32.dll"(ByVal hwndOwner As LongPtr、ByVal nFolder As Long、pidl As ITEMIDLIST)As LongPtr
プライベートタイプSHITEMID
cb As LongPtr
abID As Byte
終了タイプ
プライベートタイプITEMIDLIST
mkid As SHITEMID
終了タイプ
'アイテム識別子リストをファイルシステムパスに変換します.
プライベート宣言PtrSafe関数SHGetPathFromIDListLib "shell32.dll"エイリアス "SHGetPathFromIDListA" _
(ByVal pidl As LongPtr、ByVal pszPath As String)As Boolean
'への呼び出しによって以前に割り当てられたタスクメモリのブロックを解放します
プライベート宣言PtrSafeSub sapiCoTaskMemFree Lib "ole32.dll" _
エイリアス "CoTaskMemFree(ByVal pv As LongPtr)

10 #
Scottge

これは十分に文書化されています.宣言関数にPTRSAFEを追加する必要があります.つまり

PTRSAFE関数を宣言する

また、関数内の変数decalresはLongからPtrLongに変更する必要があります

見る PtrSafeキーワード(VBA)| Microsoft Docs

応答10# ->にスキップ
7 #
TomvanS

@Scott:「任意の変数」ではなく、ポインター(文字列へのポインターではない)とハンドルのみ.

たとえば、nSize引数はそのままです:

PtrSafe関数GetModuleFileNameLib "kernel32" Alias "GetModuleFileNameA"(ByVal hModule As LongPtr、ByVal lpFileName As String、ByVal nSize As Long)As Long

を宣言します.

これは便利なリファレンスです. このリンク:ja-jp/download/details.aspx?id= 9970