Уведомления

Группа в Telegram: @pythonsu

#1 Май 20, 2008 21:44:28

NoN
От:
Зарегистрирован: 2008-04-28
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль ctypes

Допустим есть dll скомпилированная, вот ее код

#include "stdafx.h"
#include "windows.h"



int aas(
{

MessageBoxA(0,"buf","sdf",0);
return 0;
}
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
return TRUE;
}
Как вызвать с помощь модуля ctypes функцию aas()?

Пробывал так:
import ctypes
lib=ctypes.windll.LoadLibrary('name.dll')
print lib
lib.aas()
выдает:
<WinDLL ‘name.dll’, handle d90000 at b17ff0>
а дальше ошибку
Traceback (most recent call last):
File "dll.py", line 4, in <module>
lib.aas()
File "M:\python\Lib\ctypes\__init__.py", line 361, in __getattr__
func = self.__getitem__(name)
File "M:\python\Lib\ctypes\__init__.py", line 366, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'aas' not found



Отредактировано (Май 20, 2008 21:45:28)

Офлайн

#2 Май 20, 2008 22:49:44

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль ctypes

Я правда Си плохо помню, но не может ли это быть связано с отсуствием аргументов?



Офлайн

#3 Май 21, 2008 05:46:44

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Модуль ctypes

Я тоже плохо помню С, но разве функция не должна как-то помечатся как экспортируемая?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Май 21, 2008 06:39:28

NoN
От:
Зарегистрирован: 2008-04-28
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль ctypes

shiza
Я правда Си плохо помню, но не может ли это быть связано с отсуствием аргументов?
не. вывод должен быть примерно таким
<_FuncPtr object at 0x0097DAF8>



Офлайн

#5 Май 21, 2008 06:41:34

NoN
От:
Зарегистрирован: 2008-04-28
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль ctypes

PooH
Я тоже плохо помню С, но разве функция не должна как-то помечатся как экспортируемая?
Точно, попробую исправить



Офлайн

#6 Май 21, 2008 06:58:59

NoN
От:
Зарегистрирован: 2008-04-28
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль ctypes

В dll перед функцией aas добавил __declspec(dllexport), заработало.
Только из из скрипа функция по имени не вызывается почему то, а вызывается так lib

не работает

import ctypes
lib=ctypes.windll.LoadLibrary('name.dll')
lib.aas()
работает
import ctypes
lib=ctypes.windll.LoadLibrary('name.dll')
lib[1]



Отредактировано (Май 21, 2008 07:00:33)

Офлайн

#7 Май 21, 2008 10:44:17

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Модуль ctypes

У меня сейчас нет под рукой windows, чтобы попробовать, тем не менее похоже проблема в вашей DLL. Это точно C? помнится С++ добавляет символы подчеркивания перед именами и надо использовать __cdecl



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Май 21, 2008 10:49:59)

Офлайн

#8 Май 21, 2008 12:55:21

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Модуль ctypes

Да. Это - mangling имен. И если файл назывался blahblah.cpp - то это С++ а не С. Имена кодируются по другому. В С - подчеркивание вначале, в С++ - довольно сложная схема. Проще всего увидеть просто открыв файл и поискав aas. Все слово будет именем - с цифрами и значками. Еще можно написать extern “C” __declspec(dllexport) void aas(); - форсирует использование С стиля.
PooH
__cdecl служит немножко не для того. Он определяет процедуру передачи параметров и получения ответа. Конкретно cdecl - параметры ложаться в стек справа налево, результат в eax, вызыватель чистит стек. Добавленное подчеркивание - это мелочь, которая к тому же меняется в зависимости от С/С++.
Есть еще stdcall и fastcall. Без extern “C” указание calling conversion недостаточно.



Офлайн

#9 Май 21, 2008 13:17:40

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Модуль ctypes

Андрей Светлов
PooH
__cdecl служит немножко не для того.
Ну я же говорил, что плохо помню. Тем не менее источник ошибки то указал верно ;)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#10 Май 21, 2008 17:03:32

NoN
От:
Зарегистрирован: 2008-04-28
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль ctypes

Всем спасибо, все получилось.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version