kuttiylajai Ответов: 2

Как с помощью класса C++, экспортируемых из DLL


Привет,
У меня есть логика для разбора файла на c++. Он реализован как класс say logReader.
Чего я пытаюсь добиться, так это экспортировать этот класс из файла и использовать его в Python.
Итак, чтобы создать Dll, я создал 2 функции и экспортировал их из dll.

это выглядит примерно так

#ifndef DLL_EXPORT_IMPORT
#define DLL_EXPORT_IMPORT extern "C" __declspec (dllexport)
#else
#define DLL_EXPORT_IMPORT extern "C" __declspec (dllimport)
#endif

typedef mudpLog*(*fpGetMudp)();
typedef void (*fpDeleteMudp)( LogReader*& pObj);

DLL_EXPORT_IMPORT LogReader* GetLogPtr();
DLL_EXPORT_IMPORT void DeleteLogReader( LogReader*& mudpObj);



и в конце python я использую что-то вроде этого
from ctypes import *;
class Sample(object):
    def __init__(self, object):
        mudp_data = (c_ubyte*32008)();
        self._lib = CDLL(object);
        self._handle = self._lib.GetLogPtr;
=>        self._handle.restype = pointer();  ##Here i done knw what i should give
        self._handle.argtype = None;
=>        self._handle.restype = pointer(); ##Here i done knw what i should give
        print self._handle.Open( "E:\\log_20180406_141933_001.txt" );#

       # self._handle.ReadNext(_data); ## Invoke a function with the class object pointer


lib = Sample("mudp_library.dll");



Есть ли для этого какое-то положение? Я получил так много статей, упоминающих о функциях Си. Я все еще исследую и нашел некоторые другие статьи, такие как BOOST_PYTHON_MODULE & SWIG, Cython.

Что будет лучше всего использовать и есть ли какое-либо другое положение, чтобы сделать то же самое, кроме использования любой из этих оберток.

Что я уже пробовал:

Исследования через интернет и до сих пор продолжаются

2 Ответов

Рейтинг:
1

Rick York

Я не могу точно сказать вам, что нужно Python, но я написал много интерфейсов для использования классов C++ на языке сценариев с помощью вызовов LoadLibrary. То, что я сделал, это обернул все экспортированные функции в это:

extern "C"
{
// exported function implementation goes here
}
и каждая функция имела перед собой тег " __declspec( dllexport )". Это очень хорошо сработало для меня. Я использовал макрос для тега экспорта. Что-то вроде :
#define DLLexport  __declspec(dllexport)
таким образом, функции выглядят следующим образом :
extern "C"
{
DLLexport int MyFunction( ... )
{
}
} // extern C