先日やった ::NetServerGetInfo で,サーバが動作しているかの判断はできるようになった.
それでテストしていると,環境にもよるかもしれないが共有名に誤りがある場合,1 分以上かかることがある.
そのため,サーバが動作している時に,共有名を取得する方法で調べ始めた.
次の様なコードで,サーバの共有名が列挙できる.
bool test (c_tstring& svr)
{
std::wstring server = ::To_wstring(svr) ;
LPBYTE buff = NULL ;
DWORD entriesRead = 0 ;
DWORD totalEntries = 0 ;
DWORD resumeHandle = 0 ;
NET_API_STATUS status = ::NetShareEnum(LMSTR(server.c_str()),1,&buff,MAX_PREFERRED_LENGTH,
&entriesRead,&totalEntries,&resumeHandle) ;
if (status == NERR_Success || status == ERROR_MORE_DATA) {
SHARE_INFO_1* info = (SHARE_INFO_1*)buff ;
for (DWORD index=0 ; index<entriesRead ; index++) {
tstring stype ;
{
DWORD type = info[index].shi1_type ;
DWORD typm = info[index].shi1_type & STYPE_MASK ;
switch (typm) {
case STYPE_DISKTREE : stype = _T("STYPE_DISKTREE ") ; break ;
case STYPE_PRINTQ : stype = _T("STYPE_PRINTQ ") ; break ;
case STYPE_DEVICE : stype = _T("STYPE_DEVICE ") ; break ;
case STYPE_IPC : stype = _T("STYPE_IPC ") ; break ;
default : stype = _T("????? ") ; break ;
}
stype += ::To_tstring(u_32(typm),16) ;
stype += _T(" ") ;
stype += ::u32to_t(u_32(type),16,8) ;
}
std::tout << stype << _T("\t") ;
std::tout << ::ttot_(::To_tstring(LPWSTR(info[index].shi1_netname)),20)
<< ::ttot_(::To_tstring(LPWSTR(info[index].shi1_remark)) ,20)
<< std::endl ;
}
::NetApiBufferFree(buff) ;
}
else {
std::tout << _T("NetShareEnum error: ") << status << std::endl ;
}
return true ;
}
今はあまり使われていないと思うが「オフラインファイル」の場合にどうなるかが気になっていた.
まだ途中だが,[Offline Share] として認識はできているみたい.

【Windows】ファイルサーバのファイルが一部しか表示されない
Offline Filesとは?キャッシュ管理とログオン時の動作を支えるWindowsサービスを解説
Windows 10 同期センターの有効化と無効化