以编程方式closures共享文件

我正在使用的公司有一个程序写在老年人vb6,这是经常更新,大多数客户端运行映射networking驱动器的可执行文件。 这实际上有很less的问题,其中最大的是自动更新。 目前更新程序(用c ++编写)重命名现有的exe,然后下载并将新版本放入旧版本的位置。 这通常工作正常,但在某些环境下,它只是失败。

解决scheme是从Microsoft运行此命令:

for /f "skip=4 tokens=1" %a in ('net files') do net files %a /close 

此命令closures所有共享的networking文件(以及…最多),然后更新程序可以replace该exe文件。

在C ++中,我可以使用System(""); 函数来运行该命令,或者我可以redirectnet files的输出,并遍历结果寻找特定的文件,并运行net file /close命令closures它们。 但是,如果有winapi函数具有类似的function,以提高可靠性和未来的安全性,将会好得多。

有什么办法让我以编程方式查找所有networking共享文件,并closures相关的文件?

你可以通过编程来做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); 

有关NetFileEnum和NetFileClose的详细信息,请参阅MSDN。 请注意,如果更多的数据可用, NetFileEnum可能会返回ERROR_MORE_DATA