2013年10月17日

2013年10月9日

Microsoft Monthly Update 2013/10

今日はMicrosoftのセキュリティアップデートの日です。
MS13-080
MS13-081
MS13-082
MS13-083
MS13-084
MS13-085
MS13-086
MS13-087

2013年9月30日

[書籍]世界測地系と座標変換

Amazon.co.jpで注文した

世界測地系と座標変換 (amazon)/飛田幹男著/日本測量協会/ISBN 978-4-88941-014-3/1,600円

が配送されてきました(堺配送センター発で今回の配送は日本郵政)。

2013年9月13日

第26回エンバカデロ・デベロッパーキャンプ

本日10:00から第26回エンバカデロ・デベロッパーキャンプが東京ビッグサイトの会議棟6Fで行われます。今回もハンズオンのセッション(B4)を除く全てのセッションがUStreamで中継されるとのことです。

全セッション、懇親会とも無事終了しました。セッションスピーカの皆さん、参加者、関係者の皆さん、おつかれさまでした。

2013/09/18追記: セッション資料がダウンロードできるようになっています。

第26回 エンバカデロ・デベロッパーキャンプ資料ダウンロード

2013/09/24追記: セッションリプレイの公開が始まっています。
  • 【A1】Delphiチュートリアルセッション「Windows開発者のためのFireMonkeyモバイル開発入門」
  • 【B1】HTML5テクニカルセッション「オフラインで"待ちなし"、 500倍を超えるアクセスパフォーマンス!」
  • 【A2】Delphi/C++Builderテクニカルセッション「はじめてのFireDAC」
  • 【B2】C++Builderテクニカルセッション「いまどきのC++開発をもっと楽にする3つの武器」
  • 【G3】ジェネラルセッション「マルチデバイス開発を強化するエンバカデロのRADテクノロジー」
  • 【G3】ジェネラルセッション(後半戦)「アプリソムリエお薦めアプリ、Delphiならどう作る?教えて高橋さん!」
  • 【A4】テクニカルケーススタディ「RAD Studioによるマルチデバイス開発への道」
  • 【B4】Delphi iOSワークショップ「アプリソムリエと作るDelphi iOSアプリ」
  • 【A5】Delphi/C++Builderテクニカルセッション「脱Windows XPから一気にマルチデバイス対応を目指す実践テクニック」
  • 【G6】クロージングアプリソムリエと語るモバイル開発への取り組み」

2013年9月11日

RAD Studio/Delphi/C++Builder XE5リリース

RAD Studio/Delphi/C++Builder XE5が正式にリリースされたようです。

エンバカデロ、AndroidおよびiOS向けネイティブ開発をサポートしたRAD Studio XE5を本日より販売開始 | Press Releases
Embarcadero Launches RAD Studio XE5 with True Native Android and iOS Support, Allowing Developers to Reach the Largest Addressable Mobile Markets

RAD Studio XE5(Delphi XE5/C++Builder XE5) における不具合修正リスト (en)

29543 Delphi XE5 and C++Builder XE5 ISO
29546 RAD Studio XE5 HTML5 Builder ISO

29525 AQtime for Delphi XE5, C++Builder XE5, and RAD Studio XE5
29526 IP*Works for Delphi XE5 29707 IP*Works for Delphi XE5 Update 2
29527 IP*Works for C++Builder XE5 29706 IP*Works for C++Builder XE5 Update 2
29549 Jomitech PlatinumGrid Lite Pack for HTML5 Builder XE5
29524 FastReport FMX - Embarcadero Edition for XE5
29598 FireMonkey Premium Style Pack 3 for RAD Studio XE5 FireMonkey Premium Style Pack for RAD Studio XE5 (v4 Oct 2013) (Team Japan » FireMonkey Premium Style Pack 3 for RAD Studio XE5 が公開されました)
29613 InfoPower for Delphi FireMonkey (2013/12/11更新あり) 29712 InfoPower FM for RAD Studio, Delphi and C++Builder XE5 Update 2
29610 Mida Converter for RAD Studio, Delphi and C++Builder XE5
29645 Documentation Insight Express for RAD Studio XE5
29695 FastReport 4 VCL - Embarcadero Edition for XE5
29708 TeeChart Lite for RAD Studio, Delphi, C++Builder XE5 Update 2

29548 iOS 7 Style Update for Delphi XE5 and RAD Studio XE5 (Delphi XE5およびRAD Studio XE5向け iOS 7スタイルアップデート / Using the iOS 7 Update for XE5)
29701 Android 4.4 KitKat Style for RAD Studio and Delphi XE5 (Team Japan » KitKat(4.4.x)専用のFireMonkeyスタイルを試す)
29716 FireDAC.Phys.IBBase Patch for XE2 Update2 参考: FireDACでFireBirdへ接続時、入力する文字数によってエラーが発生する症状について
29772 Updated REST Debugger

29769 AQtime 8.20 Standard update

Delphi® XE5 および C++Builder® XE5 オンライン ヘルプ (en)
XE5 のリリース ノート (en)

2013/12/11追記: InfoPower for Delphi FireMonkeyが更新されているとのことです。

Team Japan » ボーナスパック - InfoPower社のFireMonkeyコンポーネント集

2014/01/17追記: Fast Report 4 VCLがダウンロードできるようになっています。

2014/01/30追記 IP*WorksがUpdate 2対応版に更新されています。

2014/02/01追記: TeeChart LiteとInfoPower FireMonkeyがUpdate 2対応版に更新されています。

Team Japan » RAD Studio XE5(Delphi/C++Builder) Update2向け、サードパーティライブラリ更新版

2014/02/04追記: FireDAC.Phys.IBBaseのパッチが公開されています。

2014/02/24追記: REST Debuggerが更新されています。またAQtime 8.20 Standard updateも公開されています。

Microsoft Monthly Update 2013/09

今日はMicrosoftのセキュリティアップデートの日です。
MS13-067
MS13-068
MS13-069
MS13-070
MS13-071
MS13-072
MS13-073
MS13-074
MS13-075
MS13-076
MS13-077
MS13-078
MS13-079

2013年8月22日

Win32APIのSetPriorityClass関数でプロセスの優先順位を指定する

実行中のプロセスの優先順位クラス (Priority class)を取得/設定するにはWin32APIのGetPriorityClass関数 (en)およびSetPriorityClass関数 (en)を使用します。このとき自プロセスの優先順位クラスを指定するのであればGetCurrentProcess関数 (en)で取得した擬似ハンドルを使用することができます(他のプロセスの優先順位クラスの場合、PROCESS_SET_INFORMATIONアクセス権を持ったプロセスハンドルが必要です)。

まずBELOW_NORMAL_PRIORITY_CLASSとABOVE_NORMAL_PRIORITY_CLASSの定義を追加します。
{$IF RTLVersion < 24}
const
  BELOW_NORMAL_PRIORITY_CLASS = $00004000;
  {$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
  ABOVE_NORMAL_PRIORITY_CLASS = $00008000;
  {$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
{$IFEND}
フォームに優先順位クラスを表示するComboBox(StyleはcsDropDownList)と優先順位クラスを取得、設定するButtonを配置し、フォームのOnCreateイベントでComboBoxに優先順位クラスの表示文字列と値を格納します。
procedure TForm1.FormCreate(Sender: TObject);
begin

  with ComboBox1.Items do
  begin
    BeginUpdate;
    try
      Clear;
      AddObject(Format('%s (0x%8.8X)',['IDLE',IDLE_PRIORITY_CLASS]),
                TObject(IDLE_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['BELOW_NORMAL',BELOW_NORMAL_PRIORITY_CLASS]),
                TObject(BELOW_NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['NORMAL',NORMAL_PRIORITY_CLASS]),
                TObject(NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['ABOVE_NORMAL',ABOVE_NORMAL_PRIORITY_CLASS]),
                TObject(ABOVE_NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['HIGH',HIGH_PRIORITY_CLASS]),
                TObject(HIGH_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['REALTIME',REALTIME_PRIORITY_CLASS]),
                TObject(REALTIME_PRIORITY_CLASS));

    finally
      EndUpdate;
    end;
  end;

end;
自プロセスの優先順位クラスを取得して表示します。
{$WARN SYMBOL_PLATFORM OFF}

procedure TForm1.Button1Click(Sender: TObject);
var
  PriorityClass: DWORD;
  I: Integer;
begin

  PriorityClass := GetPriorityClass(GetCurrentProcess);

  with ComboBox1 do
  begin
    for I := 0 to Items.Count - 1 do
    begin
      if DWORD(Items.Objects[I]) = PriorityClass then
      begin
        ItemIndex := I;
        Exit;
      end;
    end;

    ItemIndex := -1;
  end;

end;
今度は選択された優先順位クラスを自プロセスに設定します。
procedure TForm1.Button2Click(Sender: TObject);
var
  PriorityClass: DWORD;
begin

  with ComboBox1 do
  begin
    if ItemIndex < 0 then
    begin
      Exit;
    end;

    PriorityClass := DWORD(Items.Objects[ItemIndex]);
    Win32Check(SetPriorityClass(GetCurrentProcess,PriorityClass));
  end;

end;
Windowsにおけるスケジューリングのメカニズムは非常に複雑で、優先順位が実行中に動的に変更されるなど、単純に優先順位クラスなどで決まるわけではありません。このあたりをきちんと理解するためにはAdvanced Windows 第5版 上 (amazon)の"7.8 スレッドの優先度"、"7.9 優先度クラスの概要"、"7.10 プログラミングの優先度"やインサイドWindows 第6版 上 (amazon) の"5.7 スレッドのスケジューリング"などを読むことをお勧めします。

GetPriorityClassとSetPriorityClassで優先順位クラスを取得/設定する (Gist)

2013年8月21日

CreateProcessで優先順位を指定してプログラムを起動する

優先順位クラス (Priority class)を指定してプロセスを起動するにはWin32APIのCreateProcess関数 (en)の第6パラメータ(dwCreationFlags)に優先順位クラスを指定します。

Delphi XE2およびそれ以前のバージョンではWindows.pasにBELOW_NORMAL_PRIORITY_CLASSとABOVE_NORMAL_PRIORITY_CLASSが定義されていないので、まずこれらを定義します。
{$IF RTLVersion < 24}
const
  BELOW_NORMAL_PRIORITY_CLASS = $00004000;
  {$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
  ABOVE_NORMAL_PRIORITY_CLASS = $00008000;
  {$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
{$IFEND}
フォームにEditとComboBox、Buttonをひとつずつ配置し、フォームのOnCreateイベントでEditとComboBoxに値を格納します。
procedure TForm1.FormCreate(Sender: TObject);
begin

  Edit1.Text := '%windir%\notepad.exe';

  with ComboBox1.Items do
  begin
    BeginUpdate;
    try
      Clear;
      AddObject(Format('%s (0x%8.8X)',['IDLE',IDLE_PRIORITY_CLASS]),
                TObject(IDLE_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['BELOW_NORMAL',BELOW_NORMAL_PRIORITY_CLASS]),
                TObject(BELOW_NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['NORMAL',NORMAL_PRIORITY_CLASS]),
                TObject(NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['ABOVE_NORMAL',ABOVE_NORMAL_PRIORITY_CLASS]),
                TObject(ABOVE_NORMAL_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['HIGH',HIGH_PRIORITY_CLASS]),
                TObject(HIGH_PRIORITY_CLASS));
      AddObject(Format('%s (0x%8.8X)',['REALTIME',REALTIME_PRIORITY_CLASS]),
                TObject(REALTIME_PRIORITY_CLASS));

    finally
      EndUpdate;
    end;
  end;

  with ComboBox1 do
  begin
    ItemIndex := Items.IndexOfObject(TObject(NORMAL_PRIORITY_CLASS));
  end;

end;
優先順位を指定してプロセスを起動します。
{$WARN SYMBOL_PLATFORM OFF}

procedure TForm1.Button1Click(Sender: TObject);
var
  ApplicationName: String;
  CreationFlags: DWORD;
  StartupInfo: TStartupInfo;
  ProcessInformation: TProcessInformation;
  Length: Integer;
begin

  Length := ExpandEnvironmentStrings(PChar(Edit1.Text),nil,0);
  SetLength(ApplicationName,Length);
  ExpandEnvironmentStrings(PChar(Edit1.Text),PChar(ApplicationName),Length);
  UniqueString(ApplicationName);

  with ComboBox1 do
  begin
    if ItemIndex < 0 then
    begin
      Exit;
    end;

    CreationFlags := DWORD(Items.Objects[ItemIndex]);
  end;

  FillChar(StartupInfo,SizeOf(StartupInfo),0);
  StartupInfo.cb := SizeOf(StartupInfo);

  FillChar(ProcessInformation,SizeOf(ProcessInformation),0);

  Win32Check(CreateProcess(PChar(ApplicationName),nil,nil,nil,False,
                           CreationFlags,nil,nil,
                           StartupInfo,ProcessInformation));

  CloseHandle(ProcessInformation.hProcess);
  CloseHandle(ProcessInformation.hThread);

end;
ここではEditに入力された起動対象プログラムに%windir%などの環境変数を使用することを前提としているため、Win32APIのExpandEnvironmentStrings関数 (en)で展開しています。

優先順位クラスを指定してプロセスを起動する (Gist)

2013年8月20日

コマンドプロンプトのSTARTコマンドで優先順位を指定してプログラムを起動する

プログラムを実行するときに、そのプロセスの優先順位クラス (Priority class)を外部から指定するには、コマンドプロンプト(cmd.exe)のSTARTコマンドを使用します。
start /<PriorityClass> <program>

ここで/<PriorityClass>には

/REALTIME
REALTIME_PRIORITY_CLASS (リアルタイム/24)
/HIGH
HIGH_PRIORITY_CLASS (高/13)
/ABOVENORMAL
ABOVE_NORMAL_PRIORITY_CLASS (通常以上/10)
/NORMAL
NORMAL_PRIORITY_CLASS (通常/8)
/BELOWNORMAL
BELOW_NORMAL_PRIORITY_CLASS (通常以下/6)
/LOW
IDLE_PRIORITY_CLASS (低/4)
を指定可能です(括弧内の数字は同一の優先順位クラス内の相対的な優先順位を表す優先順位レベル (Priority level)をTHREAD_PRIORITY_NORMALに指定したときのベースプライオリティ)。

2013年8月18日

2013年8月14日

Microsoft Monthly Update 2013/08

今日はMicrosoftのセキュリティアップデートの日です。
MS13-059
MS13-060
MS13-061
MS13-062
MS13-063
MS13-064
MS13-065
MS13-066