2016-11-17 3 views
1

user32.dllにあるAccess 2016 x64にローカライズされたボタンのキャプションをロードしようとしています。x32 VBAにアクセス - user32.dllから文字列をロードしようとするとERROR_RESOURCE_DATA_NOT_FOUNDを取得する

奇妙なことに、Access 2010 x86がインストールされている別のマシンでは、コードは完全に機能します。彼はSTRINGTABLEを見つけることができませんように私は、もしブロックに入るために管理することはできません

Option Compare Database 
Option Explicit 

Private Declare PtrSafe Function LoadString Lib "user32" Alias "LoadStringA" (_ 
    ByVal hInstance As Long, _ 
    ByVal uID As Long, _ 
    ByVal lpBuffer As String, _ 
    ByVal nBufferMax As Long) _ 
    As Long 

Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (_ 
    ByVal lpFileName As String) _ 
    As Long 

Private Enum CAPTION 
    OK_CAPTION = 800 
    CANCEL_CAPTION = 801 
    ABORT_CAPTION = 802 
    RETRY_CAPTION = 803 
    IGNORE_CAPTION = 804 
    YES_CAPTION = 805 
    NO_CAPTION = 806 
    CLOSE_CAPTION = 807 
    HELP_CAPTION = 808 
    TRYAGAIN_CAPTION = 809 
    CONTINUE_CAPTION = 810 
End Enum 

Private Const lPath As String = "user32.dll" 
Private Const BufferMax As Long = 256 
Private Const cIndex As Long = CAPTION.OK_CAPTION 

Private Sub cmdGetCaptionById_Click() 
    Dim Buffer As String * BufferMax 
    Dim Instance As Long 
    Dim sLen As Long 
    Instance = LoadLibrary(lPath) 
    sLen = LoadString(Instance, cIndex, Buffer, BufferMax) 
    If sLen <> 0 Then 
     Caption = Left(Buffer, sLen) 
     MsgBox Caption, vbInformation 
    Else 
     MsgBox "No caption found, error " & Err.LastDllError, vbCritical 
    End If 
End Sub 

、それはです:

コードは次のようです。
詳細なエラー:

ERROR_RESOURCE_DATA_NOT_FOUND 
1812 (0x714) 
The specified image file did not contain a resource section. 

予想される文字列出力、CINDEXに基づいて(この場合、OK_CAPTIONには、ID = 800を持っている):

Caption = "Ok" 

ヘルプは非常に感謝されます!

+0

あなたはただの事実を述べています。エラーメッセージが示すように、Windowsのそれ以降のバージョンでは、user32.dllにこれらの文字列が存在しなくなりました。これらの実装の詳細に依拠することは常に非常に悪い習慣でしたが、ニワトリは家に帰ってきました。 –

+0

ResourceViewer .NETで実際にuser32.dllを開きました。それらをすべて見つけたので、かなり奇妙です。 –

+0

LoadLibraryはLong型ではなくLongPtrを返すように修正されました。 –

答えて

1

のLoadLibraryロングの代わりにLongPtrを返す必要があります。
したがって、ByVal hInstance As LongPtr代わりにByVal hInstance As Long
、最終的にDim Instance As LongPtr代わりにDim Instance As Long
誰かを助けることを願っています!

関連する問題