c ++ dll, вызываемый из Python

Я должен использовать C ++ dll с помощью MFC, и я бы хотел назвать это из python. Эта DLL содержит этот заголовок в файле .h

LONG CommOpen (порт BYTE, LONG baud_rate);

Затем я вижу в бесплатном программном обеспечении dllexp, что моя функция вызывается? CommOpen @ CFIPcmd @@ QAEJEJ @ Z в двоичном файле, поэтому никаких ошибок не сообщается, когда я делаю в python

импорт ctypes

lib = ctypes.WinDLL ('C: \ Users \ toto \ FIProtocol.dll')

prototype = WINFUNCTYPE (c_long, c_byte, c_long)

testPt = ctypes.WINFUNCTYPE (прототип)

testApi = testPt ((«? CommOpen @ CFIPcmd @@ QAEJEJ @ Z», lib))

Пока там это работает, но тогда я хотел бы назвать в Python эквивалент в C ++

Long l = CommOpen (5, 115200);

Но я не знал, как действовать. Любая помощь могла бы быть полезна!!

    2 Solutions collect form web for “c ++ dll, вызываемый из Python”

    Учитывая информацию, представленную в вопросе, решение:

    import ctypes lib = ctypes.CDLL(r'C:\Users\toto\FIProtocol.dll') CommOpen = getattr(lib, "?CommOpen@CFIPcmd@@QAEJEJ@Z") CommOpen.argtypes = [c_byte, c_long] CommOpen.restype = c_long 

    И теперь он готов позвонить:

     l = CommOpen(5 ,115200) 

    Некоторые примечания:

    1. Используйте CDLL а не WinDLL потому что функция использовала cdecl вызове cdecl по умолчанию.
    2. Используйте getattr , чтобы указать искомое имя.
    3. Он всегда платит, чтобы argtypes указать argtypes и restype .

    Однако выясняется, что у вас гораздо большая проблема. Выше было написано на основе того, что ваша функция является функцией, не являющейся членом. Это разумное предположение, учитывая, что ctypes требует, чтобы функции были либо ctypes , либо статическими.

    Однако, когда я помещаю ваше имя управляемой функции в demanger (например, http://pear.warosu.org/c++filtjs/ ), кажется, что функция на самом деле:

     public: long __thiscall CFIPcmd::CommOpen(unsigned char,long) 

    Это функция-член объекта C ++. К ним нельзя получить доступ из ctypes . Вам нужно создать обычную оболочку стиля C или найти другой способ взаимодействия.

    Согласно http://docs.python.org/2/library/ctypes.html#calling-functions «Вы можете вызывать эти функции, как любой другой Python, вызываемый». Я бы предложил запустить интерактивную консоль Python (например, ipython) и проверить ее самостоятельно.

    Ну, я только что установил python в VirtualBox Win32 и проверил пример:

     >>> from ctypes import *
     >>> f = getattr (cdll.msvcrt, "?? 2 @ YAPAXI @ Z")
     >>> f
     <_FuncPtr объект в 0x00B7EDC8>
     >>> f ()
     24969248
     >>> _
    

    Итак, да, вы можете назвать эти функциональные объекты, как любая другая функция в среде python. Как утверждает документация 🙂

    Также работает _cputws:

     >>> cputws = getattr (cdll.msvcrt, "_cputws")
     >>> r = cputws («Hello, World! \ n»)
     Привет мир!
     >>> r
     0
     >>>
    
    Python - лучший язык программирования в мире.