Вообще использование dll из Python особой проблемой не является, для этого есть модуль ctypes, который, начиная с Python 2.5, входит в состав этого самого Python’а. Но по какой-то загадочной причине даже вездесущий Google не смог найти примера связки "своя dll" + "своя python программа", а там есть некоторые неочевидные грабли: когда "своя dll" будет подключаться к чему угодно, но Python будет рапортовать:
| ValueError: Procedure called with not enough arguments (N bytes missing) or wrong calling convention
|
Или говорить, что он ваших функций в упор не видит.
Так что, как говорят буддисты, на благо всех живых существ!
sampdll.def (без него Python не увидит наших функций):
| LIBRARY "sampdll"
EXPORTS SomeFunc1 SomeFunc2 SomeFunc3
|
sampdll.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <windows.h>
BOOL APIENTRY DllMain(HMODULE, DWORD, LPVOID) { return TRUE; }
extern "C" __declspec (dllexport) double SomeFunc1(double a) { return a+1.1; }
extern "C" __declspec (dllexport) void SomeFunc2(int& a) { a = a+10; }
extern "C" __declspec (dllexport) void SomeFunc3(int len, int* a) { for ( int i = 0; i < len; i++ ) a[i] += 100; }
|
Вызываем:
| >>> from ctypes import * >>> a = CDLL("C:\sampdll.dll") >>> a <CDLL 'C:\sampdll.dll', handle f10000 at bba990>
|
Функция получает и возвращает double:
| >>> a.SomeFunc1.restype = c_double >>> print "SomeFunc1:", a.SomeFunc1(c_double(1.1)) SomeFunc1: 2.2
|
Функция получает и изменяет переменную по ссылке:
| >>> arg = c_int(10) >>> a.SomeFunc2(byref(arg)) 12230088 >>> print "SomeFunc2:", arg.value SomeFunc2: 20
|
Функция изменяет массив:
| >>> arr_lst = [1,2,3,4,100] >>> arr_type = c_int * len(arr_lst) >>> arr = arr_type(*arr_lst) >>> a.SomeFunc3(len(arr_lst), arr) 5 >>> for i in arr: print i
101 102 103 104 200
|
Про все остальное можно прочитать в документации. Исходники всего что выше тут. Dll собиралась Visual C++ 2005.