我用NetShareGetInfo来获得指定的文件加的目录共享的相应的数据,可是
NetShareGetInfo(nil,PWideChar(Sharpaths),2,@si)这样子取得的数据都位空的也就是说
si.shi2_re
si.shi2_netname
这两个值都是空的,我像问问如何解决,或者能不能告诉我如何使用!
NetShareGetInfo(nil,PWideChar(Sharpaths),2,@si)这样子取得的数据都位空的也就是说
si.shi2_re
si.shi2_netname
这两个值都是空的,我像问问如何解决,或者能不能告诉我如何使用!
Var
P : Pointer;
Info : PSHARE_INFO_2;
dwResult : DWORD;
Begin
NetShareGetInfo( Nil, PWdieChar( SharePath ), 2, P );
If dwResult <> NERR_Success Then Exit;
Info := PSHARE_INFO_2( P );
...
NetApiBufferFree( P );
End;
type
TShare_INFO_2 = record
shi2_netname : PWideChar;
shi2_type : DWORD;
shi2_re : PWideChar;
shi2_permissions : DWORD;
shi2_max_uses : DWORD;
shi2_current_uses : DWORD;
shi2_path : PWideChar;
shi2_passwd : PWideChar;
end;
var
Shareattrstr:widestring;
re,netname:string;
Sharpaths:widestring;
shareAttrresult,shareAttrtemp:string;
i:longint;
si: TShare_INFO_2;
NetShareGetInfo:TNetShareGetInfo;
Fpointer:TfarProc;
begin
Fpointer:=GetProcAddress(hinstDLL,'NetShareGetInfo');
if Fpointer=nil then
raise exception.Create ('GetNetSharInfo not found!');
NetShareGetInfo:=TNetShareGetInfo(Fpointer);
Sharpaths:=Sharepath;
NetShareGetInfo(nil',pwidechar(Sharpaths)',2,@si);
re:=si.shi2_re;
netname:=si.shi2_netname;
showmessage(netname+','+re+','+inttostr(si.shi2_current_uses));
GetShareAttr:=netname+','+re+','+inttostr(si.shi2_current_uses);
end;
这是我的程序,请帮我看看,为什么si.shi2_re的值,还有其它的总是空的,还有一个问题就是用sharenetadd来设目录位共享的时候,把shi2_permissions 设置为read_only的时候系统说read_only没有定义,他不是一个数字型的参数码,怎么回事,我看了一些c++里面用的方法就可以!百思不得其节,请各位高手赐教!
help me please
#include <windows.h>
#include <lm.h>
#pragma hdrstopint main( void );int main( void )
{
//********************************* change these:
wchar_t *pServer = L"\\\\BAR"; // server to run on
wchar_t *pShare = L"CD"; // sharename to query
//********************************* NET_API_STATUS rc; // result code
SHARE_INFO_2 *pSI;
const char *sharetype;
byte *pBuf; pBuf = NULL; // note -- LPTSTR cast needed because of bogus header files
rc = NetShareGetInfo( (LPTSTR) pServer, (LPTSTR) pShare, 2, &pBuf ); if ( ( rc == NERR_Success || rc == ERROR_MORE_DATA ) && pBuf != NULL )
{
pSI = (SHARE_INFO_2 *) pBuf;
switch ( pSI->shi2_type )
{
case STYPE_DISKTREE:
sharetype = "disk";
break;
case STYPE_PRINTQ:
sharetype = "print queue";
break;
case STYPE_DEVICE:
sharetype = "comms queue";
break;
case STYPE_IPC:
sharetype = "IPC";
break;
default:
sharetype = "unknown";
break;
}
printf( "Netname: %S\n", pSI->shi2_netname );
printf( "Type: %s\n", sharetype );
printf( "Re: %S\n", pSI->shi2_re );
if ( pSI->shi2_max_uses == (DWORD) (-1L) )
printf( "Max use: unlimited\n" );
else
printf( "Max use: %lu\n", pSI->shi2_max_uses );
printf( "Cur use: %lu\n", pSI->shi2_current_uses );
printf( "Path: %S\n", pSI->shi2_path );
} if ( pBuf != NULL )
NetApiBufferFree( pBuf ); if ( rc != NERR_Success )
printf( "Oops! Error %lu encountered!\n", rc ); return 0;
}
sharepath是要获取共享信息的目录名字也就是netsharename
剩下的我不知道怎么错了!?
function Tform1.GetShareAttr(Sharepath:string):string;
type
TShare_INFO_2 = record
shi2_netname : PWideChar;
shi2_type : DWORD;
shi2_re : PWideChar;
shi2_permissions : DWORD;
shi2_max_uses : DWORD;
shi2_current_uses : DWORD;
shi2_path : PWideChar;
shi2_passwd : PWideChar;
end;
var
Shareattrstr:widestring;
re,netname:string;
Sharpaths:widestring;
shareAttrresult,shareAttrtemp:string;
i:longint;
si: TShare_INFO_2;
NetShareGetInfo:TNetShareGetInfo;
Fpointer:TfarProc;
begin
Fpointer:=GetProcAddress(hinstDLL,'NetShareGetInfo');
if Fpointer=nil then
raise exception.Create ('GetNetSharInfo not found!');
NetShareGetInfo:=TNetShareGetInfo(Fpointer);
Sharpaths:=Sharepath;
NetShareGetInfo(nil',pwidechar(Sharpaths)',2,@si);
re:=si.shi2_re;
netname:=si.shi2_netname;
showmessage(netname+','+re+','+inttostr(si.shi2_current_uses));
GetShareAttr:=netname+','+re+','+inttostr(si.shi2_current_uses);
end;
re为' '
人数为1
可是这些都不是我设置的效果呀!
TShare_INFO_2结构中存储的内容的长度是不定长的,你不能通过结构的方式声明,取地址进行访问!!!
你只能够通过指针进行访问,可以参考我的程序,注意使用完毕后,内存指针一定要使用NetApiBufferFree进行释放!!!
另外从你提供的程序上看,你的程序中的漏洞比较多,很多地方都没有进行错误保护,很容易出错的!!!