Использование dll из Python

Май 13, 2007, 14:19

Вообще использование 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.

blog comments powered by Disqus
Сергей Лымарь © 2005-2011, Все права защищены. Сайт реализован на языке Haskell