2016-11-17 16 views
1

Я пытаюсь загрузить локализованные титры кнопок в Access 2016 x64, которые находятся в user32.dll.Доступ к x64 VBA - Получение ERROR_RESOURCE_DATA_NOT_FOUND при попытке загрузить строку из user32.dll

Странная вещь, на другой машине с установленным Access 2010 x86, код работает отлично.

Код следующее:

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 

Я не могу управлять, чтобы попасть в, если блок, это как он не находит stringtable.
Детальная ошибка:

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

Я фактически открыл user32.dll с помощью ResourceViewer .NET, и я нашел их все, так что это довольно странно. –

+0

Исправлено, LoadLibrary должен возвращать LongPtr, а не Long. –

ответ

1

LoadLibrary должен возвращать LongPtr вместо Long.
Таким образом, ByVal hInstance As LongPtr вместо ByVal hInstance As Long
и, наконец, Dim Instance As LongPtr вместо Dim Instance As Long.
Надеюсь, что это поможет кому-нибудь!