2010年11月16日

ダミーのDwmapi.dllを作成する

前回のアーティクルでも触れましたが、Visual Studioで作成したプログラムがWindows Vista以降で"Known DLLs"となったDwmapi.dllをWindows 2000/XPでもLoadLibraryしてしまいバイナリプランティングを引き起こしてしまう件(およびDelphiで作成したプログラムにこの問題が存在しない件)について、これを検証するためのダミーのDwmapi.dllを作成してみました(当然Windows 2000/XP用です)。

まずはプロジェクトファイルです。DLLを新規作成し、DWMAPIという名前にします。
library DWMAPI;

uses
  Windows,
  SysUtils,
  Classes,
  _DWMAPI in '_DWMAPI.pas';

exports
  DwmDefWindowProc,
  DwmEnableBlurBehindWindow,
  DwmEnableComposition,
  DwmEnableMMCSS,
  DwmExtendFrameIntoClientArea,
  DwmGetColorizationColor,
  DwmGetCompositionTimingInfo,
  DwmGetWindowAttribute,
  DwmIsCompositionEnabled,
  DwmModifyPreviousDxFrameDuration,
  DwmQueryThumbnailSourceSize,
  DwmRegisterThumbnail,
  DwmSetDxFrameDuration,
  DwmSetPresentParameters,
  DwmSetWindowAttribute,
  DwmUnregisterThumbnail,
  DwmUpdateThumbnailProperties;

{$R *.res}

begin
end.
さらに新規作成でユニットを追加し、_DWMAPI.pasとします。
unit _DWMAPI;

interface

uses
  Types;

type
  DWORD = Types.DWORD;
  {$EXTERNALSYM DWORD}
  BOOL = LongBool;
  {$EXTERNALSYM BOOL}
  UINT = LongWord;
  {$EXTERNALSYM UINT}

  HRGN = type LongWord;
  {$EXTERNALSYM HRGN}

  LONGLONG = Int64;
  {$EXTERNALSYM LONGLONG}

  ULONGLONG = UInt64;
  {$EXTERNALSYM ULONGLONG}
  ULARGE_INTEGER = record
    case Integer of
    0: (
        LowPart: DWORD;
        HighPart: DWORD);
    1: (
        QuadPart: LONGLONG);
  end;
  {$EXTERNALSYM ULARGE_INTEGER}
  PULargeInteger = ^TULargeInteger;
  TULargeInteger = ULARGE_INTEGER;

  HWND = type LongWord;
  {$EXTERNALSYM HWND}

  WPARAM = Longint;
  {$EXTERNALSYM WPARAM}
  LPARAM = Longint;
  {$EXTERNALSYM LPARAM}
  LRESULT = Longint;
  {$EXTERNALSYM LRESULT}

  {$EXTERNALSYM PDWM_BLURBEHIND}
  PDWM_BLURBEHIND = ^DWM_BLURBEHIND;
  {$EXTERNALSYM DWM_BLURBEHIND}
  DWM_BLURBEHIND = packed record
    dwFlags: DWORD;
    fEnable: BOOL;
    hRgnBlur: HRGN;
    fTransitionOnMaximized: BOOL;
  end;
  _DWM_BLURBEHIND = DWM_BLURBEHIND;
  TDWMBlurBehind = DWM_BLURBEHIND;
  PDWMBlurBehind = ^TDWMBlurBehind;

  _MARGINS = record
    cxLeftWidth: Integer;
    cxRightWidth: Integer;
    cyTopHeight: Integer;
    cyBottomHeight: Integer;
  end;
  {$EXTERNALSYM _MARGINS}
  MARGINS = _MARGINS;
  {$EXTERNALSYM MARGINS}
  PMARGINS = ^MARGINS;
  {$EXTERNALSYM PMARGINS}
  TMargins = MARGINS;

  {$EXTERNALSYM PDWM_THUMBNAIL_PROPERTIES}
  PDWM_THUMBNAIL_PROPERTIES = ^DWM_THUMBNAIL_PROPERTIES;
  {$EXTERNALSYM DWM_THUMBNAIL_PROPERTIES}
  DWM_THUMBNAIL_PROPERTIES = packed record
    dwFlags: DWORD;
    rcDestination: TRect;
    rcSource: TRect;
    opacity: Byte;
    fVisible: BOOL;
    fSourceClientAreaOnly: BOOL;
  end;
  _DWM_THUMBNAIL_PROPERTIES = DWM_THUMBNAIL_PROPERTIES;
  TDWMThumbnailProperties = DWM_THUMBNAIL_PROPERTIES;
  PDWMThumbnailProperties = ^TDWMThumbnailProperties;

  {$EXTERNALSYM DWM_FRAME_COUNT}
  DWM_FRAME_COUNT = ULONGLONG;
  {$EXTERNALSYM QPC_TIME}
  QPC_TIME = ULONGLONG;

  {$EXTERNALSYM UNSIGNED_RATIO}
  UNSIGNED_RATIO = packed record
    uiNumerator: Cardinal;
    uiDenominator: Cardinal;
  end;
  _UNSIGNED_RATIO = UNSIGNED_RATIO;
  TUnsignedRatio = UNSIGNED_RATIO;
  PUnsignedRatio = ^TUnsignedRatio;

  {$EXTERNALSYM DWM_TIMING_INFO}
  DWM_TIMING_INFO = packed record
    cbSize: Cardinal;
    rateRefresh: UNSIGNED_RATIO;
    qpcRefreshPeriod: QPC_TIME;
    rateCompose: UNSIGNED_RATIO;
    qpcVBlank: QPC_TIME;
    cRefresh: DWM_FRAME_COUNT;
    cDXRefresh: UINT;
    qpcCompose: QPC_TIME;
    cFrame: DWM_FRAME_COUNT;
    cDXPresent: UINT;
    cRefreshFrame: DWM_FRAME_COUNT;
    cFrameSubmitted: DWM_FRAME_COUNT;
    cDXPresentSubmitted: UINT;
    cFrameConfirmed: DWM_FRAME_COUNT;
    cDXPresentConfirmed: UINT;
    cRefreshConfirmed: DWM_FRAME_COUNT;
    cDXRefreshConfirmed: UINT;
    cFramesLate: DWM_FRAME_COUNT;
    cFramesOutstanding: UINT;
    cFrameDisplayed: DWM_FRAME_COUNT;
    qpcFrameDisplayed: QPC_TIME;
    cRefreshFrameDisplayed: DWM_FRAME_COUNT;
    cFrameComplete: DWM_FRAME_COUNT;
    qpcFrameComplete: QPC_TIME;
    cFramePending: DWM_FRAME_COUNT;
    qpcFramePending: QPC_TIME;
    cFramesDisplayed: DWM_FRAME_COUNT;
    cFramesComplete: DWM_FRAME_COUNT;
    cFramesPending: DWM_FRAME_COUNT;
    cFramesAvailable: DWM_FRAME_COUNT;
    cFramesDropped: DWM_FRAME_COUNT;
    cFramesMissed: DWM_FRAME_COUNT;
    cRefreshNextDisplayed: DWM_FRAME_COUNT;
    cRefreshNextPresented: DWM_FRAME_COUNT;
    cRefreshesDisplayed: DWM_FRAME_COUNT;
    cRefreshesPresented: DWM_FRAME_COUNT;
    cRefreshStarted: DWM_FRAME_COUNT;
    cPixelsReceived: ULONGLONG;
    cPixelsDrawn: ULONGLONG;
    cBuffersEmpty: DWM_FRAME_COUNT;
  end;
  _DWM_TIMING_INFO = DWM_TIMING_INFO;
  TDWMTimingInfo = DWM_TIMING_INFO;
  PDWMTimingInfo = ^TDWMTimingInfo;

  {$EXTERNALSYM HTHUMBNAIL}
  HTHUMBNAIL = THandle;
  {$EXTERNALSYM PHTHUMBNAIL}
  PHTHUMBNAIL = ^HTHUMBNAIL;

  {$EXTERNALSYM DWM_PRESENT_PARAMETERS}
  DWM_PRESENT_PARAMETERS = packed record
    cbSize: Cardinal;
    fQueue: BOOL;
    cRefreshStart: DWM_FRAME_COUNT;
    cBuffer: UINT;
    fUseSourceRate: BOOL;
    rateSource: UNSIGNED_RATIO;
    cRefreshesPerFrame: UINT;
    eSampling: UINT;
  end;
  _DWM_PRESENT_PARAMETERS = DWM_PRESENT_PARAMETERS;
  TDWMPresentParameters = DWM_PRESENT_PARAMETERS;
  PDWMPresentParameters = ^TDWMPresentParameters;

function DwmDefWindowProc(hWnd: HWND; msg: UINT; wParam: WPARAM; lParam: LPARAM; var plResult: LRESULT): BOOL; stdcall;
function DwmEnableBlurBehindWindow(hWnd: HWND; const pBlurBehind: TDWMBlurBehind): HResult; stdcall;
function DwmEnableComposition(uCompositionAction: UINT): HResult; stdcall;
function DwmEnableMMCSS(fEnableMMCSS: BOOL): HResult; stdcall;
function DwmExtendFrameIntoClientArea(hWnd: HWND; const pMarInset: TMargins): HResult; stdcall;
function DwmGetColorizationColor(out pcrColorization: DWORD; out pfOpaqueBlend: BOOL): HResult; stdcall;
function DwmGetCompositionTimingInfo(hwnd: HWND; out pTimingInfo: TDWMTimingInfo): HResult; stdcall;
function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
function DwmIsCompositionEnabled(out pfEnabled: BOOL): HResult; stdcall;
function DwmModifyPreviousDxFrameDuration(hwnd: HWND; cRefreshes: Integer; fRelative: BOOL): HResult; stdcall;
function DwmQueryThumbnailSourceSize(hThumbnail: HTHUMBNAIL; pSize: PSIZE): HResult; stdcall;
function DwmRegisterThumbnail(hwndDestination: HWND; hwndSource: HWND; out phThumbnailId: HTHUMBNAIL): HResult; stdcall;
function DwmSetDxFrameDuration(hwnd: HWND; cRefreshes: Integer): HResult; stdcall;
function DwmSetPresentParameters(hwnd: HWND; var pPresentParams: TDWMPresentParameters): HResult; stdcall;
function DwmSetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
function DwmUnregisterThumbnail(hThumbnailId: HTHUMBNAIL): HResult; stdcall;
function DwmUpdateThumbnailProperties(hThumbnailId: HTHUMBNAIL; const ptnProperties: TDWMThumbnailProperties): HResult; stdcall;

implementation

function DwmDefWindowProc(hWnd: HWND; msg: UINT; wParam: WPARAM; lParam: LPARAM; var plResult: LRESULT): BOOL;
begin
  Result := False;
end;

function DwmEnableBlurBehindWindow(hWnd: HWND; const pBlurBehind: TDWMBlurBehind): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmEnableComposition(uCompositionAction: UINT): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmEnableMMCSS(fEnableMMCSS: BOOL): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmExtendFrameIntoClientArea(hWnd: HWND; const pMarInset: TMargins): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmGetColorizationColor(out pcrColorization: DWORD; out pfOpaqueBlend: BOOL): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmGetCompositionTimingInfo(hwnd: HWND; out pTimingInfo: TDWMTimingInfo): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmIsCompositionEnabled(out pfEnabled: BOOL): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmModifyPreviousDxFrameDuration(hwnd: HWND; cRefreshes: Integer; fRelative: BOOL): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmQueryThumbnailSourceSize(hThumbnail: HTHUMBNAIL; pSize: PSIZE): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmRegisterThumbnail(hwndDestination: HWND; hwndSource: HWND; out phThumbnailId: HTHUMBNAIL): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmSetDxFrameDuration(hwnd: HWND; cRefreshes: Integer): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmSetPresentParameters(hwnd: HWND; var pPresentParams: TDWMPresentParameters): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmSetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmUnregisterThumbnail(hThumbnailId: HTHUMBNAIL): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

function DwmUpdateThumbnailProperties(hThumbnailId: HTHUMBNAIL; const ptnProperties: TDWMThumbnailProperties): HResult; stdcall;
begin
  Result := E_NOTIMPL;
end;

end.
(Dwmapi.dll関係の各種定義はDwmApi.pasなどから借りてきました)。これでビルドしたDwmapi.dllをWindows 2000/XPでSystem32あたりに配置しておきます。この状態から問題のありそうなプログラムを実行してDependency WalkerWindows SysInternalsのProcess Explorerなどを使ってDwmapi.dllのロード状況を確認することができます。確かにDelphiで作成したプログラムは問題ないようですね。念のためにVCLのソースで確認してみると、DWMのデスクトップコンポジションを使用できるかどうかを調べるDwmApiユニットのDwmCompositionEnabled関数(ヘルプにはエントリがありませんが)の実装が
function DwmCompositionEnabled: Boolean;
var
  LEnabled: BOOL;
begin
  Result := (Win32MajorVersion >= 6) and (DwmIsCompositionEnabled(LEnabled) = S_OK) and LEnabled;
end;
(Delphi 20007のDwmApi.pasの795行目から)となっており、Windows Vista以降かどうかの確認を正しく行っていることがわかります。

元ねたはVS2010 でコンパイルされた全ての単体 MFC アプリケーションに脆弱性が存在 - スラッシュドット・ジャパンVS2010でコンパイルされたすべてのMFCアプリに脆弱性ってのは過小報告? - Windows 2000 Blog

2010年11月15日

バイナリプランティングの防止

IPAからも注意喚起が行われていますが、最近バイナリプランティング("Binary planting"、あるいは"DLL planting"、"DLL preloading"とも表現されます)という攻撃手法が問題になっています。これは(いわゆる"Known DLLs"を除く)絶対パス指定ではないDLLを検索するパスに"カレントディレクトリ"が含まれていて、状況によってはその優先順位が高いために攻撃者の用意した不正なDLLが実行プログラムにバインドされてしまう(通常はDLLをロードして初期化するだけでDLLMainが実行されてしまいますから、この時点で攻撃成立です)、というものです(これがが狭義の"DLL planting")。また類似の状況として、絶対パス指定ではない実行ファイルをCreateProcess/CreateProcessAsUser/CreateProcessWithLogonW/CreateProcessWithTokenW/ShellExecute/ShellExecuteExなどで起動することでも同様の問題が生じます。さらに問題を複雑なものにする要因として、Windows Vista/7ではKnown DLLsに含まれるDwmapi.dllがWindows 2000/XPには存在しないにもかかわらず一部のフレームワークがWindowsのバージョンを考慮せずにDwmapi.dllをロードしようとするために、カレントディレクトリに攻撃用のDwmapi.dllを配置することでこれがバインドされてしまい攻撃が成立してしまう、というものがあります(幸いにもVCLや.NET Frameworkは該当しませんが、MFC(Visual Studio 2005/2008/2010)は該当するようです)。上記のいずれの状況でも攻撃用のDLL/EXEはカレントディレクトリに配置するのが攻撃成立の条件になります(例えばSystem32にそんなものを置かれるようではどんな攻撃も可能ですから)ので、カレントディレクトリが外部に設定されてプログラムが起動するような場合、つまりファイルをダブルクリックして関連付けでプログラムが起動するような場合が最も危険である、ということになります(ショートカットでもカレントディレクトリは設定できますが)。

バイナリプランティングをプログラム側から防ぐには、
  • リンクするDLLや起動する実行ファイルは可能な限り完全修飾パス名を使用する。
  • SetDllDirectoryで""(空文字列)を指定してDLLの検索パスからカレントディレクトリを削除する(Windows XP以降)。
  • DLL/実行ファイルを検索するのにSearchPath (ja)はなるべく使用しない。使用するときはSetSearchPathModeBASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODEを設定する(Windows Vista以降)。
  • Windowsの特定のバージョン以降で"Known DLLs"に追加されたDLLをLoadLibraryするときはWindowsのバージョンチェックを行うか、完全修飾パス名を使用する。
といった対策をとる必要があります。

ということでSetDllDirectoryを使用してDLLの検索パスからカレントディレクトリを削除するサンプルです。なるべく早い時点で設定するのが望ましいので、プロジェクトファイルの先頭で行います。またSetDllDirectoryはWindows XP SP1以降にしか存在しないので、エントリの存在を確認して呼び出すようにしています。
program Project1;

uses
  Windows,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

type
  TSetDllDirectoryFunc = function (lpPathName: PChar): BOOL; stdcall;

const
{$IFDEF Unicode}
  CSetDllDirectory = 'SetDllDirectoryW';
{$ELSE}
  CSetDllDirectory = 'SetDllDirectoryA';
{$ENDIF}

var
  S: String;
  SetDllDirectory: TSetDllDirectoryFunc;
begin

  @SetDllDirectory := GetProcAddress(GetModuleHandle(kernel32),
  CSetDllDirectory);
  if Assigned(SetDllDirectory) = True then
  begin
    S := '#0';
    SetDllDirectory(PChar(S));
  end;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
なおコンソールアプリケーションでグラスエフェクトを有効にするのサンプルコードもDwmapi.dllがWindows 2000/XPには存在しないことを利用したバイナリプランティングの影響を受けるため、修正してあります。

元ねたは以下の通り。

情報処理推進機構(IPA)マイクロソフトITpro(要登録)CodeZineNyaRuRuの日記

2010年11月13日

Delphi/C++Builder XE Update Pack 1

Delphi/C++Builder XEのUpdate Pack 1がリリースされています。Update Pack 1にはDelphi/C++Builder XEのUpdate 1、Help Update 1、Boost Update 1の3つが含まれています。

28116 Update Pack 1 for Delphi XE and C++Builder XE
リリース ノート: Delphi XE および C++Builder XE Update 1
List of Bug Fixes in Delphi and C++Builder XE Update 1

なおAndreas HausladenさんによるとUpdate 1を適用するとDDevExtensionsがcrackとみなされて動作しないとのことです。

XE Update 1 the death of DDevExtensions | Andy’s Blog and Tools

2010/11/14追記: Help Update 1を適用するとPSDKのコンテンツが削除される、という問題が報告されています。この場合はHelpそのものを一旦アンインストールし、ダウンロードして展開したHelp Update1のセットアップからPSDKを含めてインストールすることで回避できるようです。

2010/11/14追記: 今回のUpdate 1のリリース日についてですが、1年前のこの話はNickさんが辞めることでなかったことになってしまったのでしょうかね?国別ではなくワールドワイドで同時展開するにはよいポリシーだと思うのですが…。

2010/11/14追記: Update 1適用後にAndreas HausladenさんDDevExtensionsが動作しない件についてですが、原因が判明して問題を回避したDDevExtensions 2.1 for XE Update 1がリリースされています。

DDevExtensions for XE Update 1 resurrection | Andy’s Blog and Tools

2010/11/16追記: A7MさんによるとC++Builder XEにBoost Update 1を適用後にboost::tupleを使用している箇所がコンパイルエラーになるという問題があり、ソースコードを修正することで回避できるとのことです。

Update Pack 1 for C++Builder XEのBoost Update 1についてのちょっとした注意 - C++Builder好きの秘密基地

2010/11/17追記: Team Japanにも関連記事が出ています。

Team Japan » RAD Studio/C++Builder/Delphi XE Update 1

2010年11月12日

Firebird 2.xから2.5へのバージョンアップ時のユーザデータベースの移行

Firebird 2.xで運用しているシステムを2.5にバージョンアップするときにはユーザデータベース(security2.fdb)の移行に気をつけましょう、という記事。

Firebird News » Migrating users from FB 2.1 to FB 2.5

てきとうな要約: ユーザデータベースもまたFirebirdのデータベースなので、Firebirdのバージョンが異なるとODSのバージョンもまた異なる、という問題があるため、単にコピーしておいたsecurity2.fdbを上書きするようなやり方は無保証であり、gbakでバックアップ/リストアするのが望ましいけれども、この場合新しい"RDB$ADMIN"ロールとの関係で、ユーザ操作を行う新しいSQL(CREATE/ALTER/DROP USER)をSYSDBAを含む通常ユーザが実行できない、ということになる(Firebird 2.5.1にはこの問題を解決するスクリプトが含まれる予定)。結局現時点ではgsecを使って新しくユーザを登録しなおすのが最も望ましい解決方法、ということになる。

2010年11月11日

登録回数の上限をwebから変更できなくなった

以前はインストール数の上限に達したときはwebから上限を変更できましたが、つ4さんのとほほな日々 備忘録[Delphi] RAD XE インストールのトラブルのコメント欄や公式フォーラムのLicense bumping-What is the limit ?Jan Derkさんの発言にあるように、2010/10/05以降はwebからの変更(bump up)は動作しておらず、Support KBインストール・使用許諾にあるとおり、インストール・使用許諾から申請するように変更されています。

2010年11月10日

Microsoft Monthly Update 2010/11

今日はMicrosoftのセキュリティアップデートの日です。
MS10-087
MS10-088
MS10-089

2010年11月9日

Dependency Walker

実行ファイルが静的、動的にリンクしているDLLを確認するツールとしてはMicrosoft Visual Studioに付属している(た)Dependency Walkerが一般的ですが、Dependency Walkerが知らないうちにfreewareになっていました(現在はSteve P. Millerさんがメンテナのようです)。

Dependency Walker (depends.exe) Home Page

現時点の最新版は2.2.6000で、x86/x64/IA64版が用意されています。

またx86版については黒翼猫さんが日本語化パッチを作成してくださっています。

Dependency Walker 日本語化パッチ を作りました - Windows 2000 Blog

2010年11月8日

IDE Fix Pack 4.0 Beta版テスト中

Andreas HausladenさんのIDE Fix Pack 4.0とDelphiSpeedUp 3.0のBeta版が公開されています(Use it at your own risk.です)。

The IDEFixPack 4.0 BETA begins… | Andy’s Blog and Tools

Delphi 7はDelphiSpeedUp(3.0 Beta)のみ、Delphi 2007はDelphiSpeedUp(3.0 Beta)+IDE Fix Pack (4.0 Beta)、Delphi 2009/2010/XEはIDE Fix Pack(4.0 Beta)のみ、とちょっと複雑です。また結構な勢いで更新されていて、まだまだ安定しているとまではいえないようです(手元の環境でもエラーが出たり…)。

2010/11/16追記: Release Candidate 2まで進んでいます。

2010年11月5日

インストールされているDelphiのバージョンを調べる

RRUZ(Rodrigo Ruz)さんによるインストール済のDelphiのバージョンを調べる方法。レジストリのHKCUかHKLMのSoftware\Borland|CodeGear|Embarcadero\Delphi|BDS\の存在を見ればよい。それ以上何もないのでリンクのみメモ。

Detecting installed delphi versions. « The Road to Delphi – a Blog About Delphi Programming (mostly)

2010年11月4日

$WARNによる警告の制御

Delphiではコンパイラディレクティブ$WARNを使用して警告を有効/無効/エラーに昇格/デフォルトに戻すという指定をすることができます(エラーに昇格、デフォルトに戻すの2つはDelphi 2009以降の新機能)。

{$WARN identifier ON | OFF | ERROR | DEFAULT}
ONを指定するとその警告が有効に、OFFで無効に、ERRORでその警告をエラーに昇格、DEFAULTで指定をプロジェクトオプションで指定したものに戻す、という動作になります。

指定可能な警告とエラーコードは以下のとおりです。
SYMBOL_DEPRECATED
W1000 (ja)
SYMBOL_LIBRARY
W1001 (ja)
SYMBOL_PLATFORM
W1002 (ja)
SYMBOL_EXPERIMENTAL
W1003 (ja)
UNIT_LIBRARY
W1004 (ja)
UNIT_PLATFORM
W1005 (ja)
UNIT_DEPRECATED
W1006 (ja)
UNIT_EXPERIMENTAL
W1007 (ja)
HRESULT_COMPAT
W1008 (ja)
HIDING_MEMBER
W1009 (ja)
HIDDEN_VIRTUAL
W1010 (ja)
GARBAGE
W1011 (ja)
BOUNDS_ERROR
x1012 (ja)
ZERO_NIL_COMPAT
W1013 (ja)
STRING_CONST_TRUNCED
W1014 (ja)
FOR_LOOP_VAR_VARPAR
W1015 (ja)
TYPED_CONST_VARPAR
W1016 (ja)
ASG_TO_TYPED_CONST
W1017 (ja)
CASE_LABEL_RANGE
W1018 (ja)
FOR_VARIABLE
x1019 (ja)
CONSTRUCTING_ABSTRACT
x1020 (ja)
COMPARISON_FALSE
W1021 (ja)
COMPARISON_TRUE
W1022 (ja)
COMPARING_SIGNED_UNSIGNED
W1023 (ja)
COMBINING_SIGNED_UNSIGNED
W1024 (ja)
UNSUPPORTED_CONSTRUCT
x1025 (ja)
FILE_OPEN
x1026 (ja)
FILE_OPEN_UNITSRC
F1027 (ja)
BAD_GLOBAL_SYMBOL
x1028 (ja)
DUPLICATE_CTOR_DTOR
W1029 (ja)
INVALID_DIRECTIVE
x1030 (ja)
PACKAGE_NO_LINK
W1031 (ja)
PACKAGED_THREADVAR
W1032 (ja)
IMPLICIT_IMPORT
x1033 (ja)
HPPEMIT_IGNORED
W1034 (ja)
NO_RETVAL
W1035 (ja)
USE_BEFORE_DEF
W1036 (ja)
FOR_LOOP_VAR_UNDEF
W1037 (ja)
UNIT_NAME_MISMATCH
E1038 (ja)
NO_CFG_FILE_FOUND
W1039 (ja)
IMPLICIT_VARIANTS
W1040 (ja)
UNICODE_TO_LOCALE
W1041 (ja)
LOCALE_TO_UNICODE
W1042 (ja)
IMAGEBASE_MULTIPLE
W1043 (ja)
SUSPICIOUS_TYPECAST
W1044 (ja)
PRIVATE_PROPACCESSOR
W1045 (ja)
UNSAFE_TYPE
W1046 (ja)
UNSAFE_CODE
W1047 (ja)
UNSAFE_CAST
W1048 (ja)
OPTION_TRUNCATED
W1049 (ja)
WIDECHAR_REDUCED
W1050 (ja)
DUPLICATES_IGNORED
W1051 (ja)
UNIT_INIT_SEQ
W1052 (ja)
LOCAL_PINVOKE
W1053 (ja)
MESSAGE_DIRECTIVE
x1054 (ja)
TYPEINFO_IMPLICITLY_ADDED
W1055 (ja)
RLINK_WARNING
x1056 (ja)
IMPLICIT_STRING_CAST
W1057 (ja)
IMPLICIT_STRING_CAST_LOSS
W1058 (ja)
EXPLICIT_STRING_CAST
W1059 (ja)
EXPLICIT_STRING_CAST_LOSS
W1060 (ja)
CVT_WCHAR_TO_ACHAR
W1061 (ja)
CVT_NARROWING_STRING_LOST
W1062 (ja)
CVT_ACHAR_TO_WCHAR
W1063 (ja)
CVT_WIDENING_STRING_LOST
W1064 (ja)
NON_PORTABLE_TYPECAST
W1065 (ja)
LOST_EXTENDED_PRECISION
W1066 (ja)
LNKDFM_NOTFOUND
W1067 (ja)
IMMUTABLE_STRINGS
W1068 (ja)
MOBILE_DELPHI
W1069 (ja)
UNSAFE_VOID_POINTER
W1070 (ja)
IMPLICIT_INTEGER_CAST_LOSS
W1071 (ja)
IMPLICIT_CONVERSION_LOSS
W1072 (ja)
COMBINING_SIGNED_UNSIGNED64
W1073 (ja)
UNKNOWN_CUSTOM_ATTRIBUTE
W1074 (ja)
OVERLOADING_ARRAY_PROPERTY
W1075 (ja)
POINTER_CAST_NARROWER
W1076 (ja)
POINTER_CAST_MIGRATION
W1077 (ja)
POPOPT_WITH_NO_MATCHING
W1078 (ja)
MISSING_POPOPT
W1079 (ja)
INVALID_NORETURN
W1080 (ja)
XML_WHITESPACE_NOT_ALLOWED
W1201 (ja)
XML_UNKNOWN_ENTITY
W1202 (ja)
XML_INVALID_NAME_START
W1203 (ja)
XML_INVALID_NAME
W1204 (ja)
XML_EXPECTED_CHARACTER
W1205 (ja)
XML_CREF_NO_RESOLVE
W1206 (ja)
XML_NO_PARM
W1207 (ja)
XML_NO_MATCHING_PARM
W1208 (ja)
元ねたはSource\ToolsAPI\DCCStrs.pas警告メッセージ(Delphi) - RAD Studio (en)、エラーと警告のメッセージ(Delphi) - RAD Studio (en)。

2016/04/28追記: Delphi 10.1 Berlinの情報を追加。
2017/04/04追記: Delphi 10.2 Tokyoで追加されたW1071/W1072/W1073の情報を追加。
2018/12/01追記: Delphi 10.3 Rioで追加されたW1074の情報を追加。
2019/02/27追記: W1067/W1069/W1070/W1071/W1072/W1073のリンクを追加。
2023/11/09追記: W1074のリンクを追加。
2026/03/22追記: Delphi 13 Florenceで追加されたW1075/W1076/W1077/W1078/W1079およびDelphi 13.1 Florenceで追加されたW1080の情報を追加。

2010年11月2日

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

第18回エンバカデロ・デベロッパーキャンプは(かねてからの予告どおり)2010年12月07日に開催されます。

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

またT6セッション『ライトニングトーク「共有!みんなの開発事例、開発経験、 テクニック」』のスピーカを募集しています。

【募集】第18回 エンバカデロ・デベロッパーキャンプ - ライトニングトークスピーカー

2010/11/04追記: ライトニングトークに高橋さんが参戦するようです。

Team Japan » ライトニングトークで喋ってみませんか?

ん~。いいネタを思いつかないし、ネタから考えるには仕事が忙しい気がするし…。

2010/11/10追記: 今回はUStreamとLiveMeeting(事前登録はここから)の両方で中継するそうです。あれ、エンバカデロ本社の誰かがCodeRage 5の後で次回からLiveMeetingはやめて他のシステムを使うようなことをいっていたような(クロスプラットフォームといいながらMac/Linuxで見られないのはいかがなものかという話の流れで)。

2010/11/19追記: UStreamでMalcolm Grovesさん出演の事前放送が行われるとのことです。

2010/11/25 17:00-17:15(JST) 12月7日まで待てない!デベロッパーキャンプ事前放送 - 第1回
2010/11/26 12:00-12:15(JST) 12月7日まで待てない!デベロッパーキャンプ事前放送 - 第1回(再放送) (リンク先の日付が11/19になっていますが、11/26が正しいはず)

2010/11/27追記: Team Japanに関連アーティクルが出ています。

Team Japan » 12月7日は第18回 エンバカデロ・デベロッパーキャンプです

2010/11/30追記: UStreamでJason Tiretさん出演の事前放送が行われます。

2010/12/02 17:00-17:15(JST) 12月7日まで待てない!デベロッパーキャンプ事前放送 - 第2回
2010/12/03 12:00-12:15(JST) 12月7日まで待てない!デベロッパーキャンプ事前放送 - 第2回(再放送)

2010/12/02 追記: Team Japanに会場へのアクセスについてのアーティクルが出ています。

Team Japan » 第18回 エンバカデロ・デベロッパーキャンプ会場へのアクセス

2010年10月28日

CodeRage 5 セッションリプレイ

CodeRage 5セッションリプレイが見られるようになりました。

個人的に要チェックなセッション(全部は無理だろうけど):
また一部ですがスピーカの方々によるセッション資料、サンプルコードの公開も行われています。

Marco Cantuさん(Day 1: Session 1/2, Day 2: Session 14/15)
CodeRage 5 Slides and Code Downloads

Cary Jensenさん(Day 2: Session 20)
28044 CDSDemo Simple ClientDataSet Demonstration

John Kasterさん(Day 5: Session 57)
28067 Deep dive into dbExpress CodeRage 5 slides
DbxUtils(svn)

2010年10月25日

WMI Delphi Code Creator

RRUZ(Rodrigo Ruz)さんによるDelphiでWMI(Windows Management Instrumentation)を扱うコード(コンソールアプリケーションおよびアクセスメソッド)を生成するツール。興味深い。とりあえずメモ。

WMI Delphi Code Creator « The Road to Delphi – a Blog About Delphi Programming (mostly)

ただしWindows 2000では正常に動作しません(GetText_メソッドがサポートされていないというエラーが発生します)。

2010/10/26追記: WMI Delphi Code Creatorが1.0.0.1から1.0.0.11に更新されています。

WMI Delphi Code Creator – New Features « The Road to Delphi – a Blog About Delphi Programming (mostly)

インストーラ形式になったほか、生成したコードを直接コンパイル/実行したりDelphiのIDEで開く機能や、WMIのメソッド呼び出し/イベントのサポートなどが追加されています。

2010/11/29追記: OSによりWMIのインタフェースのサポートするメソッドが異なるので注意しましょう、という補足記事が出ています。

Be careful when you import the Microsoft WMIScripting Library « The Road to Delphi – a Blog About Delphi Programming (mostly)

てきとうな要約: Microsoft WMIScripting LibraryをDelphiのインポートウィザードで取り込んで生成したWMIのインタフェースは環境(というより"%System32%\wbem\wbemdisp.TLB")に依存してしまうため、新しいOSで追加されたインタフェースには気をつける必要がある。環境に依存しないようにするには、対応する予定のOSの最も古いもののインタフェースのみを使用する。例としてあげられているISWbemObjectSetのItemIndexメソッドはWindows XPには存在しないがWindows 7には存在するため、気付かずにItemIndexを使用しているとWindows XPで実行時にアクセスバイオレーションを引き起こしてしまう。これを防ぐにはItemIndexを使用せず、代わりに_NewEnumメソッドで取得したIEnumVariantインタフェースのNextメソッドを使用する。

2010年10月22日

InterBase XEリリース

どうやらInterBase XEがリリースされているようです。バージョンはWindows x86が10.0.0.247、Windows x64が10.0.0.258となっています。まだ日本語の情報は出ていないようなので、英語の登録、導入、ライセンスに関する情報のリンクを再掲しておきます。

Embarcadero InterBase News - New InterBase XE
Download a Free Trial for InterBase

Installation, Registration, and Licensing Information for Embarcadero ® InterBase® XE
InterBase XE Readme

2010年10月21日

Firebird 2.5 日本語インストーラリリース

Firebird日本ユーザ会からFirebird 2.5(Win32)の日本語インストーラがリリースされています。ただし
本インストーラーのFirebirdは、はやしがMS VisualStudio2008でビルドしたものです。公式に配布されているバイナリはVisualStudio2005でビルドされているもので、必要なMSのランタイムライブラリのバージョンが違っています。必要なランタイムライブラリはインストーラーがインストールしますが、問題がある場合には英語版の公式インストーラーをご利用下さい。
とのことなので注意が必要です。ダウンロードページからダウンロード可能です。

元ねたはFirebird News » Japanese Firebird 2.5.0 installer is ready (Windows 32-bit versions)

2010年10月15日

FFR yarai 脆弱性防御機能 for Windows 2000 動作検知用スクリプト

Windows 2000(Service Pack 4)は2010/07/13で延長サポートフェーズが終了しています。企業などでは延長サポートが終了したOSはPCごと更新してしまうのが望ましいわけですが、色々な(お金やリソースの)事情でなかなか更新できない、ということもあります。そのような場合の延命策のひとつとして、フォティーンフォティ技術研究所(FFR)のFFR yarai 脆弱性防御機能 for Windows 2000(yarai2000)を導入している場合もあるのではないでしょうか。ところがこのツール、異常な動作を検知してもイベントログにイベントを記録するだけで、ユーザに明示的に通知するようにはなっていません。そこでyarai2000がイベントログにイベントを追加するのを監視して、エラーダイアログを表示するスクリプト(VBS)をでっち上げてみました。
strComputer = "."

Set objWMIService = GetObject("winmgmts:{(Security)}\\" & _
                              strComputer & "\root\cimv2")

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
                         ("Select * from __InstanceCreationEvent Where " & _
                          "TargetInstance ISA 'Win32_NTLogEvent' " & _
                          "and TargetInstance.SourceName = 'yarai ZDP' ")

Do
  Set objLatestEvent = colMonitoredEvents.NextEvent
  If objLatestEvent.TargetInstance.EventCode = 1 Then
    Call MsgBox("FFR yarai 2000が異常を検知しました。" & _
                vbCrLf & vbCrLf & _
                "メッセージ: " & _
                objLatestEvent.TargetInstance.Message & _
                "イベントコード: " & _
                objLatestEvent.TargetInstance.EventCode, _
                vbYes + vbError,"Error")
  End If
Loop
このスクリプトを拡張子.vbsで適当な場所に保存し、
%windir%\system32\cscript.exe <scriptfile>
(<scriptfile>は保存したスクリプトのフルパス名)という内容のコマンドラインをスタートアップで最小化状態で起動しておけば、yarai2000が異常を検知したときにエラーダイアログを表示して知らせてくれます。

元ねたはMicrosoft | TechnetHey, Scripting Guy! イベント ログで特定のイベントの発生を監視する方法はありますかHey, Scripting Guy! イベント ログ メッセージに特定の単語が含まれるかどうかを監視する方法はありますかスクリプトとは何ですか | スクリプト センターあたり。

2010年10月12日

Delphiのインラインアセンブラ解説

Ernesto De SpiritoさんによるDelphiのインラインアセンブラに関する解説。興味深い。とりあえずメモ。

Inline Assembler in Delphi
将来のMacOS XやLinux、x86以外のCPU(x64、ARM...)のサポートを考えれば、インラインアセンブラは使わない方向に向かうのでしょうが。

2010年10月8日

FastMM 4.97リリース

忘れかけていましたが、FastMMのVersion 4.97がリリースされています。

元ねたは公式フォーラムのThread: FastMM 4.96 available。なにやらマルチスレッド環境下のLockの問題で揉めているようですが…。

2010年10月5日

Delphiのメモリマネージャ(その2)

以前のアーティクルで標準メモリマネージャ、FastMM中村さんのNkMMの3種類のメモリマネージャについて触れましたが、これ以外に2種類のメモリマネージャを見つけました。

TopsoftwareのIvo TopsさんによるTopMemoryManager(最新版はv3.55)は、標準メモリマネージャやFastMMに比べて特にマルチプロセッサ、マルチスレッド環境下でのパフォーマンスが優れているとのことです。ドキュメントによれば特にライセンス条件はなく、自由に使用して構わないようです。

一方でIntelのTBB(Threading Building Blocks)を使用したZach SawさんによるTBBMM(最新版は09-09-2010)というものもあります。こちらはBorlndMM.dllを置き換えてTBBを呼び出すようにするようです。TBBのライセンスは"GPL v2 with Run-time Exception"となっていて、商用製品にも組み込み可能なようです。XLsoftのIntel TBBの"お知らせ"のFAQの項にある
TBB ライブラリーのオープンソースは GNU Runtime Exception (GNU GPLv2) を採用しています。そのため、TBB ライブラリーのソースコードに何も変更を加えていない場合はソースコード開示義務は発生しないとインテル社では考えております。最終的には御社法務ご担当者のご判断に基づきます。
という表現からも特に問題にはならないと思われます。これ以外のTBBMM.dllとBorlandMM.dllは自由に配布してよい、となっています。

元ねたは公式フォーラムのThread: FastMM 4.96 available

2010年10月4日

Firebird 2.5リリース

長い間登場が待ち望まれていたFirebird Ver2.5が(ついに)リリースされています。

Firebird File Repositories(download)
Firebird 2.5 Release Notes

また2010/10/05 01:00(JST)からFirebird Foundation代表のPhilippe MakowskiさんとリードデベロッパのDmitry YemanovさんによるLaunch Webinarが行われます。

2010年10月1日

2010/10開催のウェブセミナー

2010/10/04 21:00-2010/10/05 09:45(JST) CodeRage 5 Day 1
2010/10/05 21:00-2010/10/06 09:45(JST) CodeRage 5 Day 2
2010/10/06 21:00-2010/10/07 09:45(JST) CodeRage 5 Day 3
2010/10/07 21:00-2010/10/08 09:45(JST) CodeRage 5 Day 4
2010/10/08 21:00-2010/10/09 03:45(JST) CodeRage 5 Day 5
2010/10/21 17:30-18:30(JST) 10/21 - Webセミナー「RadPHPで始めるビジュアルWebプログラミング」

CodeRage 5は英語で深夜で、となかなか厳しいですが、面白そうなセッションが結構ありますし後でセッションリプレイが見られるようになるとのことなので、可能な範囲でトライしてみましょうか。

2010年9月29日

Microsoft OOB Update 2010/09

Microsoftの定例外のセキュリティアップデートがリリースされています。
MS10-070

2010/09/30追記: MS10-060と同様に、MS10-070の.NET Framework 1.1 SP1/2.0用の更新プログラム(ファイル名がNDP1.1sp1およびNDP20で始まるもの)はWindows 2000 SP4/XP SP2にも適用可能なようです。

2010年9月28日

LockWindowUpdateとWM_SETREDRAW

Raymond ChenさんのThe Old New ThingLockWindowUpdate (ja)(とWM_SETREDRAW)に関する興味深い一連のアーティクルがありました。
てきとうな要約:
  • LockWindowUpdateはシステム(デスクトップ)全体で1つのウィンドウしかロックできない。
  • LockWindowUpdateはドラッグ操作(アイテムのドラッグアンドドロップやウィンドウのドラッグ)でウィンドウの描画更新を止めるときに使う(本来はそのために存在している)。
  • LockWindowUpdateで描画更新を止めているウィンドウに追加的に描画を行う必要があるときはGetDCEx (ja)のflagsにDCX_LOCKWINDOWUPDATEを含めて作成したDCに描画する。
  • それ以外の状況ではLockWindowUpdateではなくWM_SETREDRAWを使用するべきである。
  • LockWindowUpdateはWindows 3.1(Win16)のリソースが限定されていた時代に作られたもので、いまどきはDirectXオーバレイ、リージョン化ウィンドウ、レイヤードウィンドウ、アルファブレンド、デスクトップコンポジションといったものがあるのだから、これらでエフェクトをかけるほうが多機能だし望ましい。

The Old New Thingは書籍(日本語訳はWindowsプログラミングの極意)にもなっていますが、MSDNのリファレンスには載っていない色々な"理由"を解説してくれる素晴らしいblogです(英語なので厳しいですが…)。

2010年9月27日

Windows 7のタスクバーの制御

Delphi 2010で追加されたWindows 7サポート機能を使用して、Windows 7のタスクバーの拡張機能であるプレビューにボタンを追加したりプログレスを表示したりする方法を説明した記事。興味深い。とりあえずメモ。

Dr.Bob Examines... #125: Fun with the Windows 7 Taskbar

またJEDI Windows APIUsing Windows 7 Taskbar-features via componentsという記事経由の情報で、theunknownones - Project Hosting on Google CodeにDelphi 2006-2009で使用できるTaskbarListComponentsというコンポーネントセットもあります(JEDI Windows APIが必要)。ただしライセンスがGNU LGPLとなっていて、Delphiのコンポーネントは実行時パッケージを使わない限り静的リンクでありLGPLv2の6a項あるいはLGPLv3の4d0項に該当する可能性が高いため、商用アプリケーションでは非常に注意が必要と考えられます(Wikipedia(ja)のLGPLの解説を参照)。

日本語の情報では第15回エンバカデロ・デベロッパーキャンプ

【B6】Delphiテクニカルセッション「Delphi 2010 で探る! Windows 7 新機能」

細川さんのプレゼンテーション資料のp.15-22も非常にわかりやすく、参考になります。またこの資料にもあるアプリケーションユーザモデルID(グループ化やジャンプリストで必要になる)についてはMSDNの

アプリケーション ユーザー モデル ID (AppID)
SetCurrentProcessExplicitAppUserModelID Function (Windows)

に説明があります。

2010/09/28追記: Daniel Wischnewskiさんによる"Windows 7 Component Library"がCode Crunching - Windows 7 Components - Betaからダウンロードできます(betaですが)。こちらはコンポーネントライブラリを作るのに使うならGPLで、アプリケーションに使うならGPL/LGPL/MPLのいずれかで、というライセンスになっています。benokさん、情報ありがとうございます。

2010年9月24日

RAD Studio XEのヘルプについて

Dee EllingさんNotes for XE Helpによれば、RAD Studio XEの(ローカル)ヘルプにはデフォルトでMicrosoft SDKヘルプが含まれないようになっているとのことです(インストール時のオプションで含めることも可能)。また最低でも2回のアップデートを予定しているそうです。

またオンラインヘルプ(docwiki)はRAD Studio XEのものが

Online Help for RAD Studio XE (ja)

に配置されているのに対して、RAD Studio 2010のものも

Online Help for RAD Studio 2010 (ja)

から見ることができるようになっています。検索もGoogleベースになっています。また"Recent changes"(MainVCLCodeSample)およびそのRSS/ATOMで更新状況を確認できます。

ところでMicrosoftはVisual Studio 2010でDocumentExplorer(hxs形式)を放棄してヘルプをwebブラウザベースに変更したようですが、RAD Studioはどうするのでしょうか?

2010年9月22日

InterBase Expressについての解説

InterBase Expressを使用しているプログラムでTIBTransactionの設定を変更しようと思い、詳細な情報をOnline Help (ja)で探してみたのですが、現在のGetting Started with InterBase Express - RAD Studio (日本語はInterBase Express の概要 - RAD Studio)には有用な情報が皆無でした。そこであちこちさまよった結果、Internet ArchiveでBorland(borland.co.jp)のころの解説を見つけました。
またこれらのページの元となったと思われるEDNのIntroduction to InterBaseExpressというアーティクルやIBPhoenixIntroduction To InterBase Express (IBX)というページも見つかりました(どちらも内容はほぼ同じだけどborland.co.jpの日本語のもののほうが詳しい)。

2010年9月21日

InterBase XE World Tour

ちょっと前にInterBaseの次期バージョンがInterBase XEになるという情報がありましたが、InterBase XE World Tourが2010/09/21(フランクフルト/ドイツ)、22(アムステルフェーン/オランダ)、29(モスクワ/ロシア)の日程で行われるようです。ここでもう少し具体的な情報が出てくるのかもしれません。

と書いた直後にInterBase XEのページがオープンになっています。新機能としては
  • Stronger password protection with SHA-1 cryptographic hash function
  • Support for Dynamic SQL in Stored Procedures
  • Support for increase buffer caches for improved performance
  • Optimized performance of large objects with Stream methods
  • Improved scalability with the ability to handle 8 times more data
  • 64-bit native binary application
  • Table-Specific Blocking Factors
  • Larger index key segment size
  • Support for larger external files
が挙げられていますが、一方で動作環境からWindows 2000(SP4)およびWindows Server 2003が削除されています。

元ねたはAndreano LanusseさんのSoftware Development, technologies and other matters #2

2010/09/24追記: InterBase XEのインストール、登録、ライセンスに関する情報とReadmeが公開されています。リリースは近いということでしょうか。

Installation, Registration, and Licensing Information for Embarcadero ® InterBase® XE
InterBase XE Readme

2010年9月17日

Windows Updateのデータストアをクリアする(Windows 2000/XP/Server 2003)

Windows Update/Microsoft Updateはデータベースやログを%windir%\SoftwareDistribution\DataStoreに保存します。このデータが極端に大きくなったり、データの不整合が発生してWindows Update/Microsoft Updateでエラーが発生することがあります。このような場合は以下の手順でDataStoreの内容をクリアする必要があります。
  1. サービスマネージャで"Automatic Update"サービスを停止する。
  2. %windir%\SoftwareDistribution\DataStoreフォルダの内容の全て削除する。
  3. サービスマネージャで"Automatic Update"サービスを開始する。

ただしDataStoreの内容をクリアすると、Windows Update/Microsoft Updateで非表示にした項目などの設定がすべてクリアされるので注意が必要です。

元ねたはWindows Update サイトで利用可能な更新を検索すると 0x80248013 エラーが表示される

2010年9月16日

フォルダのDACLを設定する

JEDI Windows Security Library(JWSCL)を使用してフォルダのセキュリティの詳細設定(随意アクセス制御リスト、Discretionary Access Control List(DACL))を設定する方法を解説した記事。興味深い。とりあえずメモ。

Setting Folder Security by JEDI Windows API

2010年9月15日

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

会場なう。受け付け開始。地下2階でもFOMAはアンテナ2本。後は電源か。

Developer Camp Live (USTREAM)でストリーミング配信されています。

午前のジェネラルセッションは終了。G1のプレゼンテーションの資料は後で配布されるのでしょうか?
ところでTrack Aのセッション資料の半分はA4なんですが…。

無事に終了しました。スピーカおよび関係者のみなさま、おつかれさまでした。

USTREAMで中継したものはdeveloper-camp-japan on USTREAMで見られます。

2010/09/21追記: セッション資料および一部のセッションのサンプルコードがダウンロードできるようになっています。

第17回 エンバカデロ・デベロッパーキャンプ - セッション資料ダウンロード

Microsoft Monthly Update 2010/09

今日はMicrosoftのセキュリティアップデートの日です。
MS10-061
MS10-062
MS10-063
MS10-064
MS10-065
MS10-066
MS10-067
MS10-068
MS10-069

2010年9月13日

JVCL 3.40リリース

JVCL(JEDI Visual Component Library)がアップデートされてVersion 3.40(JCL Version 2.2.1)になっています。

Browse JEDI VCL for Delphi Files on SourceForge.net

元ねたは公式フォーラムのThread: ANN: JVCL 3.40 Released!

2010年9月12日

IDE Fix Pack 3.5/DDevExtensions 2.1リリース

Andreas HausladenさんIDE Fix Pack 2009/2010/XEがアップデートされてVersion 3.5に、DDevExtensionsもアップデートされてVersion 2.1になっています。またDDevExtensions 2.0 snapshot for Delphi 2007もリリースされています(Delphi 2007用のDDevExtensionsの正式版は1.61)。

Andy’s Blog and Tools » IDE FixPack, DDevExtension and AsyncCalls updates for 2009/2010/XE

2010年9月10日

リモートデバッガの使い方

Delphi Wikiにリモートデバッガの使い方を説明したRemote Debugger - Delphi Programmingというページがあります。忘れがちなのでメモ。

てきとうな要約:
  • ターゲットマシンではリモートデバッガを"-listen"オプション付きで実行しておく。

  • Delphi 2009 ESD版にはリモートデバッガのインストーラがないので
    • bccide.dll
    • bordbk120.dll
    • bordbk120N.dll
    • comp32x.dll
    • DCC120.dll
    • rmtdbg120.exe
    をコピーして
    regsvr32 /s bordbk120.dll
    regsvr32 /s bordbk120n.dll
    とする。

  • リモートデバッグの対象となるプロジェクト(当然デバッグビルド)のオプションのリンカオプションで"(TD32)デバッグ情報"と"リモートデバッグシンボル"を含めるようにする。

  • ターゲットマシンにリモートデバッグ対象のアプリケーションをコピーしたら、[実行]→[プロセスのロード]で"リモート"を選択して、"リモートパス"にはターゲットマシン上のプログラムのフルパスを、"リモートホスト"にはターゲットマシンのIPアドレスを、"作業ディレクトリ"にはターゲットマシン上のプログラムの配置パスを、それぞれ指定し("パラメータ"は必要に応じて)、[読み込み]ボタンをクリックするとターゲット上でプログラムがロードされて実行可能になる。

元ねたはCannot get the remote debugger for Delphi 2007 to work correctly? - Stack Overflow

2010年9月9日

RAD Studio XE スニークプレビュー その6

一応スニークプレビューの最後のまとめということで。

シニアソフトウェアデベロッパのMat DeLongさんのところ。QAディレクタのChris Pattinsonさんのところ。Uwe Schusterさんのところ。Team JapanMichael Rozlogさんのところ。Twitterの某所さんのまとめ。DEKOさんのところ。Jeroen Pluimersさんのところ。Cary Jensenさんのところ。Robert Loveさんのところ。Andreas Hausladenさんのところ。Mason Wheelerさんのところ。A7Mさんのところ。Barry Kellyさんのところ。Darren Kosinskiさんのところ。Tim Del Chiaroさんのところ。Alexandru Ciobanuさんのところ。
またXE発売記念のキャンペーンをやるようです。
RAD Studio/Delphi/C++Buider 2005およびそれ以前のバージョンからは
XE Professional 特別アップグレードキャンペーン (2010/12/25まで)

RAD Studio/Delphi/C++Buider 2006およびそれ以降のバージョンからは
Delphi / C++Builder / RAD Studio XEシリーズ 早期バージョンアップ申込キャンペーン (2010/09/30まで)

2010年9月8日

Firebird 2.5がまもなくリリースへ

Firebird NewsFB 2.5 final is comingによれば、現在Firebird 2.5の最終版のリリースを準備中とのことです。

2010/10/01追記: Firebird NewsFirebird 2.5 will be released October 4, 2010によればFirebird 2.5は2010/10/04にリリースされるようです。またLaunch Webinarを2010/10/05 01:00(JST)から予定しているとのことです。

WindowsのSNP(Scalable Networking Pack)を無効にする

ITpro[Windows 7編]ネットワーク設定を標準で使ってはいけない - ITアーキテクトの「やってはいけない」:ITpro (要登録)という記事がありました。
SNP(Scalable Networking Pack)という機能がWindows Server 2003 Service Pack 2で導入されています。MicrosoftによるとSNP とは TCP に関するネットワーク処理を、ネットワーク インターフェース カード (NIC) および NIC のミニポート ドライバーを利用して最適化するためのテクノロジー及びその実装の総称です。ということですが、例によって熟成不足で、SNPを有効にしているとネットワーク関係が安定しなくなるなどの問題が生じているようです。この問題についてはMicrosoft日本法人のAsk the Network & AD Support Teamに詳しく解説されていますが、SNP の有効化により効果が期待できるような環境は、10 GbE 程度の NIC を搭載し、数 Gbps 程度の通信を頻繁に行うような環境となります。ということなので、通常の環境ではSNPを使用する必要は全くない、ということになります。ところがWindows Vista/7では標準でSNPが有効になっているため、以下のように明示的に無効化する必要があります。なおWindows 8/Server 2012ではRSSのみ既定で有効、TCP Chimney Offloadは既定で無効、NetDMAは機能削除となっています。

Windows Vista/Server 2008の場合
RSSおよびTCP Chimney Offloadを無効にするには管理者権限を持つコマンドプロンプトから
netsh int tcp set global rss=disabled
netsh int tcp set global chimney=disabled
とします。これに加えてNetDMAを無効にするためにレジストリの
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
のEnableTCPA(DWORD値)(存在しなければ作成する)の値を0に変更して再起動する必要があります。

Windows 7/Server 2008 R2の場合
RSS、TCP Chimney Offload、NetDMAを無効にするには管理者権限を持つコマンドプロンプトから
netsh int tcp set global rss=disabled
netsh int tcp set global chimney=disabled
netsh int tcp set global netdma=disabled
とします。

Windows 8/Server 2012の場合
RSS、TCP Chimney Offloadを無効にするには管理者権限を持つコマンドプロンプトから
netsh int tcp set global rss=disabled
netsh int tcp set global chimney=disabled
とします(NetDMAは機能削除されており、設定不要)。

現在の設定を確認するにはコマンドプロンプトで
netsh int tcp show global
とします。

なおWindows 7/Server 2008 R2以外でSNPをを有効にする場合は修正モジュール、修正プログラム、回避策の適用が必要ですので注意してください。

2011/07/01追記: 現在の設定の確認方法を追加しました。

2013/03/07追記: Windows 8/Server 2012に関する記述およびマイクロソフト Network & AD サポートチーム公式ブログのWindows 8/Server 2012に関する記事のリンクを追加しました。

2010年9月7日

2010/09開催のウェブセミナー

2010/09/17 12:30-13:30(JST) Webセミナー - デベロッパーキャンプ・リキャップ「いよいよ登場!RAD Studio XEの新機能」
2010/09/21 17:30-18:30(JST) Webセミナー - デベロッパーキャンプ・リキャップ「いよいよ登場!RAD Studio XEの新機能」

いずれもエンバカデロ Webセミナー 参加申込フォームから申し込むことができます。

2010/09/27追記: RAD Studio XE製品デモのページから"Webセミナービデオ - デベロッパーキャンプ・リキャップ「いよいよ登場!RAD Studio XEの新機能」"を見られるようになっています(mp4形式)。

2010年9月5日

FastMM 4.96リリース

FastMMのVersion 4.96がリリースされています。いくつかの機能拡張のほかにDelphi/C++Builder XE対応も行われています。

元ねたは公式フォーラムのThread: FastMM 4.96 available

2010年9月3日

RAD Studio XEのhotfixを準備中

DEKOさんが予言をしている DEKOさんが予言をしているようですが、公式フォーラムのThread: Delphi XE memory leak?にあるように、Delphi 2009/2010/XEに
var
  i: Integer;
begin
  if i < (
end;
と")"で閉じていない"< ("があるときにメモリを食い尽くしてしまうという不具合があるようです(QC87753としてレポートされています)。 John Kasterさんによれば既にhotfixが準備されているとのことです。またAndreas Hausladenさんによる非公式なバイナリパッチ(de) (en訂正分)も公開されています。

ちなみにDelphi 2009/2010のhotfixが用意されているのかどうかはわかりませんが、必要な方は上記のスレッドでリクエストしてみたらいいと思います。