2015年1月9日

InterBase XE3 Update 4 Hotfix 3

InterBase XE3 Update 4 Hotfix 3がリリースされています。バージョンは11.0.4.820となっています。

30112 InterBase XE3 Update 4 Hotfix 3 (11.0.4.820) for Windows

2015年1月6日

シリアルポートをフレンドリ名で列挙する

以前使用できるシリアルポートをレジストリから列挙する方法について書きましたが、今度はシリアルポートをそのフレンドリ名(デバイスマネージャ上で表示される表記)とともに列挙する方法です。

フレンドリ名の取得にはSetup APIを使用しますが、残念ながらDelphiにはSetup API関係の定義が含まれていない(C++Builderならsetupapi.hがあるのですが)ため、まずは必要なWin32APIと構造体を定義します。
{ Setup APIs }
type
  { HDEVINFO }
  HDEVINFO = THandle;
  {$EXTERNALSYM HDEVINFO}

  { SP_DEVINFO_DATA }
  SP_DEVINFO_DATA = packed record
    cbSize: DWORD;
    ClassGuid: TGUID;
    DevInst: DWORD;
    Reserved: ULONG_PTR;
  end;
  {$EXTERNALSYM SP_DEVINFO_DATA}

const
  { Flags for SetupDiGetClassDevs }
  DIGCF_PRESENT         = $00000002;
  {$EXTERNALSYM DIGCF_PRESENT}

  { Property for SetupDiGetDeviceRegistryProperty }
  SPDRP_DEVICEDESC      = $00000000;
  {$EXTERNALSYM SPDRP_DEVICEDESC}
  SPDRP_FRIENDLYNAME    = $0000000C;
  {$EXTERNALSYM SPDRP_FRIENDLYNAME}

  { Scope for SetupDiOpenDevRegKey }
  DICS_FLAG_GLOBAL      = $00000001;
  {$EXTERNALSYM DICS_FLAG_GLOBAL}

  { KeyType for SetupDiOpenDevRegKey }
  DIREG_DEV             = $00000001;
  {$EXTERNALSYM DIREG_DEV}

{ SetupDiClassGuidsFromName }
function SetupDiClassGuidsFromName(const ClassName: PChar;
                                   ClassGuidList: PGUID;
                                   ClassGuidListSize: DWORD;
                                   var RequiredSize: DWORD): BOOL; stdcall;
  external 'SetupApi.dll' name
{$IFDEF UNICODE}
  'SetupDiClassGuidsFromNameW';
{$ELSE}
  'SetupDiClassGuidsFromNameA';
{$ENDIF}
{$EXTERNALSYM SetupDiClassGuidsFromName}

{ SetupDiGetClassDevs }
function SetupDiGetClassDevs(ClassGuid: PGUID;
                             const Enumerator: PChar;
                             hwndParent: HWND;
                             Flags: DWORD): HDEVINFO; stdcall;
  external 'SetupApi.dll' name
{$IFDEF UNICODE}
  'SetupDiGetClassDevsW';
{$ELSE}
  'SetupDiGetClassDevsA';
{$ENDIF}
{$EXTERNALSYM SetupDiGetClassDevs}

{ SetupDiDestroyDeviceInfoList }
function SetupDiDestroyDeviceInfoList(DeviceInfoSet: HDEVINFO): BOOL; stdcall;
  external 'SetupApi.dll' name 'SetupDiDestroyDeviceInfoList';
{$EXTERNALSYM SetupDiDestroyDeviceInfoList}

{ SetupDiEnumDeviceInfo }
function SetupDiEnumDeviceInfo(DeviceInfoSet: HDEVINFO;
                               MemberIndex: DWORD;
                               var DeviceInfoData: SP_DEVINFO_DATA): BOOL; stdcall;
  external 'SetupApi.dll' name 'SetupDiEnumDeviceInfo';
{$EXTERNALSYM SetupDiEnumDeviceInfo}

{ SetupDiGetDeviceRegistryProperty }
function SetupDiGetDeviceRegistryProperty(DeviceInfoSet: HDEVINFO;
                                          const DeviceInfoData: SP_DEVINFO_DATA;
                                          Prop: DWORD;
                                          PropertyRegDataType: PDWORD;
                                          PropertyBuffer: Pointer;
                                          PropertyBufferSize: DWORD;
                                          var RequiredSize: DWORD): BOOL; stdcall;
  external 'SetupApi.dll' name
{$IFDEF UNICODE}
  'SetupDiGetDeviceRegistryPropertyW';
{$ELSE}
  'SetupDiGetDeviceRegistryPropertyA';
{$ENDIF}
{$EXTERNALSYM SetupDiGetDeviceRegistryProperty}

{ SetupDiOpenDevRegKey }
function SetupDiOpenDevRegKey(DeviceInfoSet: HDEVINFO;
                              var DeviceInfoData: SP_DEVINFO_DATA;
                              Scope: DWORD;
                              HwProfile: DWORD;
                              KeyType: DWORD;
                              samDesired: REGSAM): HKEY; stdcall;
  external 'SetupApi.dll' name 'SetupDiOpenDevRegKey';
{$EXTERNALSYM SetupDiOpenDevRegKey}
これらを使用してシリアルポートをそのフレンドリ名とともに取得します。
function EnumSerialCommWithFriendlyName(const S: TStrings): Integer;
var
  Guid: TGUID;
  Size: DWORD;
  hDevInf: HDEVINFO;
  Index: DWORD;
  DevInfoData: SP_DEVINFO_DATA;
  S1: String;
  hRegKey: HKEY;
  S2: String;
  RegType: DWORD;
  PortNo: Integer;
begin

  Result := 0;

  Size := 0;
  if SetupDiClassGuidsFromName('Ports',@Guid,1,Size) = False then
  begin
    RaiseLastOSError;
  end;

  hDevInf := SetupDiGetClassDevs(@Guid,nil,0,DIGCF_PRESENT);
  if hDevInf = INVALID_HANDLE_VALUE then
  begin
    RaiseLastOSError;
  end;

  try
    Index := 0;
    while True do
    begin
      FillChar(DevInfoData,SizeOf(DevInfoData),0);
      DevInfoData.cbSize := SizeOf(DevInfoData);
      if SetupDiEnumDeviceInfo(hDevInf,Index,DevInfoData) = False then
      begin
        Break;
      end;

      SetupDiGetDeviceRegistryProperty(hDevInf,DevInfoData,SPDRP_FRIENDLYNAME,
                                       nil,nil,0,Size);
      SetLength(S1,(Size + SizeOf(Char)) div SizeOf(Char));

      if SetupDiGetDeviceRegistryProperty(hDevInf,DevInfoData,SPDRP_FRIENDLYNAME,
                                          nil,PChar(S1),Size,Size) = True then
      begin
        SetLength(S1,StrLen(PChar(S1)));
        hRegKey := SetupDiOpenDevRegKey(hDevInf,DevInfoData,DICS_FLAG_GLOBAL,0,DIREG_DEV,KEY_READ);
        if hRegKey <> INVALID_HANDLE_VALUE then
        begin
          try
            if RegQueryInfoKey(hRegKey,nil,nil,nil,nil,nil,nil,nil,nil,
                               @Size,nil,nil) = ERROR_SUCCESS then
            begin
              SetLength(S2,(Size + SizeOf(Char)) div SizeOf(Char));
              if (RegQueryValueEx(hRegKey,'PortName',nil,@RegType,Pointer(PChar(S2)),
                                  @Size) = ERROR_SUCCESS) and
                 (RegType = REG_SZ) then
              begin
                SetLength(S2,StrLen(PChar(S2)));
                if CompareText(Copy(S2,1,3),'COM') = 0 then
                begin
                  if TryStrToInt(Copy(S2,4,Length(S2)),PortNo) = True then
                  begin
                    S.AddObject(S1,Pointer(PortNo));
                    if Result < PortNo then
                    begin
                      Result := PortNo;
                    end;
                  end;
                end;
              end;
            end;

          finally
            RegCloseKey(hRegKey);
          end;
        end;
      end;

      Index := Index + 1;
    end;

  finally
    SetupDiDestroyDeviceInfoList(hDevInf);
  end;

end;
手順ですが、まずSetupDiClassGuidsFromNameでデバイスインタフェースクラスが'Ports'のGUIDを取得し、そのGUIDを使用してSetupDiGetClassDevsで現在システムに認識されているDevice Information Setsを取得し、SetupDiEnumDeviceInfoでDevice Information Set一つずつの情報をSP_DEVINFO_DATAに取り出して、SetupDiGetDeviceRegistryPropertyでフレンドリ名を取得します。さらにSetupDiOpenDevRegKeyでデバイス固有情報の含まれるレジストリキー('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum'の下のデバイスごとのキーに含まれる'Device Parameters'キー)を開き、RegQueryValueExで'PortName'という名前でREG_SZの値のデータを文字列として取得し、'COM'で始まっていたらシリアルポートとしてフレンドリ名とともにパラメータ(S: TStrings)に格納します。全てのDevice Information Setをチェックし終わったらSetupDiDestroyDeviceInfoListでDevice Information Sets全体を解放します。 以前のものと同様に必ずしもポート番号順にはなっていないため、必要に応じて結果をソートしてください。

シリアルポートをフレンドリ名で列挙 (Gist)

2014年12月22日

[書籍]MariaDB & MySQL全機能バイブル

MARUZEN&ジュンク堂書店 渋谷店

MariaDB & MySQL全機能バイブル (amazon)/鈴木啓修、山田奈緒子著/技術評論社/ISBN 978-4-7741-7020-6/3,780円

を購入。

2014年12月12日

Firebird 2.5.3 Security Update 1/2.1.7

Firebird Ver2.5.3 Security Update 1(Build 26780)およびVer2.1.7(Build 18553)がリリースされています。

Firebird: Firebird 2.5.3 Security Update 1
Release Notes (PDF)

Firebird: Firebird 2.1.7
Release Notes (PDF)

認証されていないユーザから特別に加工されたパケットを送りつけることでリモートDoS攻撃を受けてしまうセキュリティホールが報告されており、これに対応するものです。信頼できないネットワークからのアクセスを受けるような状況ではアップデートを考慮すべきかと思われます。

2014年12月10日

Microsoft Monthly Update 2014/12

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

2014年12月8日

[書籍]Web API

MARUZEN&ジュンク堂書店 渋谷店

Web API (amazon)/水野貴明著/オライリージャパン/ISBN 978-4-87311-686-0/2,376円

を購入。

2014年12月4日

InterBase XE7リリース

InterBase XE7(12.0.0.191)がリリースされています。現時点(2014/12/04)でDeveloper EditionとServer Edition(トライアル版)の英語版のみダウンロード可能です。2014/12/12にDeveloper EditionとServer Edition(トライアル版)の日本語版もダウンロードできるようになりました。

エンバカデロ、マルチデバイス対応のハイパフォーマンスデータベースInterBaseの新バージョンを発表 | Press Releases

30090 InterBase XE7 (12.0.0.191) Developer Edition, Japanese
30066 InterBase XE7 (12.0.0.191) Developer Edition, English

InterBase XE7 Readme (en)
InterBase XE7 Readme - InterBase (en)

What's New in InterBase XE7
What's New in InterBase XE7 - InterBase

2014/12/09追記: InterBase XE7(開発コードネーム"DeltaForce")では次のような新機能が追加されたとのことです。
  • Change Views機能(テーブルの変更履歴を簡単に追跡する)
  • 64ビット版LinuxとUbuntu Linuxのサポート(RHEL 6/7、SUSE 11、Ubuntu 14)
  • パフォーマンスの向上(SMP環境でのパフォーマンスの向上、トランザクションの改善)
  • トランザクションIDの64ビット化
  • インクリメンタルデータダンプ(データダンプ時に変更があったページのみを対象に)
  • APIの拡張(オンラインダンプ/インクリメンタルダンプ、ジャーナルアーカイブ関係APIの追加)
  • パフォーマンス監視の更新(パフォーマンスモニタリングカウンタを64ビット化)
  • 以前のバージョンのODSのサポート(ODS 13/14/15をそのまま使用可能に)
詳しくはこちらを。
InterBase XE7 - Blogs
What's New in InterBase XE7 - InterBase

2014年11月14日

RAD Studio/Delphi/C++Builder XE7 Update 1

RAD Studio/Delphi/C++Builder XE7のUpdate 1がリリースされています。

Update 1 for RAD Studio, Delphi and C++Builder XE7

30048 Delphi XE7 and C++Builder XE7 ISO (includes Update 1)

XE7 Update 1 のリリース ノート - RAD Studio (en)

Update 1 Fix List for RAD Studio XE7, Delphi XE7, and C++ Builder XE7

2014/11/19追記: XE7 Update 1でFMX/2DのフォームにTViewport3Dを配置すると、フォームデザイナで開きなおしたときにサイズが正しく反映されない、という問題([RSP-9732] TViewport3D does not resize properly in Update 1)が報告されています。FMXで3Dアプリケーションを開発している方はUpdate 1のインストールを見合わせたほうがよいかもしれません。

2014/12/03追記: XE7 Update 1の[RSP-9732] TViewport3D does not resize properly in Update 1を修正するHotfixがリリースされています。

30070 Hotfix for FMX component with custom size reverting to default

2014年11月12日

Microsoft Monthly Update 2014/11

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

なんだこのリリース日未定ってのは…?

2014/11/19追記: MS14-068がリリースされています。

2014/12/10追記: MS14-075は2014/12のアップデートに含まれる形でリリースされました。

2014年11月11日

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

本日10:00から第29回エンバカデロ・デベロッパーキャンプ・イン東京がエビススバルビル EBiS303 カンファレンススペースで行われます。セッション資料は

ダウンロード | デベロッパーキャンプ

からダウンロードできるようになる予定です(2014/11/10 10:00以降)。またUStreamで全セッションの中継が予定されています(CH1がC/Gセッション、CH2がAセッション)。

無事に終了しました。セッションスピーカ/LT参加者の皆さん、参加者の皆さん、関係者の皆さん、おつかれさまでした。

2014/11/19追記: セッション資料がダウンロードできるようになっています。またセッションリプレイも順次公開されています。

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

  • 【C1】Delphi/C++テクニカルセッション「ゲームUIから考えるこれからのエンタープライズUX」
  • 【A1】Delphiテクニカルセッション「オンプレからクラウドに移行する中、新旧含め様々なデバイスと接続しないといけない要求にDelphiのクラウド接続で応えてみる」
  • 【C2】テクニカルセッション「着飾らない IoT」
  • 【A2】Delphiテクニカルセッション「Delphiで作るデータベースツール。その開発のポイントは・・」
  • 【G3】ジェネラルセッション「エンバカデロのマルチデバイス開発環境の現在、そして将来」
    • Replay (1/2)
    • Replay (2/2)
  • 【C4】テクニカルセッション「マルチデバイス向けアプリ開発・構築におけるデータハンドリングのいろいろ」
  • 【A4】Delphi/C++テクニカルセッション「FireMonkeyの仕組み」
  • 【C5】Delphi/C++テクニカルセッション「マルチデバイス対応アプリ開発の勘所」
  • 【A5】C++テクニカルセッション「C++コンパイラアップデート」
    • Replay (1/2)
    • Replay (2/2)
  • 【G6】ライトニングトーク「共有!みんなの開発事例、開発経験、テクニック」
    • Replay (1/2)
    • Replay (2/2)

2014年10月15日

Microsoft Monthly Update 2014/10

今日はMicrosoftのセキュリティアップデートの日です。
MS14-056
MS14-057
MS14-058
MS14-059
MS14-060
MS14-061
MS14-062
MS14-063

2014年10月11日

[書籍][eBook]Delphi Cookbook

Packt Publishingで注文した

Delphi Cookbook (amazon US, amazon JP)/Daniele Teti著/Packt Publishing/ISBN 9781783559589/26.99GBP(Print+eBook)

が配送されてきました(今回の配送はFedEx/佐川急便で、シンガポールからの発送でした)。2014/09/26に注文して15日目の到着、26.99GBP=4,720JPY(暫定、1GBP=174.88JPY)4,875JPY(1GBP=180.623JPY)でした。

2014/10/16追記: 興味がある方がいるかどうかはわかりませんが、一応自分のために目次をてきとうに訳してみました。
  • 序文
  • 第1章 Delphiの基本
    • イントロダクション
    • VCLスタイルでアプリケーションのルックアンドフィールをコードなしに変更する
    • 実行時にVCLアプリケーションのスタイルを変更する
    • TDBGridをカスタマイズする
    • オーナドローコンボボックスとリストボックスを使う
    • 埋め込みフォームをスタックする
    • JSONを操作する
    • XMLドキュメントを操作/変換する
    • 21世紀のI/O - ストリームを知る
    • VCLアプリケーションをタスクトレイに格納する
    • Windowsのサービスを作る
    • Windows上でアプリケーションに拡張子を関連付けする
  • 第2章 Delphi言語のNinjaになる
    • イントロダクション
    • 無名メソッドを楽しむ - 高階関数を使う
    • 列挙可能な型を書く
    • RTTIで救出 - クラスを実行時に設定する
    • RTTIでダックタイピング
    • クラスにヘルパを作成する
    • 正規表現で文字列をチェックする
  • 第3章 FireMonkeyでクロスプラットフォーム
    • イントロダクション
    • FireMonkey標準のコントロールにスタイルを適用して新しい体裁を与える
    • スタイルを適用したTListBoxを作る
    • アニメーションで顧客に印象付ける
    • LiveBindingでマスタ/詳細を使う
    • パスを使って複雑なベクタ図形を表示する
    • VCLアプリケーションでFireMonkeyを使う
  • 第4章 マルチスレッディングの千の顔
    • イントロダクション
    • TMonitorで共有リソースを同期する
    • スレッドセーフキューでメインスレッドと会話する
    • TEventで複数のスレッドと同期する
    • オシロスコープのように測定値を2Dグラフに表示する
  • 第5章 サーバでDelphiを動かす
    • イントロダクション
    • サーバ上のWebBrokerを使用したwebクライアントのJavaScriptアプリケーション
    • コンソールサービスアプリケーションをWindowsサービスに書き換える
    • データセットをJSONにシリアライズして元に戻す
    • RTTIでオブジェクトをJSONにシリアライズして元に戻す
    • パラメータをエンコードしてPOST HTTPリクエストを送信する
    • WebBrokerでRESTfulインタフェースを実装する
    • UDPでリモートアプリケーションを制御する
    • アプリケーションテザリングを使ってコンパニオンアプリケーションを作る
    • DataSnapのApacheモジュールを作る
  • 第6章 FireMonkeyでモバイル革命に乗る
    • イントロダクション
    • 写真を撮り、エフェクトを適用し、シェアする
    • リストビューでローカルデータを表示して検索する
    • メインスレッドをブロックするな!
    • SQLiteデータベースでTo-Doリストを扱う
    • スタイルを適用したTListViewでデータの長いリストを扱う
    • 連続的に写真とロケーションを取得してサーバに送信する
    • バックエンドと会話する
    • アプリケーションから電話を掛ける
    • アプリケーションのライフサイクルを追跡する
  • 第7章 特定のプラットフォームの機能を使う
    • イントロダクション
    • Android SDKのJavaクラスを使う
    • iOSのObjective-C SDKクラスを使う
    • アプリケーションでPDFファイルを表示する
    • Androidのインテントを送信する
    • 電話を喋らせる - AndroidのTextToSpeechエンジンを使う
  • 索引

2014年10月9日

第29回エンバカデロ・デベロッパーキャンプ開催決定

第29回エンバカデロ・デベロッパーキャンプは大阪と東京のダブル開催(キャンプ・ツアー)で、2014年11月07日(大阪)および2014年11月11日(東京)に開催されます。

デベロッパーキャンプ

今回は製品担当ディレクタのJohn Thomasさんがいらっしゃるようです。

2014年10月1日

2014/10開催のセミナー

2014年9月19日

2014年9月10日

Microsoft Monthly Update 2014/09

今日はMicrosoftのセキュリティアップデートの日です。
MS14-052
MS14-053
MS14-054
MS14-055