wiz*_*bin 7 c++ windows auto-update
我正在使用的公司有一个用你的vb6编写的程序,它经常更新,并且大多数客户端从映射的网络驱动器运行可执行文件.这实际上几乎没有问题,其中最大的问题是自动更新.目前,updater程序(用c ++编写)重命名现有的exe,然后下载并将新版本放入旧版本的位置.这通常很好,但在某些环境中它只是失败了.
解决方案是从microsoft运行此命令:
for /f "skip=4 tokens=1" %a in ('net files') do net files %a /close
Run Code Online (Sandbox Code Playgroud)
此命令将关闭所有共享的网络文件(大多数),然后更新程序可以替换exe.
在C++中,我可以使用该System("");
函数来运行该命令,或者我可以重定向输出net files
,并遍历查找有问题的特定文件的结果并运行net file /close
命令来关闭它们.但是,如果winapi功能具有类似的功能以获得更好的可靠性和未来的安全性,那将会更好.
有没有办法让我以编程方式查找所有网络共享文件并关闭相关文件?
您可以通过编程方式执行net file /close
操作.只需包含lmshare.h
并链接即可Netapi32.dll
.您可以使用两个函数:NetFileEnum
枚举所有打开的网络文件(在给定的计算机上)并NetFileClose
关闭它们.
快速(假设程序在同一台服务器上运行,并且没有太多打开的连接,请参阅上一段)和脏(无错误检查)示例:
FILE_INFO_2* pFile = NULL;
DWORD nRead = 0, nTotal = 0;
NetFileEnum(
NULL, // servername, NULL means localhost
"c:\\directory\\path", // basepath, directory where VB6 program is
NULL, // username, searches for all users
2, // level, we just need resource ID
(LPBYTE*)pFiles, // bufptr,
MAX_PREFERRED_LENGTH, // prefmaxlen, collect as much as possible
&nRead, // entriesread, number of entries stored in pFiles
&nTotal, // totalentries, ignore this
NULL //resume_handle, ignore this
);
for (int i=0; i < nRead; ++i)
NetFileClose(NULL, pFile[i].fi2_id);
NetApiBufferFree(pFile);
Run Code Online (Sandbox Code Playgroud)
有关NetFileEnum和NetFileClose的详细信息,请参阅MSDN .请注意,如果有更多数据NetFileEnum
可能会返回ERROR_MORE_DATA
.