Python обратный вызов не работает с нарушением доступа - PullRequest
0 голосов
/ 06 мая 2020

Я могу вызывать функции в моей dll из python. Когда я вызываю функцию dll, которая выполняет обратный вызов моего кода python, она не работает. Есть ли какой-то мьютекс, блокирующий мой обратный вызов?

from ctypes import *
import _ctypes

@CFUNCTYPE(None)
def Test():
    print ("Test here")
    return

def SetUpDll():
    print ("Setting read / write callback functions...")
    windll.ClaRUN.AttachThreadToClarion(1)
    MyDll = CDLL('IC2_CommsServer.dll')

    SetTestFunc = getattr(MyDll, "SETTESTFUNC@Fl")
    SetTestFunc (Test)

    CallTestFunc = getattr(MyDll, "CALLTESTFUNC@F")
    CallTestFunc()

    _ctypes.FreeLibrary(MyDll._handle)
    _ctypes.FreeLibrary(windll.ClaRUN._handle)

    print ("Done.")


SetUpDll()

C:\Users\Derek\anaconda3_32\python.exe Z:/ps_IC2_dll/ps_IC2_dll.py
Setting read / write callback functions...
Traceback (most recent call last):
  File "Z:/ps_IC2_dll/ps_IC2_dll.py", line 48, in <module>
    SetUpDll()
  File "Z:/ps_IC2_dll/ps_IC2_dll.py", line 40, in SetUpDll
    CallTestFunc()
OSError: exception: access violation writing 0x009EF77C

Process finished with exit code 1

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Спасибо CristiFati, предоставившей половину ответа.

Этот код теперь работает, обратите внимание, что функции библиотеки Clarion теперь прототипированы как @F ", поэтому код проще.

from ctypes import *
import _ctypes

@CFUNCTYPE(None)
def Test():
    print ("Test here")
    return

def SetUpDll():
    print ("Setting read / write callback functions...  Ptr=", sizeof(c_void_p), "bytes")
    assert sizeof(c_void_p) == 4

    ClaRTL = CDLL('./ClaRUN.dll')
    MyDll = CDLL('./IC2_CommsServer.dll')

    ClaRTL.AttachThreadToClarion.restype = None
    ClaRTL.AttachThreadToClarion.argtypes = [c_int32]
    ClaRTL.AttachThreadToClarion(1)

    MyDll.SETTESTFUNC.restype = None
    MyDll.SETTESTFUNC.argtypes = [CFUNCTYPE(None)]
    MyDll.SETTESTFUNC (Test)

    MyDll.CALLTESTFUNC.restype = None
    MyDll.CALLTESTFUNC ()

    _ctypes.FreeLibrary(MyDll._handle)
    _ctypes.FreeLibrary(ClaRTL._handle)

    print ("Done.")


SetUpDll()

Теперь вывод:

C:\Users\Derek\AppData\Local\Programs\Python\Python38-32\python.exe Z:/ps_IC2_dll/ps_IC2_dll.py
Setting read / write callback functions...  Ptr= 4 bytes
Test here
Done.

Process finished with exit code 0
0 голосов
/ 06 мая 2020

Во-первых, на Windows ctypes использует структурированную обработку исключений win32 для предотвращения сбоев из-за общих сбоев защиты, когда функции вызываются с недопустимыми значениями аргументов.

У вас плохой вызов для этой строки кода:

CallTestFunc = getattr(MyDll, "CALLTESTFUNC@F")

Попробуйте просмотреть свой код, а затем посмотрите, не связана ли проблема с ps_IC2_dll.py областью сборки.

...