很多人都对 NetShareCheck和NetShareAdd在VC里的使用感到很困惑,按照定义传入参数后,返回值始终是错误的,最常见的就是ret=123,parm_err=8,最近我在做一个小工具时也碰到这两个函数的问题, 一开始查阅了很多资料后都找不到一个所以然的说明,因为NetShareAdd在dephi 中或VB中都没有这些问题,而只有在VC这个比较面向底层的开发工具中才会出现,坛子上搜索的信息也一直没有解决好,起初让人很郁闷。尤其是NetShareCheck这个检查是否共享的函数,很多人都说这个函数是不行的,建议采用NetShareEnum来枚举本机共享,再从共享列表中找出是不是有我们要检查的共享设置,而对于NetShareAdd,一些人采用的方法是直接在注册表中加入共享的方式来解决,不过我就是不信。
代用的方法是可行,但是我还是想搞懂这两个函数的用法,经过查阅多方资料后终于找到了答案,其实问题就在unicode!NetShareCheck和NetShareAdd函数中,字符串参数都是采用unicode编码的,我们在查看参数定义时往往忽略了这一点,找到这个问题的根源,总是也就迎刃而解,只要把传入参数中的字符串信息转换成unicode就可以了。下面写一下这个两个函数的用例吧:
#include
<
atlconv.h
>
//
转换unicode 时要用到宏的头文件
BOOL Share( char * pShareName, char * pSharePath)
... {
USES_CONVERSION;
SHARE_INFO_502 si502;
NET_API_STATUS nas;
LPWSTR pwShareName=A2W(pShareName); //转换成unicode 字符串
LPWSTR pwSharePath=A2W(pSharePath);
si502.shi502_netname = (LPTSTR)pwShareName;
si502.shi502_type = STYPE_DISKTREE;
si502.shi502_remark = NULL;
si502.shi502_permissions = 0;
si502.shi502_max_uses = SHI_USES_UNLIMITED;
si502.shi502_current_uses = 0;
si502.shi502_path = (LPTSTR)pwSharePath;
si502.shi502_passwd = NULL;
si502.shi502_reserved = 0;
si502.shi502_security_descriptor = NULL
nas = NetShareAdd(
NULL, // share is on local machine
502, // info-level
(LPBYTE)&si502, // info-buffer
NULL // don't bother with parm
);
return (nas==0);
}
BOOL Check( char * pSharePath)
... {
USES_CONVERSION;
NET_API_STATUS nas;
LPWSTR pwSharePath=A2W(pSharePath);
nas=NetShareCheck(NULL,(LPTSTR)pwSharePath,NULL);
return (nas==0);
}
BOOL Share( char * pShareName, char * pSharePath)
... {
USES_CONVERSION;
SHARE_INFO_502 si502;
NET_API_STATUS nas;
LPWSTR pwShareName=A2W(pShareName); //转换成unicode 字符串
LPWSTR pwSharePath=A2W(pSharePath);
si502.shi502_netname = (LPTSTR)pwShareName;
si502.shi502_type = STYPE_DISKTREE;
si502.shi502_remark = NULL;
si502.shi502_permissions = 0;
si502.shi502_max_uses = SHI_USES_UNLIMITED;
si502.shi502_current_uses = 0;
si502.shi502_path = (LPTSTR)pwSharePath;
si502.shi502_passwd = NULL;
si502.shi502_reserved = 0;
si502.shi502_security_descriptor = NULL
nas = NetShareAdd(
NULL, // share is on local machine
502, // info-level
(LPBYTE)&si502, // info-buffer
NULL // don't bother with parm
);
return (nas==0);
}
BOOL Check( char * pSharePath)
... {
USES_CONVERSION;
NET_API_STATUS nas;
LPWSTR pwSharePath=A2W(pSharePath);
nas=NetShareCheck(NULL,(LPTSTR)pwSharePath,NULL);
return (nas==0);
}
用了这个转换之后,这个两个函数就很好用了,我把我自己的使用心得写出来,希望对大家都有所帮助。