Найти - Пользователи
Полная версия: вызов функции из dll
Начало » Python для новичков » вызов функции из dll
1
Py_User
есть системная ф-ция
 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 ?
py.user.next
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
наверное я не совсем правильно выразился - что из себя представляет 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, но ответа на свой вопрос не нашел
py.user.next
Py_User
вопрос как описать это на Python
Ты должен подать туда буфер, куда будет записан ответ, а ты подаёш какую-то ерунду.

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

Py_User
но ответа на свой вопрос не нашел
В ctypes есть функции для создания буферов, в которые можно писать. Такой буфер надо создать, а потом подавать в функцию. И выше я тебе привёл обе эти функции, а ты что-то не догоняешь.
Py_User
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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB