[Tutor] c++ on python

James Chapman james at uplinkzero.com
Thu Mar 13 17:35:17 CET 2014


Perhaps I should look into Cython as I'm currently working on a
project that utilises a C API.

I've been finding that getting the data types to be exactly what the C
API is expecting to be the hardest part.

With the original question in mind, here's an example calling into a
C++ external C API:

(Works if compiled is VisualStudio. The DLL produced by MinGW-G++ didn't work).

-------------------------------
// main.h

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

#define DLL_EXPORT __declspec(dllexport)

#ifdef __cplusplus
extern "C"
{
#endif

    int DLL_EXPORT add(int a, int b);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__
-------------------------------

-------------------------------
//main.cpp

#include "main.h"

// a sample exported function
int DLL_EXPORT add(int a, int b)
{
    return(a + b);
}

extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD
fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}
-------------------------------

-------------------------------
# -*- coding: utf-8 -*-
# dll.py

import ctypes


class DllInterface(object):

    dll_handle = None

    def __init__(self, dll_file):
        self.dll_handle = ctypes.WinDLL(dll_file)

    def add_a_and_b(self, a=0, b=0):
        return self.dll_handle.add(a, b)


if __name__ == '__main__':
    dll_file = 'PythonDLL.dll'
    external_lib = DllInterface(dll_file)
    int_a = ctypes.c_int(1)
    int_b = ctypes.c_int(2)
    result = external_lib.add_a_and_b(int_a, int_b)
    print(result)

-------------------------------
--
James
--
James


On 13 March 2014 15:57, Stefan Behnel <stefan_ml at behnel.de> wrote:
> Alan Gauld, 12.03.2014 23:05:
>> On 12/03/14 16:49, Stefan Behnel wrote:
>>> Alan Gauld, 12.03.2014 10:11:
>>>> If it were a library then you would have to call
>>>> the individual C++ functions directly using
>>>> something like ctypes, which is usually more
>>>> complex.
>>>
>>> ctypes won't talk to C++, but Cython can do it quite easily.
>>
>> I thought it would work provided the interface functions
>> were declared as C functions? That might involve
>> writing a wrapper around it but that is usually
>> trivial if you have to compile the source anyway.
>
> The thing is: if you have to write your own wrapper anyway (trivial or
> not), then why not write it in Cython right away and avoid the intermediate
> plain C level?
>
> It's usually much nicer to work with object oriented code on both sides
> (assuming you understand the languages on both sides), than to try to
> squeeze them through a C-ish API bottleneck in the middle.
>
> Stefan
>
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor


More information about the Tutor mailing list