On Aug 28, 12:01 am, taghi <[EMAIL PROTECTED]> wrote: > I want to call NetShareEnum, a function from netapi32.dll > NetShareEnum has this definition: > > NET_API_STATUS NetShareEnum( > __in LPWSTR servername, > __in DWORD level, > __out LPBYTE *bufptr, > __in DWORD prefmaxlen, > __out LPDWORD entriesread, > __out LPDWORD totalentries, > __inout LPDWORD resume_handle > ); > > I wrote this code in python 2.5: > > from ctypes import * > > cname=c_wchar_p('a-computer-name') > level=c_int(1) > bufptr=create_string_buffer('\00', 10000) > prefmaxlen=c_int(9999) > entriesread=c_long(0) > totalentries=c_long(0) > resume=c_long(0) > > netapi32=cdll.LoadLibrary('netapi32.dll') > netapi32.NetShareEnum(cname, level, byref(bufptr), prefmaxlen, > byref(entriesread), byref(totalentries), byref(resume)) > > but I get this error: > Traceback (most recent call last): > File "<pyshell#12>", line 1, in <module> > s.NetShareEnum(name, level, byref(bufptr), prefmaxlen, > entriesread, totalentries, resume) > ValueError: Procedure called with not enough arguments (28 bytes > missing) or wrong calling convention > > entriesread and totalentries has valid values after call but bufptr is > not. > I pass bufptr to function instead of byref(bufptr) but the error was > same.
Taghi, I just learned how to do this myself. I tested this revision on WinXP Python 2.5. from ctypes import * netapi32= cdll.LoadLibrary( 'netapi32.dll' ) cname=c_wchar_p('[mycompname]') level=c_int(1) #bufptr=create_string_buffer('\00', 10000) bufptr=c_void_p(0) prefmaxlen=c_int(9999) entriesread=c_long(0) totalentries=c_long(0) resume=c_long(0) prototype= WINFUNCTYPE( c_int, c_wchar_p, c_int, POINTER( c_void_p ), c_int, POINTER( c_long ), POINTER( c_long ), POINTER( c_long ) ) NetShareEnum= prototype( ( "NetShareEnum", netapi32 ) ) result= NetShareEnum(cname, level, pointer(bufptr), prefmaxlen, byref(entriesread), byref(totalentries), byref(resume) ) print result print cname, level, bufptr, prefmaxlen, entriesread, totalentries, resume The 'bufptr' parameter receives a pointer to a buffer on return, which you then have to free using NetApiBufferFree. Here is my output: 0 c_wchar_p(u'[mycompname]') c_long(1) c_void_p(2382504) c_long(9999) c_long(2) c_l ong(2) c_long(0) 'bufptr' now points to an array of SHARE_INFO_1 structures, which you will have to define too. It copied 2/2 entries, or 'entriesread' / 'totalentries'. Return 0 indicates success. -- http://mail.python.org/mailman/listinfo/python-list