James Chapman, 13.03.2014 17:35: > 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)
In Cython, that would essentially be cdef extern from "main.h": int add(int a, int b) print(add(1, 2)) It compiles down to C(++), i.e. it interfaces at the API level, not the ABI level, as ctypes would. Stefan _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor