Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 21, 2017 11:30:39

Py_User
Зарегистрирован: 2016-12-16
Сообщения: 15
Репутация: +  1  -
Профиль   Отправить e-mail  

вызов функции из dll

есть системная ф-ция

 DWORD GetCurrentDirectory(
    DWORD nBufferLength,	// size, in characters, of directory buffer 
    LPTSTR lpBuffer 	// address of buffer for current directory 
   );
готовим параметры
 import ctypes
hdll=ctypes.cdll.LoadLibrary('kernel32.dll')
cnt=ctypes.c_long(256) # nBufferLength
buf=ctypes.c_char*256
buf='\000'*256 # lpBuffer 
как правильно описать LPTSTR ?

Офлайн

#2 Янв. 21, 2017 14:53:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

вызов функции из dll

Py_User
как правильно описать LPTSTR ?
microsoft. GetCurrentDirectory
microsoft. data types
microsoft. string types

LPTSTR:
LP - указатель, равный размеру long int
T - unicode или char в зависимости от наличия символической константы UNICODE
STR - нуль-терминированная строка

Главное, что эта строка должна быть доступна на запись, в то время как обычные строки в питоне константные.

  
>>> import ctypes
>>> 
>>> ctypes.create_unicode_buffer
<function create_unicode_buffer at 0xb7453854>
>>> ctypes.create_string_buffer
<function create_string_buffer at 0xb7453614>
>>>

Запусти help() к этим функциям - увидишь, как их использовать.



Отредактировано py.user.next (Янв. 21, 2017 14:55:31)

Офлайн

#3 Янв. 21, 2017 16:15:28

Py_User
Зарегистрирован: 2016-12-16
Сообщения: 15
Репутация: +  1  -
Профиль   Отправить e-mail  

вызов функции из dll

наверное я не совсем правильно выразился - что из себя представляет LPTSTR я знаю, и вызвать GetCurrentDirectory из С или VB не проблема - вопрос как описать это на Python. Вызов в Python_e заканчивается ошибкой.

 >>> n=ctypes.c_long(hdll.GetCurrentDirectoryA(cnt,ctypes.POINTER(buf)))
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    n=ctypes.c_long(hdll.GetCurrentDirectoryA(cnt,ctypes.POINTER(buf)))
ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to convert parameter 2
Главное, что эта строка должна быть доступна на запись, в то время как обычные строки в питоне константные.
- возможно я не внимательно смотрел встроенную справку Python, но ответа на свой вопрос не нашел

Офлайн

#4 Янв. 22, 2017 02:40:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

вызов функции из dll

Py_User
вопрос как описать это на Python
Ты должен подать туда буфер, куда будет записан ответ, а ты подаёш какую-то ерунду.

Py_User
  
buf=ctypes.c_char*256
buf='\000'*256 # lpBuffer
Вот это ерунда. Ты не можешь ничего записать в buf после его создания, потому что он константный, он только для чтения подходит.

Py_User
но ответа на свой вопрос не нашел
В ctypes есть функции для создания буферов, в которые можно писать. Такой буфер надо создать, а потом подавать в функцию. И выше я тебе привёл обе эти функции, а ты что-то не догоняешь.



Офлайн

#5 Янв. 22, 2017 11:48:38

Py_User
Зарегистрирован: 2016-12-16
Сообщения: 15
Репутация: +  1  -
Профиль   Отправить e-mail  

вызов функции из dll

2 py.user.next про сreate_unicode_buffer я все понял - спасибо, но ошибка была не только из-за этого. После того, как поменял hdll=ctypes.cdll.LoadLibrary('kernel32.dll') на hdll=ctypes.windll.LoadLibrary('kernel32.dll') - все заработало.

 import ctypes
dll=ctypes.windll.LoadLibrary('kernel32')
buf=ctypes.create_string_buffer(256)
n=dll.GetCurrentDirectoryA(256,buf)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version