2015年2月16日

IDE Fix Pack 5.8

Andreas HausladenさんのIDE Fix PackがアップデートされてVersion 5.8になっています。このバージョンでは規模の大きなパッケージが別の大きなパッケージに依存しているときのパフォーマンスの改善などの新機能と、Windows 8.1環境下でのDelphi 2009起動時の問題や、一部の環境でIDE Fix Packをインストール/アンインストールしようとしたときにエラーが発生する問題などの修正が行われています、

IDE Fix Pack 5.8 for 2009-XE7 released | Andy's Blog and Tools

2015年2月11日

Microsoft Monthly Update 2015/02

今日はMicrosoftのセキュリティアップデートの日です。
MS15-009
MS15-010
MS15-011
MS15-012
MS15-013
MS15-014
MS15-015
MS15-016
MS15-017

2015年1月14日

Microsoft Monthly Update 2015/01

今日はMicrosoftのセキュリティアップデートの日です。
MS15-001
MS15-002
MS15-003
MS15-004
MS15-005
MS15-006
MS15-007
MS15-008

2015年1月9日

RAD Studio/Delphi/C++Builder XE7 Update 1 Beta hotfix for FireMonkey apps on Android 5.0 (Lollipop)

RAD Studio/Delphi/C++Builder XE7 Update 1のBeta hotfix for FireMonkey apps on Android 5.0 (Lollipop)がリリースされています。Marco CantuさんのLollipop Hotfix (Beta) for Delphi and C++ Builder XE7によると、Android 5 (Lollipop)でデフォルトとなったART KernelとのJNI Bridgeによる配列データの受け渡しの問題(RSP-9738など)に対応するとのことです。

30110 Beta hotfix for FireMonkey apps on Android 5.0 (Lollipop)

2015/01/14追記: RAD Studio XE7 Update 1とAndroid 5.0(Lollipop)との互換性の問題はQC上だとQC129208やQC129086が該当するものとのことです。高橋さん、いつも情報ありがとうございます。

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)