Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

В 55 выпуске рассылки '.Net Собеседник':


.Net Собеседник #55

Содержание
  1. От автора
  2. Матрица: перезагрузка
  3. Время кода - Фрагменты кода Visual Studio 2005
  4. Форумы .Net на www.sql.ru

От автора

Здравствуйте, коллеги!

И вновь выпуск рассылки, как теперь повелось, связан с очередным номером журнала - №8. Работа над ним идёт вовсю, а пока вы сможете познакомиться с сокращёнными версиями статей, которые войдут в следующий номер. Первая статья - о том, как перезагрузить компьютер с помощью C# - является фактически исследованием функции InitiateSystemShutdownEx WinAPI. Вторая статья является обзором фрагментов кода (code snippets), выпущенными компанией MS.

В журнале будет полный обзор всех фрагментов кода, этот номер фактически может стать вашим справочником по этим фрагментам, поскольку их очень много - он пригодится всем любителям изобретать велосипед.

Теперь ещё раз о подписке.

Восьмой номер журнала, также как и №7, не будет выложен в Сеть даже в сокращённом виде. Поэтому напоминаю вам подписной индекс издания в Укрпочте - 91132, подписывайтесь, поддержите журнал. Ничто так не стимулирует к работе, как увеличивающееся число подписчиков :)

Окончательно разобрался с ценами.

Подписаться на журнал можно в электронном и бумажном виде - в бумажном виде рассылается только по территории Украины. Если вы находитесь в другой стране и хотите получать журнал в бумажном виде - обращайтесь, решим вопрос индивидуально.

Подписка для граждан РФ с этого года будет только в электронном виде.

Стоимость бумажной подписки через редакцию по Украине - 17 грн. за номер. Без всяких накопительных (на полгода, на год) скидок - с ними уж очень много путаницы.

Стоимость электронной подписки с этого года - 2 у.е. за номер.

Оплату можно произвести как через банки, так и с помощью WebMoney.

Если что не ясно, заглядывайте в блог или пишите на почту (адрес внизу рассылки), отвечу на ваши вопросы.

На этом всё - желаю интересного чтения.

{К содержанию}

Статья номера

Матрица: перезагрузка

ЯЗЫК: C#
Автор статьи: Чужа В.Ф.
, , полная версия в журнале АЛГОРИТМ №8, 2006 г.

Иной раз возникает необходимость перезагрузить компьютер с помощью планировщика по расписанию. Это можно сделать и с помощью встроенных утилит операционной системы, и с помощью утилит, написанных кем-то другим. А можно написать такую утилиту самому - тем более, что займёт она ни много, ни мало аж одну строчку, но от этого не станет менее интересной.

С чего начать?

А начать можно с поиска функции Windows API, которая отвечает за перезагрузку. После недолгих поисков выяснилось, что есть целое семейство функций, которые предназначены для перезагрузки или выключения системы. Вот их список:

Функция Предназначение
AbortSystemShutdown Функция прекращает процесс выключения системы, запущенный с помощью функции InitiateSystemShutdown
CancelShutdown Отменяет выключение
ExitWindows Макрос, вызывающий функцию ExitWindowsEx для отключения пользователя от системы
ExitWindowsEx Функция или отключает пользователя от системы (log off), или выключает и перезагружает систему. Рассылает сообщение WM_QUERYENDSESSION всем приложениям, для того чтобы определить, завершили ли они свою работу.
InitiateShutdown Выключает систему
InitiateSystemShutdown Функция инициализирует выключение системы и может перезагрузить указанную машину.
InitiateSystemShutdownEx Функция инициализирует выключение системы и может перезагрузить указанную машину. Вдобавок можно указать причину перезагрузки, которая будет использована системами Windows 2003 и выше.
LockWorkStation Блокирует дисплей системы для предотвращения неавторизованного доступа.

Итак, при ближайшем рассмотрении, из всего этого семейства нам подходят лишь две функции - ExitWindowsEx и InitiateSystemShutdownEx. Нужно заметить, что первая функция работает на всех версиях Windows и это является её несомненным преимуществом. Однако вторая является более новой и, хоть и работает только на системах Windows начиная с 2000, мы рассмотрим именно её.

Функция под микроскопом

Cогласно MSDN, функция имеет такой вид:


BOOL InitiateSystemShutdownEx(
LPTSTR lpMachineName,
LPTSTR lpMessage,
DWORD dwTimeout,
BOOL bForceAppsClosed,
BOOL bRebootAfterShutdown,
DWORD dwReason
);

Возвращаемые значения

Если функция отработала успешно, то возвращается ненулевое значение.

Если при вызове функции произошла ошибка, то возвращаемое значение равно нулю. Более подробную информацию об ошибке можно получить с помощью функции GetLastError.

Примечания

Для того чтобы отключить локальную систему, нить, вызывающая функцию, должна иметь привилегию SE_SHUTDOWN_NAME. Для отключения удалённой системы нить должна иметь привилегию SE_REMOTE_SHUTDOWN_NAME на удалённой машине. По умолчанию пользователь может включить привилегию SE_SHUTDOWN_NAME на своём компьютере, а администратор может включить привилегию SE_REMOTE_SHUTDOWN_NAME на удалённой машине. Подробнее смотрите здесь http://msdn.microsoft.com/library/en-us/secbp/security/running_with_special_privileges.asp.

Наиболее часто встречающейся ошибкой функции является неверное имя компьютера, попытка отключить уже отключенную систему или недостаточные для отключения системы права. Ошибка ERROR_SHUTDOWN_IN_PROGRESS возвращается в том случае, если процесс отключения системы уже стартовал.

Если функцией возвращено ненулевое значение, это ещё не значит, что отключение было или будет успешно произведено. Процесс отключения является асинхронным, и может быть реально осуществлён через некоторое время после того, как произошёл вызов функции и возврат её значения. Даже если время задержки перед отключением системы равно нулю, то процесс отключения может быть прерван приложением, сервисом и даже самой системой. Возвращённое ненулевое значение свидетельствует лишь о том, что у вызывающей функцию нити достаточно прав на выполнение данной функции, в функцию переданы корректные параметры, а система приняла запрос на отключение.

Вызывая функцию, мы должны указать, будут ли закрыты приложения, имеющие несохранённые изменения (например, Microsoft Word с открытым и отредактированным документом). Если мы указываем, что такие приложения закрывать не нужно, а нужно дождаться реакции пользователя на закрытие, а в системе запущенное приложение является консольным, то придётся ждать, пока пользователь сам закроет это приложение. Во время такого ожидания процесс отключения не может быть никем отменён, за исключением самого пользователя. Также не может быть инициализирован ещё один процесс отключения системы.

Заметьте, что, вызывая функцию с параметром bForceAppsClosed, установленным в TRUE, позволит избежать такой ситуации. Однако может привести к потере данных.

Примечание для Windows Server 2003 and Windows XP: Если компьютер заблокирован (locked), а парметр bForceAppsClosed равен FALSE, то последней ошибкой будет ошибка ERROR_MACHINE_LOCKED. Если система не готова к обработке запроса на отключение, то последней ошибкой будет ERROR_NOT_READY. Приложение, пытающееся отключить систему, должно подождать некоторое время и повторить попытку.

И, наконец…

После таких несложных, но достаточно длительных исследований, можно приступить к написанию кода (см. Листинг 1). Само написание займёт куда меньше времени, чем ушло на исследования, ведь мы не ставили себе целью написать полноценную программу с развитым интерфейсом пользователя. Хотя, может быть, для административных целей такая утилита была бы и не лишней.

using System;
using System.Runtime.InteropServices;

namespace conPCrestarter
{
class clMain
{
[STAThread]
static void Main()
{
InitiateSystemShutdownEx("127.0.0.1", "Матрица: перезагрузка", 0, true, true, 1);
}

[DllImport("advapi32.dll", EntryPoint="InitiateSystemShutdownEx")]
public static extern int InitiateSystemShutdownEx(string lpMachineName, string lpMessage, int dwTimeout, bool bForceAppsClosed, bool bRebootAfterShutdown, int dwReason);
}}


Ещё добавлю, что при написании кода использовалась Visual Studio 2003, которая всё-таки заметно более проворна и менее требовательна к ресурсам, чем её долгожданная преемница.

Удачного кодирования!

{К содержанию}

Время кода

Фрагменты кода Visual Studio 2005

ЯЗЫК: C#
Подготовил: Чужа В.Ф.,
dotnetgrains.sql.ru, полная версия в журнале АЛГОРИТМ №8, 2006 г.

Фрагменты кода (Code Snippets) IntelliSense являются повторно используемыми частями кода, предназначенными для выполнения определённых задач. В Visual Studio 2005 есть фрагменты кода, выполняющие целый ряд задач - от создания пользовательского исключения и отсылки электронного сообщения до рисования геометрических фигур. В конце февраля 2006 года Microsoft выпустила дополнительный набор фрагментов кода для Visual C#.

От себя могу добавить, что сейчас платформа .Net стала настолько популярной, что ежедневно под неё выпускается столько различных продуктов, что даже просто знать обо всех них просто невозможно. Но о продуктах от "отца-производителя", в данном случае Microsoft, знать желательно. И если у вас всё же нет времени посмотреть в среде разработки все фрагменты кода (а занятие это достаточно трудоёмкое, хоть и интересное), то эта статья-справочник - для вас.

Фрагменты кода для решения задач

Новый набор содержит фрагменты кода, с помощью которых вы сможете упростить взаимодействие с базами данных, приложениями Windows и мобильными приложениями, используя язык C#. Категории фрагментов кода перечислены ниже:

  • Фрагменты уровня приложения (Application Code Snippets )
  • Фрагменты коллекций и массивов (Collections and Arrays Code Snippets)
  • Фрагменты кода работы с соединениями (Connectivity Code Snippets)
  • Фрагменты кода работы с отчётами Crystal Reports (Crystal Reports Code Snippets )
  • Фрагменты кода работы с БД (Database Code Snippets)
  • Фрагменты кода работы с типами данных (Datatypes Code Snippets)
  • Фрагменты кода работы с файловой системой (File System Code Snippets)
  • Математика (Math Code Snippets)
  • Операционная система (Operating System Code Snippets)
  • Фрагменты кода по безопасности (Security Code Snippets)
  • Фрагменты кода по работе с мобильными устройствами (Smart Devices Code Snippets )
  • Фрагменты кода для технологии Windows Forms (Windows Forms Code Snippets)
  • Фрагменты кода по работе с XML (XML Code Snippets)
Скачать все фрагменты в одном пакете можно здесь. Установка их в систему производится с помощью менеджера фрагментов кода (Tools->Code Snippets Manager). Подробнее об установке фрагментов можно почитать здесь.

А теперь подробнее

Итак, допустим, что мы уже установили фрагменты кода. Теперь посмотрим на них поближе - вставить фрагмент можно, нажав правую кнопку мыши (ПКМ) в редакторе кода и выбрав из появившегося контекстного меню пункт "Insert Snippet…".

Фрагменты уровня приложения (Application Code Snippets ):

Activate A Running Application By Name (Активизируем запущенное приложение по имени):
Microsoft.VisualBasic.Interaction.AppActivate("Untitled - Notepad");
Примечание:
Для того, чтобы код этого фрагмента отработал, нужно добавить ссылку на сборку Microsoft.VisualBasic в проект.

Activate A Running Application By Process Id (Активизируем запущенное приложение по идентификатору процесса):
System.Diagnostics.Process process = System.Diagnostics.Process.Start("NOTEPAD.EXE");
Microsoft.VisualBasic.Interaction.AppActivate(process.Id);
Примечание:
1. Для того, чтобы код этого фрагмента отработал, нужно добавить ссылку на сборку Microsoft.VisualBasic в проект.
2. Блокнот стартует, но при попытке активизации процесса генерируется исключение "Процесс (номер процесса) не найден". Хотя номер процесса в диспетчере задач и в исключении совпадает.

Capture Output From A Console Application (Захватываем вывод консольного приложения):
System.Diagnostics.Process consoleApp = new System.Diagnostics.Process();
consoleApp.StartInfo.UseShellExecute = false;
consoleApp.StartInfo.RedirectStandardOutput = true;
consoleApp.StartInfo.FileName = "ConsoleApplication.exe";
consoleApp.Start();
consoleApp.WaitForExit();
string output = consoleApp.StandardOutput.ReadToEnd();


Check For Current Version Using ClickOnce (Проверяем текущую версию с использованием технологии ClickOnce):
string appFullName = "";
string currentVersion = "";
string updateLocation = "";
string lastUpdate = "";
System.Deployment.Application.ApplicationDeployment currentDeployment = System.Deployment.Application.ApplicationDeployment.CurrentDeployment;
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
appFullName = currentDeployment.UpdatedApplicationFullName;
currentVersion = currentDeployment.CurrentVersion.ToString();
updateLocation = currentDeployment.UpdateLocation.ToString();
lastUpdate = currentDeployment.TimeOfLastUpdateCheck.ToString();
}


Check For Update To ClickOnce Application (Проверим, есть ли обновление для приложения, использующего технологию ClickOnce):
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed && System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CheckForUpdate())
{ }


Clear The Console Window (Очистим окно консоли):
Console.Clear();

Примечание: Зачем нужно было создавать такой фрагмент - не ясно.

Delete File From Isolated Storage (Удаляем файл из изолированного хранилища):
System.IO.IsolatedStorage.IsolatedStorageFile isolatedStorage = System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForAssembly();
isolatedStorage.DeleteFile(@"FullPath\FileName.txt");


Determine The Amount Of Isolated Storage Available (Определяем объём изолированного хранилища):
System.IO.IsolatedStorage.IsolatedStorageFile isolatedStorage = System.IO.IsolatedStorage.IsolatedStorageFile.GetMachineStoreForAssembly();
ulong spaceAvailable = isolatedStorage.MaximumSize - isolatedStorage.CurrentSize;


Determine The Scope Of Isolated Storage (Определяем границы изолированного хранилища):

System.IO.IsolatedStorage.IsolatedStorageScope scope = isolatedStorage.Scope;

Примечание: Неплохо было бы дополнить этот фрагмент объявлением переменной isolatedStorage, например так, как было в предыдущем фрагменте.


{К содержанию}

Форумы .Net - вопросы оставшиеся без ответа

Как сохранить изображение формы? На ней много PictureBox?
подмена данных
Помогите с обновлением данных...
Где посмотреть пример работы с GridView
взаимодействие MsAccess с КПК-шной базой данных


На этом пятьдесят пятый выпуск .Net Собеседника закончен.
До следующего номера.



Чужа Виталий Ф. aka hDrummer, MCAD, MCDBA, MCP
hdrummer ухо gmail точка com - жду ваши предложения и замечания.


Рассылки Subscribe.Ru
.Net Собеседник - Новости мира Net, C#, ASP.Net

В избранное