В компании, с которой я работаю, есть программа, написанная на ye olde vb6, которая обновляется довольно часто, и большинство клиентов запускают исполняемый файл с подключенного сетевого диска. На самом деле это удивительно мало проблем, самая большая из которых — автоматические обновления. В настоящее время программа обновления (написанная на c ++) переименовывает существующий exe-файл, затем загружает и помещает новую версию на место старой версии. Это обычно работает нормально, но в некоторых средах просто не работает.
Решение работает эта команда от Microsoft:
for /f "skip=4 tokens=1" %a in ('net files') do net files %a /close
Эта команда закрывается все сетевые файлы, которые являются общими (ну … большинство), а затем программа обновления может заменить исполняемый файл.
В 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);
Обратитесь к MSDN для получения подробной информации о NetFileEnum а также NetFileClose. Обратите внимание, что NetFileEnum
может вернуться ERROR_MORE_DATA
если больше данных доступно.