Постоянные читатели моего блога помнят, что я предлагал ознакомиться с советами Сары Форд, которые она публиковала с завидной периодичностью на своей англоязычной страничке. У меня для вас хорошая новость. Эти же советы теперь можно будет читать и на русском языке. Найти это чудо можно по адресу http://blogs.msdn.com/rusaraford/. Надеюсь, советы на русском будут также появляться регулярно.
Первый совет был посвящен инкрементному поиску. Кстати, такой же совет имеется и в моей книге C#. Советы программистам (глава Интегрированная среда разработки (IDE)).
P.S. А сборная России по футболу уже в полуфинале Чемпионата Европы!
Удачного вам боления!
суббота, 21 июня 2008 г.
суббота, 7 июня 2008 г.
Админ ли ты?
Продолжаю читать книжку Защищенный код для Windows Vista. Оказывается, если вы регистрировались в системе как Администратор, то все равно администратором по сути не являетесь. По умолчанию система дает вам права стандартного пользователя. Если вам необходимо выполнить административную задачу, то система предложит вам повысить свои права. Срабатывает механизм UAC (контроль учетных записей пользователей), который так раздражает многих пользователей. Автор книги рекомендует использовать системную функцию IsUserAnAdmin для проверки ваших текущих прав. К счастью, синтаксис этой функции очень прост и мне не составило труда написать объявление этой функции для C# через механизм P/Invoke:
[DllImport("shell32.dll")]
private static extern bool IsUserAnAdmin();
// Является ли пользователь администратором
Console.WriteLine("Вы админ?: {0}", IsUserAnAdmin().ToString());
Если запустите эту программу, то можете убедиться, что вы не являетесь администратором (False). Теперь найдите исполняемый файл проекта в Проводнике, щелкните правой кнопкой для вызова контекстного меню и выберите команду Запуск от имени администратора. Теперь программа будет выводить значение True. Вы повысили себе права до уровня администратора ручным способом.
Существует и другой аспект. Предположим, вы сами хотите реализовать возможность повышения уровня привилегий в своей программе. В таком случае воспользуйтесь следующим кодом:
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"cmd.exe");
psi.UseShellExecute = true;
psi.Verb = "runas";
p.StartInfo = psi;
p.Start();
В приведенном примере показано, как можно запускать новый процесс с повышенными привилегиями.
Итак, после прочтения очередных страниц книги, мы познакомились с новой функцией Windows API IsUserAnAdmin, которую я сразу же поместил в свой справочник по функциям Windows API и узнали, как программно повышать права при вызове нового процесса.
Удачного вам программирования!
P.S. Чемпионат Европы по футболу стартовал. Удачного вам боления!
[DllImport("shell32.dll")]
private static extern bool IsUserAnAdmin();
// Является ли пользователь администратором
Console.WriteLine("Вы админ?: {0}", IsUserAnAdmin().ToString());
Если запустите эту программу, то можете убедиться, что вы не являетесь администратором (False). Теперь найдите исполняемый файл проекта в Проводнике, щелкните правой кнопкой для вызова контекстного меню и выберите команду Запуск от имени администратора. Теперь программа будет выводить значение True. Вы повысили себе права до уровня администратора ручным способом.
Существует и другой аспект. Предположим, вы сами хотите реализовать возможность повышения уровня привилегий в своей программе. В таком случае воспользуйтесь следующим кодом:
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"cmd.exe");
psi.UseShellExecute = true;
psi.Verb = "runas";
p.StartInfo = psi;
p.Start();
В приведенном примере показано, как можно запускать новый процесс с повышенными привилегиями.
Итак, после прочтения очередных страниц книги, мы познакомились с новой функцией Windows API IsUserAnAdmin, которую я сразу же поместил в свой справочник по функциям Windows API и узнали, как программно повышать права при вызове нового процесса.
Удачного вам программирования!
P.S. Чемпионат Европы по футболу стартовал. Удачного вам боления!
вторник, 27 мая 2008 г.
Назад в будущее
В прошлом выпуске я поведал вам о выходе в свет книги C#. Советы программистам. Одна из глав книги посвящена различным трюкам, которые можно использовать в IDE Visual Studio. Сегодня узнал еще один интересный прием, который, похоже, не имеется в книге. Суть в следующем. Предположим у вас имеется большой проект. Вы выбираете в редакторе кода какое-нибудь слова и вызываете из контекстного меню команду Go To Definition. Вам мгновенно переносит в нужное место. Все это, безусловно, прекрасно. Но нам нужно вернуться теперь обратно, а проект очень большой... Неужели придется прокручивать редактор в поисках места, с которого вас выбросило? Запомните волшебную комбинацию клавиш Ctrl + -. Как только вы нажмете эту комбинацию, вы снова вернетесь на предыдущую позицию. Строго говоря, эта комбинация в паре с комбинацией Ctrl + Shift + - работает как кнопки Вперед и Назад в Internet Explorer.
Удачного вам программирования!
Удачного вам программирования!
суббота, 24 мая 2008 г.
Моя новая книжка C#. Советы программистам
Издательство BHV-Петербург выпустило мою новую книжку C#. Советы программистам. Я постарался отобрать наиболее интересные примеры, которые я использовал в своей практике или собираюсь использовать в будущем. Более полную информацию о книге вы можете почерпуть с моей специальной странички, посвященной книжным новинкам. За написание книги я приступил около двух лет назад. Естественно, часть советов просто не попала в это издание. Поэтому я буду выкладывать новые советы на страницу FAQ. Наиболее интересные решения, возможно, попадут в следующее издании книги. Буду рад, если вы поделитесь своими замечаниями и предложениями по книге. Также можете присылать свои советы, которые я с удовольствием рассмотрю.
Счастливого вам чтения!
Счастливого вам чтения!
воскресенье, 11 мая 2008 г.
Новая книга Защищенный код для Windows Vista
Здравствуйте!
Недавно издательство Питер выпустило книгу Защищенный код для Windows Vista. Книга содержит очень много полезной информации о том, как правильно нужно писать программы под новую операционную систему Windows Vista. Большинство примеров в книге приводится на C++ и только небольшая часть на C#. Но тем не менее, книга очень нужная и своевременная. Я с удовольствием начал ее читать.
Недавно издательство Питер выпустило книгу Защищенный код для Windows Vista. Книга содержит очень много полезной информации о том, как правильно нужно писать программы под новую операционную систему Windows Vista. Большинство примеров в книге приводится на C++ и только небольшая часть на C#. Но тем не менее, книга очень нужная и своевременная. Я с удовольствием начал ее читать.
пятница, 9 мая 2008 г.
Узнать редакцию Vista
В каждой новой операционной системе появляются новые функции. Не стала исключением и Windows Vista. Как вы, вероятно, знаете, Vista поставляется в нескольких редакциях: Home Basic, Home Premium, Business и так далее. Чтобы узнать, какая версия используется у пользователя, можно воспользоваться двумя способами. Первый способ - использовать WMI (свойство OperatingSystemSKU из класса Win32_OperatingSystem). Пример использования этого свойства можно найти в справочнике по WMI.
Но нас интересует пример на C#. Для этой цели нам подойдет новая функция Windows API GetProductInfo, которая появилась в Windows Vista. Описание этой функции я поместил в справочник по функциям Windows API для .NET Framework, а здесь приведу небольшой пример использования в функции в проекте на C#:
[DllImport("kernel32.dll")]
public static extern bool GetProductInfo(
int dwOSMajorVersion,
int dwOSMinorVersion,
int dwSpMajorVersion,
int dwSpMinorVersion,
out uint pdwReturnedProductType);
// констанды для pdwReturnedProductType
public const uint PRODUCT_BUSINESS = 0x00000006; // Business
public const uint PRODUCT_ENTERPRISE = 0x00000004; // Enterprise
public const uint PRODUCT_HOME_BASIC = 0x00000002; // Home Basic
public const uint PRODUCT_HOME_PREMIUM = 0x00000003; // Home Premium
public const uint PRODUCT_ULTIMATE = 0x00000001; // Ultimate
public const uint PRODUCT_UNDEFINED = 0x00000000;
int majorVersion = Environment.OSVersion.Version.Major;
int minorVersion = Environment.OSVersion.Version.Minor;
int spMajorVersion = Environment.OSVersion.Version.MajorRevision;
int spMinorVersion = Environment.OSVersion.Version.MinorRevision;
// Vista GerProductInfo
uint edition = PRODUCT_UNDEFINED;
if (GetProductInfo(
majorVersion,
minorVersion,
spMajorVersion,
spMinorVersion,
out edition))
{
switch (edition)
{
case PRODUCT_ENTERPRISE:
textBox1.Text += " Enterprise";
break;
case PRODUCT_ULTIMATE:
textBox1.Text += " Ultimate";
break;
case PRODUCT_BUSINESS:
textBox1.Text += " Business";
break;
case PRODUCT_HOME_PREMIUM:
textBox1.Text += " Home Preminum";
break;
case PRODUCT_HOME_BASIC:
textBox1.Text += " Home Basic";
break;
default:
textBox1.Text += " Unknown";
break;
}
}
Программисты, которые по-прежнему работают на Visual Basic 6.0, также не будут забыты. Я постараюсь включить эту фунцию в справочник по функциям Windows API для Visual Basic 6.0.
Всех с праздником Победы!
И счастливого вам программирования!
Но нас интересует пример на C#. Для этой цели нам подойдет новая функция Windows API GetProductInfo, которая появилась в Windows Vista. Описание этой функции я поместил в справочник по функциям Windows API для .NET Framework, а здесь приведу небольшой пример использования в функции в проекте на C#:
[DllImport("kernel32.dll")]
public static extern bool GetProductInfo(
int dwOSMajorVersion,
int dwOSMinorVersion,
int dwSpMajorVersion,
int dwSpMinorVersion,
out uint pdwReturnedProductType);
// констанды для pdwReturnedProductType
public const uint PRODUCT_BUSINESS = 0x00000006; // Business
public const uint PRODUCT_ENTERPRISE = 0x00000004; // Enterprise
public const uint PRODUCT_HOME_BASIC = 0x00000002; // Home Basic
public const uint PRODUCT_HOME_PREMIUM = 0x00000003; // Home Premium
public const uint PRODUCT_ULTIMATE = 0x00000001; // Ultimate
public const uint PRODUCT_UNDEFINED = 0x00000000;
int majorVersion = Environment.OSVersion.Version.Major;
int minorVersion = Environment.OSVersion.Version.Minor;
int spMajorVersion = Environment.OSVersion.Version.MajorRevision;
int spMinorVersion = Environment.OSVersion.Version.MinorRevision;
// Vista GerProductInfo
uint edition = PRODUCT_UNDEFINED;
if (GetProductInfo(
majorVersion,
minorVersion,
spMajorVersion,
spMinorVersion,
out edition))
{
switch (edition)
{
case PRODUCT_ENTERPRISE:
textBox1.Text += " Enterprise";
break;
case PRODUCT_ULTIMATE:
textBox1.Text += " Ultimate";
break;
case PRODUCT_BUSINESS:
textBox1.Text += " Business";
break;
case PRODUCT_HOME_PREMIUM:
textBox1.Text += " Home Preminum";
break;
case PRODUCT_HOME_BASIC:
textBox1.Text += " Home Basic";
break;
default:
textBox1.Text += " Unknown";
break;
}
}
Программисты, которые по-прежнему работают на Visual Basic 6.0, также не будут забыты. Я постараюсь включить эту фунцию в справочник по функциям Windows API для Visual Basic 6.0.
Всех с праздником Победы!
И счастливого вам программирования!
вторник, 6 мая 2008 г.
Массив байтов и файловые потоки
В одном из проектов мне понадобилось конвертировать массив байтов bytes[] в поток System.IO.Stream. Так как я вплотную потоками не работал, то моя работа затормозилась. Пришлось искать решение в интернете. Оказалось, что мы не одиноки во Вселенной. Одного человека также интересовал этот вопрос, который он задал на форуме ASP.NET Mania. Добрый человек откликнулся на просьбу и предложил решение в виде класса. Я вытащил из кода нужную мне функциональность, но своей странице FAQ оставил оригинальную версию. Вдруг, спустя некоторое время, мне опять понадобится работать с потоками.
public static class StreamConverter
{
public static Stream ToStream(byte[] bytes)
{
return new MemoryStream(bytes);
}
public static byte[] ToBytes(Stream stream)
{
long initialPosition = stream.Position;
stream.Position = 0;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Position = initialPosition;
return bytes;
}
}
Удачного вам программирования!
public static class StreamConverter
{
public static Stream ToStream(byte[] bytes)
{
return new MemoryStream(bytes);
}
public static byte[] ToBytes(Stream stream)
{
long initialPosition = stream.Position;
stream.Position = 0;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Position = initialPosition;
return bytes;
}
}
Удачного вам программирования!
Подписаться на:
Комментарии (Atom)