MS Access 2019 (64-разрядный) в Windows 10 (64-разрядный) дает сбой при вызове функции GDIP GetImageGraphicsContext или GdipCreateHBITMAPFromBitmap - PullRequest
0 голосов
/ 20 декабря 2018

MS Access 2019 (64-разрядный) в Windows 10 (64-разрядный) дает сбой при вызове функции GDIP GetImageGraphicsContext или GdipCreateHBITMAPFromBitmap

    Declaration part______________________
GDIP code from:
'-------------------------------------------------
'    Picture functions using GDIPlus-API (GDIP)   |
'-------------------------------------------------
'    *  Office 2003/2007/2010 version  *          |
'-------------------------------------------------
'   (c) mossSOFT / Sascha Trowitzsch rev. 04/2010 |
'-------------------------------------------------
Option Compare Database
Option Explicit
...Private Enum PixelFormat
    PixelFormat1bppIndexed = &H30101
    PixelFormat4bppIndexed = &H30402
    pixelFormat8bppIndexed = &H30803
    PixelFormat16bppGreyScale = &H101004
    PixelFormat16bppRGB555 = &H21005
    PixelFormat16bppRGB565 = &H21006
    PixelFormat16bppARGB1555 = &H61007
    PixelFormat24bppRGB = &H21808
    PixelFormat32bppRGB = &H22009
    PixelFormat32bppARGB = &H26200A
    PixelFormat32bppPARGB = &HE200B
    PixelFormat48bppRGB = &H10300C
    PixelFormat64bppARGB = &H34400D
    PixelFormat64bppPARGB = &H1C400E
    PixelFormatMax = 15 '&HF
End Enum
...

Dim lGraph As Long
Dim lBitmap2 As Long
Dim lBitmap As Long
...
Private Declare PtrSafe Function GdipCreateBitmapFromScan0 Lib "gdiplus" (ByVal Width As Long, ByVal Height As Long, ByVal stride As Long, ByVal PixelFormat As Long, scan0 As Any, bitmap As Long) As Long
Private Declare PtrSafe Function GdipGetImageGraphicsContext Lib "gdiplus" (ByVal Image As Long, graphics As Long) As Long
...

Private Sub Form_Load()
Dim locRet as Long

InitGDIP '-> appaears to work fine

locRet = GdipCreateBitmapFromScan0(CLng(600), CLng(600), 0&, PixelFormat32bppARGB, ByVal 0&, lBitmap2) ' <- Appears to work fine until here (return value = 0)
locRet = GdipGetImageGraphicsContext(lBitmap2, lGraph)   <- MS ACCESS 2019 crashes

или

Private Sub Form_Current()
locRet = GdipCreateHBITMAPFromBitmap(lBitmap2, hBitmap, CLng(BackGrndClr)) ' <- MS ACCESS 2019 crashes here

...

Я пытался использовать разные типы данных для переменной 'lGraph', но при изменении типа данных существует ошибка прекомпилятора из-за несовместимости типов данных, поэтому это не помогло.Кто-нибудь знает, как заставить это работать снова?Под Windows 7 (64-битная, я думаю) и MS Access 2016 32-битная работает нормально, без каких-либо проблем -> я пытаюсь перейти на W10 64-битную и Access 2019 (64-битную).

Accessпроисходит сбой также при вызове функции GdipCreateHBITMAPFromBitmap…

Кажется, что есть систематическая проблема ...

1 Ответ

0 голосов
/ 20 декабря 2018

Если вы хотите, чтобы ваши вызовы API были совместимы с 64-разрядными системами, вам нужно использовать LongPtr везде, где вы передаете указатель.

Шлепание PtrSafe на вашей функции фактически не сделает указатели безопасными, вам нужно сделать это самостоятельно, и это ключевое слово должно указывать, что вы это сделали, и функция безопасна для использования в64-битный.Если вы используете это, не проверяя, что вы изменили все указатели с Long на LongPtr, VBA будет аварийно завершать работу при вызове функции в 64-битном приложении (а в редких случаях вы даже можете дестабилизировать другие приложения).

Насколько я вижу, Graph и bitmap - единственные указатели, используемые в этих функциях, поэтому вам нужно использовать LongPtr при их сохранении и передаче, но мои знания GDIнемного ограничен.

Dim lGraph As LongPtr
Dim lBitmap2 As LongPtr
Dim lBitmap As LongPtr
Private Declare PtrSafe Function GdipCreateBitmapFromScan0 Lib "gdiplus" (ByVal Width As Long, ByVal Height As Long, ByVal stride As Long, ByVal PixelFormat As Long, scan0 As Any, bitmap As Long) As Long
Private Declare PtrSafe Function GdipGetImageGraphicsContext Lib "gdiplus" (ByVal Image As LongPtr, graphics As LongPtr) As Long
...