Форум сайта python.su
есть системная ф-ция
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
Офлайн
Py_Usermicrosoft. GetCurrentDirectory
как правильно описать LPTSTR ?
>>> import ctypes >>> >>> ctypes.create_unicode_buffer <function create_unicode_buffer at 0xb7453854> >>> ctypes.create_string_buffer <function create_string_buffer at 0xb7453614> >>>
Отредактировано py.user.next (Янв. 21, 2017 14:55:31)
Офлайн
наверное я не совсем правильно выразился - что из себя представляет 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Ты должен подать туда буфер, куда будет записан ответ, а ты подаёш какую-то ерунду.
вопрос как описать это на Python
Py_UserВот это ерунда. Ты не можешь ничего записать в buf после его создания, потому что он константный, он только для чтения подходит.buf=ctypes.c_char*256 buf='\000'*256 # lpBuffer
Py_UserВ ctypes есть функции для создания буферов, в которые можно писать. Такой буфер надо создать, а потом подавать в функцию. И выше я тебе привёл обе эти функции, а ты что-то не догоняешь.
но ответа на свой вопрос не нашел
Офлайн
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)
Офлайн