| Register | FAQ | Calendar | Search | Today's Posts | Mark Forums Read |
|
#1
| |||
| |||
| 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. |
|
#2
| |||
| |||
| On Aug 28, 12:01*am, taghi <eghli...@gmail.com> 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. |
|
#3
| |||
| |||
| taghi wrote: > I wrote this code in python 2.5: > > from ctypes import * .... snip ... > netapi32=cdll.LoadLibrary('netapi32.dll') This is your problem: netapi32 is a windows DLL and needs to be attached as such: netapi32 = windll.LoadLibrary ("netapi32.dll") or, more simply: netapi32 = windll.net32api But see my other post re this function in pywin32 TJG |
|
#4
| |||
| |||
| taghi wrote: > I wrote this code in python 2.5: > > from ctypes import * .... snip ... > netapi32=cdll.LoadLibrary('netapi32.dll') This is your problem: netapi32 is a windows DLL and needs to be attached as such: netapi32 = windll.LoadLibrary ("netapi32.dll") or, more simply: netapi32 = windll.netapi32 But see my other post re this function in pywin32 TJG |
|
#5
| |||
| |||
| En Thu, 28 Aug 2008 02:01:23 -0300, taghi <eghlim84@gmail.com> escribi�: > I want to call NetShareEnum, a function from netapi32.dll > NetShareEnum has this definition: > [...] > 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 Try with netapi32=windll.netapi32 instead -- Gabriel Genellina |
![]() |
| Thread Tools | |
| Display Modes | |
In an effort to better serve ads to our visitors, cookies are used on objectmix.com. For more information, check out our Privacy Policy.