En Wed, 02 Sep 2009 14:24:10 -0300, Gustavo <gustavotaba...@gmail.com>
escribió:
I'm trying to call WNetGetUniversalNameW via the ctypes module but I'm
only causing the interpreter to crash. Unfortunately I don't have much
experience with the ctypes module and I'm still trying to figure it
out. I've searched for a solution to no avail. My confusion is
centered around the LPVOID buffer parameter and how this should be
created/used. Any help is appreciated.
# DWORD WNetGetUniversalName(
# __in LPCTSTR lpLocalPath,
# __in DWORD dwInfoLevel,
# __out LPVOID lpBuffer,
# __inout LPDWORD lpBufferSize
# );
import ctypes, win32netcon
from ctypes import wintypes
LPDWORD = ctypes.POINTER(wintypes.DWORD)
class UniversalNameInfo(ctypes.Structure):
# note the SINGLE underscores!
_fields_ = [("lpUniversalName", wintypes.LPWSTR)]
PUniversalNameInfo = ctypes.POINTER(UniversalNameInfo)
WNetGetUniversalNameW = ctypes.windll.mpr.WNetGetUniversalNameW
WNetGetUniversalNameW.argtypes = [
wintypes.LPCWSTR,
wintypes.DWORD,
wintypes.LPVOID,
LPDWORD]
path = 'Y:'
level = win32netcon.UNIVERSAL_NAME_INFO_LEVEL
# you must suply your own buffer:
buffer = ctypes.create_unicode_buffer(1024)
buffersize = wintypes.DWORD(ctypes.sizeof(buffer))
ret = WNetGetUniversalNameW(path, level,
ctypes.byref(buffer), ctypes.byref(buffersize))
print ret
# casting to pointer to UniversalNameInfo struct
puni = ctypes.cast(buffer, PUniversalNameInfo)
# dereference the pointer and access its (only) field
print puni.contents.lpUniversalName
--
Gabriel Genellina
--
http://mail.python.org/mailman/listinfo/python-list