469,927 Members | 1,893 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,927 developers. It's quick & easy.

calling NetShareEnum win32api with ctypes

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.
Aug 28 '08 #1
4 2830
On Aug 28, 12:01*am, taghi <eghli...@gmail.comwrote:
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.
Aug 28 '08 #2
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
Aug 28 '08 #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.netapi32

But see my other post re this function in pywin32

TJG
Aug 28 '08 #4
En Thu, 28 Aug 2008 02:01:23 -0300, taghi <eg******@gmail.comescribi�:
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

Aug 28 '08 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by Georgy Pruss | last post: by
5 posts views Thread by Frank Borell | last post: by
reply views Thread by siddharth_jain_1 | last post: by
1 post views Thread by Siddharth Jain | last post: by
reply views Thread by Siddharth Jain | last post: by
1 post views Thread by Siddharth Jain | last post: by
1 post views Thread by Gerald Klix | last post: by
1 post views Thread by moreati | last post: by
1 post views Thread by taghi | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.