Программизм |
|
|
|
Копирование файловМатематики делают то, что можно так, как нужно. Пытливый ум, прочитавший предыдущие заметки, наверное уже устал удивляться, как это автор находит проблемы на ровном месте. То же самое и здесь — ну казалось бы, что может быть проще, чем скопировать файл?
copy source.txt \\bigserver\store\dest.txt
Всё это действительно так, но задача осложняется двумя дополнительными условиями: во-первых, процедуру копирования нужно вызвать из программы на VisualBasic, а во-вторых, у пользователя нет прав на запись в каталог Решение задачи достаточно очевидно — надо войти в систему под именем пользователя, имеющего права на запись в указанный каталог, и выполнить необходимую операцию. И вот тут-то и начинаются поиски и метания. Достаточно быстро в MSDN находятся функции Но, как выясняется, и в Windows NT не всё так безоблачно. Оказывается, Для того, чтобы сервисом RunAs мог воспользоваться простой программист, в Win32 включена функция Запускаем и... ничего не работает. А всё потому, что пользователь, имеющий права на запись в один каталог, совсем не обязан иметь права на чтение из другого. В общем-то, эта проблема решается просто — копирование происходит в два этапа. Надо только создать сетевой ресурс, права на запись в который будут у всех. После этой переделки всё вроде бы работает, но если вдруг что-то не получится, мы никак об этом не узнаем. Почему? А потому, что функция Вернуть в VisualBasic код ошибки просто — надо всего лишь создать DLL, экспортирующую нужную функцию. Правда, тут тоже есть тонкость: экспортируемая функция должна соответствовать соглашению extern "C" __declspec(dllexport) DWORD __stdcall FCopy(LPSTR src, LPSTR dest); то экспортируемый символ будет называться LIBRARY FOREIGNCOPY EXPORTS FCopy @1 Теперь предстоит решить новую проблему — как создать новый процесс. В Win32, в отличие от POSIX, создать новый процесс можно только указав исполняемый модуль. В Windows NT есть замечательная утилита — RunDll32. Она позволяет вызвать функцию в любой DLL, передав в качестве параметра имя библиотеки и имя функции. Единственное условие — функция должна иметь определённый прототип. Написать такую функцию несложно, а для того, чтобы вернуть из функции типа Полученная DLL занимает около 40 K. Размер, конечно, невелик, но библиотека такого размера задевает эстетические чувства, поэтому её стоит подвергнуть процедуре уменьшения. И разумеется, наша библиотека не была бы нашей, если бы здесь всё прошло без сучка и задоринки. Во-первых, intrinsic functions генерируются только для мультибайтных кодировок (список функций можно найти в MSDN). Поэтому Unicode-функции (в частности, Во-вторых, для того, чтобы правильно сформировать командную строку для порождаемого процесса, нам придётся вызывать функцию Ну, вот и всё. Теперь можно спокойно копировать файлы. Готовую программу здесь не привожу — оставляю читателю самому насладиться написанием кода. Впрочем, если кому-то она понадобится — пишите, обсудим. 10.03.2004 |
ПоискСм. такжеИменно им призван помочь описанный здесь скрипт, сохраняющий письма с бесплатных ящиков на локальный диск.... »»» каждые три восьмибитных байта кодируются четырьмя шестибитными байтами. Вопрос в том, как выбрать диапазон печатных символов, чтобы отобразить множество полученных шестибитных чисел... »»» архив с драйвером занимает около Рекомендую
e.g.Orius Copyright noticeъ) Все материалы, размещённые на странице, являются неотъемлемой собственностью автора с вытекающими отсюда правами, как ©, так и (ъ). Некоммерческое их распространение всячески приветствуется, разумеется, при условии сохранения ссылки на оригинал. Что касается коммерческого использования — пишите письма, договориться можно всегда. Удивительное рядом
Пишите письма
Счётчики |