2010年12月27日

[書籍]土木建築エンジニアのプログラミング入門

オンラインの日経BP書店

土木建築エンジニアのプログラミング入門/フォーラムエイト著/日経BP/ISBN 978-4-8222-6621-9/2,940円

を購入。この間のデベロッパーキャンプでフォーラムエイトの宮本さんが『近日中にAmazonでも扱いが始まるはずです』といっていましたが、待つのも面倒なので…。全ページ多色刷り、CD-ROM付きで豪華です。

2010年12月22日

Windowsのテストに便利なツールとその使用法

Windows 7/Server 2008 R2上でテストを行うためのツール類とその使用方法を紹介するドキュメントをMicrosoftが公開しています。

Windows のテストに便利なツールとその使用法

紹介されているツールとその使用方法(要約):
  • システムイメージの作成と復元: Windows Automated Installation Kit (WAIK)
  • デバイスのプラグアンドプレイ(PnP)関連のテスト: Plug and Play Driver test (Pnpdtest.exe) (WDKに付属)
  • システムのスリープ・レジュームの移行を自動的に繰り返し実行: Power Management Test Tool (Pwrtest.exe) (WDKに付属)
  • アプリケーションの動作を検証: Application Verifier
  • ネットワークパケットを監視・分析: Network Monitor
  • Windowsポータブルデバイス(WPD)の動作をモニタ: WPD Monitor (WPDMon.exe) (WDK)
  • 問題の再現手順を簡単に記録: 問題ステップ記録ツール (Problem Steps Recorder) (Windows標準)
  • マネージアプリケーションの例外とコールスタックを取得: WinDBG (Windows SDK)
  • カーネルモードドライバ内のエラーを検出: Driver Verifier (Windows標準)
  • ブルースクリーンの問題を調査: Debugging Tools for Windows (Windows SDK)

紹介されているツールのダウンロードリンク:

2010年12月21日

[書籍]デザインのためのデザイン

ジュンク堂書店の吉祥寺店

デザインのためのデザイン (amazon)/Frederick P. Brooks, Jr.著/松田晃一、小沼千絵訳/ピアソン桐原/ISBN 978-4864010047/3,780円

を購入。

2010年12月17日

InterBaseのバックアップ、ジャーナル機能

かなり前になりますが、InterBase 2007以降の新機能の物理バックアップ、ジャーナル関係の興味深いアーティクルがいくつか。

InterBaseのバックアップ機能について
InterBaseのジャーナル機能について
InterBase 2007稼働中にシステム時間を変更した場合の影響について

てきとうな要約:
  • InterBase 2007以降では
    • 従来のフルバックアップ("gbak -b"でODS非依存のバックアップファイルが作成される)
    • 物理バックアップ("gbak -d"で現状の.IBのコピーが作成され、"gbak -d"毎に変更のあったページのみがインクリメンタルに更新される)
    の2種類のバックアップが可能。物理バックアップしたファイルは読み込み専用の状態になっており、"gfix –mode read_write"で書き込み可能(つまりオリジナルと同等)になる。
  • 一方InterBase 2007以降のジャーナルはデータベースに対して"CREATE JOURNAL"とすることでジャーナルファイルが作成されるようになる。更に"CREATE JOURNAL ARCHIVE"とすることでジャーナルアーカイブ機能が有効になり、この状態で"gbak –archive_journals"でジャーナルアーカイブファイルが、"gbak –archive_database"でアーカイブデータベースダンプファイルが、それぞれ作成される。このジャーナルアーカイブファイルとアーカイブデータベースダンプファイルを使用して"gbak –archive_recover"とすることでデータベースを復旧することができる。ジャーナル関係のファイルはバックアップ関係のファイルとは異なりプラットフォーム依存。
  • 運用中にシステム時刻が変更された場合、物理バックアップのインクリメンタルな更新やジャーナルに影響を及ぼすので要注意。

InterBase Serverサービスを停止しなくても"gbak -d"で安全にコピーが取れるようになったということですね。

2010年12月16日

BDE Alternatives Guide

先日のデベロッパーキャンプでも再三BDEはやめましょう、という話が出ていましたが、こんなページがありました。

Data Access for Delphi

BAG="The BDE Alternatives Guide"ですね。

元ねたはNick HodgesさんFlotsam and Jetsam #17

2010年12月15日

Microsoft Monthly Update 2010/12

今日はMicrosoftのセキュリティアップデートの日です。
MS10-090
MS10-091
MS10-092
MS10-093
MS10-094
MS10-095
MS10-096
MS10-097
MS10-098
MS10-099
MS10-100
MS10-101
MS10-102
MS10-103
MS10-104
MS10-105
MS10-106

月間17件、年間106件とも過去最多の数字になります。攻撃手法の進化はあるにせよ、Microsoftの"新しいOSはセキュア"といういつもの主張はお題目に過ぎないことがわかります。頑張っていることはわからないでもないのですけれども…。

2010年12月14日

Delphi/C++Builder初学者のための資料

Delphi-MLや先日のデベロッパーキャンプでも話が出ていましたが、これからDelphi/C++Builderを始めようとすると、入門書の類いはほとんどなく、またヘルプにもチュートリアル的な内容(に限りませんけどね…)がろくに存在しないため、系統的にDelphi/C++Builderを学ぶのが意外に難しい、というのが今の状況です。そこでこのような人のために、入手可能性がそれなりな情報を集めてみました。ただし環境がTurboだったり2007だったり2009だったり、あるいは書籍はもっと古かったりしますが、そこは適当にスルーということで。またデータベース関係についてはDBXのもの以外は軽く読み飛ばしてしまって構いません(いまさらですから)。

EDN(Embarcadero Developer Network): エンバカデロ・テクノロジーズの運営する開発者向情報サイト。過去に入門的な内容のアーティクルがいくつか掲載されました。

EDN/Delphi/ナッキーの「Turbo Delphiはじめて奮戦記」
ナッキーの「Turbo Delphiはじめて奮戦記」(全24回)

EDN/Delphi/ナッキーの「Delphiでビジネスアプリ奮闘記」
第1回 CSVファイルをデータベースへ移行する その1
第2回 CSVファイルをデータベースへ移行する その2
第3回 データベースのレコードを編集する
第4回 データベースのレコードをCSVファイルに保存する

EDN/C++Builder/石原高のオレ流C++独学塾
第1回 オレ流Hello World
第2回 C言語の知識で挑むC++Builder
第3回 CSVファイルを処理してみる
第4回 長い処理をスレッドで実行する

EDN/C++Builder/C++Builder 2009 ファーストガイド
第一回 「C++Builder 2009のインストールと使用許諾」
第二回 「C++Builder2009の起動と終了」
第三回「総合開発環境(IDE)の説明」
第四回「プログラミング手順(前編)」
第五回「プログラミング手順(後編)」
第六回「C++基礎知識(前編)」
第七回「C++基礎知識(後編)」
第八回 「コンポーネント」
第九回「コンポーネントの作成」
第十回「データベースアプリケーションの作成」

書籍: 昨今の出版不況の影響でDelphi/C++Builderの新しい書籍が出ることは考えにくい状況ですが、古本という形でなら入手可能なものもあるようです。このうちオフィシャルコースウェアはどれか一つあれば十分かなと思います(そういう意味ではDelphi 7のものを入手できればいいかと)。また『ナッキーのDelphiはじめて奮戦記』は上記のEDNの記事の書籍化ですが、まとまっている分読みやすいのではないかと思います。

書籍/オフィシャルコースウェア
Borland Delphi4オフィシャルコースウェア 入門編 (amazon)/服部誠著/インプライズ監修/アスキー/1999年/ISBN978-4756130242/
Borland Delphi 4オフィシャルコースウェア (システム開発編) (amazon)/加藤大受著/アスキー/1999年/ISBN978-4756130259/5,040円
Borland Delphi4オフィシャルコースウェア クライアントサーバシステム構築編 (amazon)/真木保著/インプライズ監修/アスキー/1999年/ISBN978-4756131379/5,460円
Borland Delphi 5オフィシャルコースウェア (基礎編) (amazon)/服部誠著/アスキー/1999年/ISBN978-4756132772/2,940円
Borland Delphi 5オフィシャルコースウェア (応用編) (amazon)/井上勉著/アスキー/2000年/ISBN978-4756133236/
Borland Delphi6オフィシャルコースウェア 基礎編 (amazon)/服部誠著/ボーランド監修/アスキー/2002年/ISBN978-4756140029/
Borland Delphi 6オフィシャルコースウェア 応用編 (amazon)/井上勉著/ボーランド監修/アスキー/2002年/ISBN978-4756140036/
Borland Delphi7オフィシャルコースウェア 基礎編 (amazon)/服部誠著/ボーランド監修/アスキー/2003年/ISBN978-4756142283/2,940円
Borland Delphi7オフィシャルコースウェア 応用編 (amazon)/井上勉著/ボーランド監修/アスキー/2003年/ISBN978-4756142290/5,040円

書籍/一般解説書
Delphiの奇跡―普通のプログラマのための真面目な入門書 (amazon)/吉田弘一郎著/技術評論社/1995年/ISBN978-4774102160/
ナッキーのDelphiはじめて奮戦記 (amazon)/佐竹那月著/カットシステム/2007年/ISBN978-4877831332/
Delphi 4プログラミングバイブル (amazon)/Marco Cantu著/篠原慶訳/インプレス/1999年/ISBN978-4844312734/
Delphi 6 プログラミングバイブル (amazon)/Marco Cantu著/篠原慶、光田秀訳/2002年/ISBN978-4844316343/
Turbo DelphiではじめるWindowsプログラミング (amazon)/日経ソフトウエア編/日経BP/2007年/ISBN978-4-8222-2842-2/2,520円

その他
Seventh Delphi Delphi 入門/旧 Delphi 入門/Delphi FAQ

オフィシャルコースウェアあたりは古い内容そのままで構わないんでPDFにでもして配ってくれませんかね…?

2010/12/15追記: RANさんからコメントを頂いたSeventh Delphiさんのリンクを追加しました(Bloggerはコメントが読みにくいので)。

2010年12月10日

浮動小数点数についての解説

Rudy VelthuisさんによるDelphiにおける浮動小数点数(公式には"実数型")の扱いに関する詳細な解説。興味深い。

Rudy's Delphi Corner - Floating point numbers

元ねたは公式フォーラムのEmbarcadero Discussion Forums: Float operations

2010年12月9日

CONDITIONALEXPRESSIONS

CONDITIONALEXPRESSIONSはVER140(Delphi 6, C++Builder 6, Kylix 1/2/3)以降で使用可能な標準条件シンボルで、$IFに対して値に関する条件を記述できることを示しています(CONDITIONALEXPRESSIONSが未定義なら$IFDEF/$IFNDEFで条件シンボルが定義されているかどうかの判定しかできませんが、定義されていれば値を"="、"<"、"<="、">"、">="、"<>"で比較できます)。

このときに使用できるRTLVersion/CompilerVersion/FireMonkeyVersionは定数で、RTLVersion(System.pasで定義)はVER140以降で使用可能、CompilerVersion(コンパイラがSystem.pasをコンパイルするときに設定)はVER140以降のKylix 1以外で使用可能、FireMonkeyVersion(FMX.Types.pasで定義)はDelphi XE2 Update 2以降のFireMonkeyアプリケーションで使用可能です。

各バージョンにおけるRTLVersion、CompilerVersion、FireMonkeyVersionの値は以下のようになっています。

Kylix 1
RTLVersion=14.00
(未定義)
Delphi 6 (Gold)
RTLVersion=14.10
CompilerVersion=14.01
Delphi 6 (Update Pack 1)
RTLVersion=14.11
CompilerVersion=14.01
Delphi 6 (Update Pack 2)
RTLVersion=14.20
CompilerVersion=14.01
C++Builder 6
RTLVersion=14.20
CompilerVersion=14.01
Kylix 2
RTLVersion=14.20
CompilerVersion=14.10
Kylix 3
RTLVersion=14.50
CompilerVersion=14.50
Delphi 7
RTLVersion=15.00
CompilerVersion=15.00
Delphi 8 for .NET
RTLVersion=16.00
CompilerVersion=16.00
Delphi 2005
RTLVersion=17.00
CompilerVersion=17.00
Delphi 2006
RTLVersion=18.00
CompilerVersion=18.00
Delphi 2007
RTLVersion=18.00
CompilerVersion=18.50
Delphi 2007 for .NET
RTLVersion=19.00
CompilerVersion=19.00
Delphi/C++Builder 2009
RTLVersion=20.00
CompilerVersion=20.00
Delphi/C++Builder 2010
RTLVersion=21.00
CompilerVersion=21.00
Delphi/C++Builder XE
RTLVersion=22.00
CompilerVersion=22.00
Delphi/C++Builder XE2
RTLVersion=23.00
CompilerVersion=23.00
FireMonkeyVersion=16.1(Update 2), 16.2(Update 3), 16.3(Update 4)
Delphi/C++Builder XE3
RTLVersion=24.00
CompilerVersion=24.00
FireMonkeyVersion=17.0
Delphi/C++Builder XE4
RTLVersion=25.00
CompilerVersion=25.00
FireMonkeyVersion=18.0
Delphi/C++Builder XE5
RTLVersion=26.00
CompilerVersion=26.00
FireMonkeyVersion=19.0
Delphi/C++Builder XE6
RTLVersion=27.00
CompilerVersion=27.00
FireMonkeyVersion=20.0
Delphi/C++Builder XE7
RTLVersion=28.00
CompilerVersion=28.00
FireMonkeyVersion=21.0
Delphi/C++Builder XE8
RTLVersion=29.00
CompilerVersion=29.00
FireMonkeyVersion=22.0
Delphi/C++Builder 10 Seattle
RTLVersion=30.00 *
CompilerVersion=30.00
FireMonkeyVersion=23.0
Delphi/C++Builder 10.1 Berlin
RTLVersion=31.00 *
CompilerVersion=31.00
FireMonkeyVersion=240 **
Delphi/C++Builder 10.2 Tokyo
RTLVersion=32.00 *
CompilerVersion=32.00
FireMonkeyVersion=250 **
Delphi/C++Builder 10.3 Rio
RTLVersion=33.00 *
CompilerVersion=33.00
FireMonkeyVersion=260 **
Delphi/C++Builder 10.4 Sydney
RTLVersion=34.00 *
CompilerVersion=34.00
FireMonkeyVersion=270 **
Delphi/C++Builder 11 Alexandria
RTLVersion=35.00 *
CompilerVersion=35.00
FireMonkeyVersion=270 ** ***
Delphi/C++Builder 12 Athens
RTLVersion=36.00 *
CompilerVersion=36.00
FireMonkeyVersion=290 **
* C++Builder 10 Seattle以降のClangベースの新しいC++コンパイラ(#if defined(__clang__))ではRTLVersionではなくRTLVersionCを使用する必要がある→Clang 拡張 C++ コンパイラと旧世代の C++ コンパイラの違いを参照。
** Delphi/C++Builder 10.1 Berlin以降ではFireMonkeyVersion(FMX.Typesユニット)の定義がComp型からInteger型となり、値も240(0xF0)のように10倍になっているため、注意が必要です。
*** Delphi/C++Builder 11 AlexandriaでFireMonkeyVersionが10.4 Sydneyと同じ270と定義されています(不具合と思われます)。

注意しなければならないのは、RTLVersion(C)、CompilerVersion、FireMonkeyVersion(10 Seattleおよびそれ以前)のいずれも実数型の値なので、小数点以下を含むもの(Delphi/C++Builder 6の14.xあたり)は丸めによる誤差を考慮して評価する必要がある、という点です。

実際の使い道としては
  • Kylixのバージョン判定(いまさら)
  • ジェネリクス、無名関数といった新機能のサポート状況の判定
くらいでしょうか(UpdateやHotfixの適用状況がわかるように、もう少し真面目に値を変えてほしいところです)。

StringがAnsiStringかUnicodeStringかは標準条件シンボルUNICODEを使用して
{$IFDEF UNICODE}
// StringはUnicodeString
{$ELSE}
// StringはAnsiString
{$ENDIF}

で判定できますが、ジェネリクス/無名関数が使用できるかどうかは
{$IFDEF CONDITIONALEXPRESSIONS}
{$IF CompilerVersion >= 20.0}
// ジェネリクス/無名関数使用可能(Delphi 2009以降)
{$ELSE}
// ジェネリクス/無名関数使用不可(Delphi 6-2007)
{$ENDIF}
{$ELSE}
// ジェネリクス/無名関数使用不可(Delphi 5以前)
{$ENDIF}

このように判定することができます。

またFireMonkeyVersionはVER230でもRTM/Update 1では定義されていないため、
{$IF Declared(FireMonkeyVersion) and (FireMonkeyVersion > 16.0)}
...
{$IFEND}

のように定義済かどうかの確認も必要です。

元ねたはDelphi Tips - 0086あたりとDelphi XE - Q&A (Internet Archive)。標準条件シンボルと同様に、有効な情報が(ヘルプを含め)あまりないのは改善をお願いしたいところです。

2011/09/02追記: Delphi/C++Builder XE2関係を追加。

2012/09/02追記: Delphi/C++Builder XE3関係およびFireMonkeyVersionに関する記述を追加。

2013/09/12追記: Delphi/C++Builder XE4/XE5関係を追加。

2014/04/15追記: Delphi/C++Builder XE6関係を追加。

2014/09/02追記: Delphi/C++Builder XE7関係を追加。

2015/04/07追記: Delphi/C++Builder XE8関係を追加。

2015/09/01追記: Delphi/C++Builder 10 Seattle関係を追加。

2016/04/20追記: Delphi/C++Builder 10.1 Berlin関係を追加。

2017/03/23追記: Delphi/C++Builder 10.2 Tokyo関係を追加。

2018/11/26追記: Delphi/C++Builder 10.3 Rio関係を追加。

2020/06/01追記: Delphi/C++Builder 10.4 Sydney関係を追加。

2021/09/10追記: Delphi/C++Builder 11 Alexandria関係を追加。

2023/11/09追記: Delphi/C++Builder 12 Athens関係を追加。

2010年12月8日

FreeAdhocUDF version adhoc 20101206リリース

第18回エンバカデロ・デベロッパーキャンプのT6セッションの木村さんのライトニングトークの"UPPERはあってもLOWERがない"ネタで触れられていたFreeadhocUDFの最新版(20101206)がリリースされていました。

元ねたはFirebird News » New version of FreeAdhocUDF released

2010年12月7日

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

会場(池袋のシアターグリーン)へのアクセスについてはTeam Japan » 第18回 エンバカデロ・デベロッパーキャンプ会場へのアクセスを参照のこと。普通は池袋駅からのルートがわかりやすくてよいのでは。
また今回はUStreamとLiveMeeting(要登録)でライブ中継が行われます。

うーん、微妙に狭いのとやはり机がほしいかな…姿勢が不自然で丸一日だと結構疲れます(机がなく常に後傾なのと見下ろしになることの相乗効果で)。電源はありがたいですね(使っている人は他にはあまりいませんでしたが)。

G1:「エンバカデロ・プロダクトアドレス」
  • InterBase XEの日本語版はまもなくリリース予定。
  • Delphiのx64コンパイラのプレビューリリースはクローズドベータなので、参加希望者はエンバカデロにコンタクトしてくださいとのこと。
  • PulsarのIDEはWindows x86のまま(x64ではWOW64で動作)。

T2:「アプリケーション開発者のためのDBべからず集からパフォーマンスチューニングまで」
  • BDEはもうやめましょう。4GB超のドライブに対応していないし。
  • 開発環境は仮想化すると便利。検証とか。
  • Pro SKUでDBX/DataSnapはローカル接続のみ(ライセンス的に)。Ent SKUでDBXにするか、Pro SKUならIBXで。
  • マルチティア化するのにはDataSnapが便利(Ent SKUで)。
  • T*Tableコンポーネントは使わない。T*Queryで結果セットを極力絞り込みましょう(T*Tableは基本的に全件転送します)。
  • データベースアクセスはUIとは分離してDatamoduleに置きましょう。
  • データベーステーブル上のデータをなんでも表示するとパフォーマンスに影響するので、必要なものだけにしましょう。Lookup系の動作にも気をつけて。
  • データベースエンジンそのものの評価も忘れずに。AccessやParadoxはやめましょう、とりあえず。
  • 主キー/外部キー、インデックスは正しく使いましょう。PLANの確認も忘れずに。
  • 追加、変更、削除を繰り返すデータベースはメンテナンスを。バージョンニングを採用しているInterBase/Firebird/PostgreSQLは削除レコードの影響でインデクシングが遅くなる。
  • JOINするときは十分に注意を払って。結果セットのサイズとかOUTER JOINによるNULL値とか。
  • 移行は計画的に。お金、期間は十分ですか?

T3:「つながる!!PHP拡張の極意 - PHPからWebサービスにアクセス」
  • DatasnapではなくREST/JSON/SOAPなどの業界標準でも簡単接続できる。
  • Delphi/C++BuilderでSOAPサーバをコンソール/GUIアプリケーションとして簡単に作成できる(ウィザードあり)。

T4:「開発者の疑問に答える!徹底Q&A」
  • 初学者向の書籍や資料があまりない。古本で探せば安く済ますことができる(内容はある程度そのまま適用可能なので)。→こちらに関連アーティクルを用意しました。
  • 新しいバージョンへのマイグレーションはDEKOさんとことか過去のデベロッパーキャンプのセッションなどを参考に。
  • 新しいDelphi/C++Builderに移行するときは一旦2007にマイグレーションして文字コード(Unicode関連)以外の修正点(データベース関係とかVisualStyleとか)をクリアしてから2009/2010/XEにステップアップしましょう(問題点を局限するために)。その際はプロジェクトだけは作成し直しをお勧め(ライブラリパスが古いものを引きずるとかApplication.MainFormOnTaskBar := True;の行が入らないとか構造体アライメントが1(デフォルトは8)になってしまうとか原因不明な問題を避けるため)。
  • マイグレーションしたら警告がががが、は頑張って消しましょう。大多数はANSI/Unicodeの暗黙的変換についてのものだと思われますが、$WARNで抑止するのは最小限の範囲で。
  • いまどきの開発環境はWindows 7(Pro/Ent/Ult)でvmware/VPC/Hyper-Vなどの仮想環境を利用するのが便利(OSのライセンスには気をつけて)。

T5:「Delphi言語『再』入門 - ビギナーからエキスパートまで!意外と知らない言語機能や落とし穴 」
T6:「共有!みんなの開発事例、開発経験、テクニック 」
懇親会
  • この時期に外は寒い。ストーブで暖まる。
  • ToolCloudそのもの(ライセンス管理システム)も今後OEM的に出していきたい、というかその準備に1年かかった。
  • NTTデータさんは(ライセンス的にもお金的にも)すごい。

無事(?)終了。関係者、参加者の皆さん、おつかれさまでした。

2010/12/09追記: 米澤さんがTwitterのまとめを作ってくれました。

Togetter - 「第18回デベロッパーキャンプ」

2010/12/13追記: なんとなく記憶にあるもの、Togetterられているものについて内容を追記しました。

2010/12/15追記: セッション資料がダウンロードできるようになっています。これに基づいて追記。ただT4とT6の分はありません。UStreamのリプレイがほしいですね…。

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

2010/12/16追記: T4/T6のリプレイが公開されています(セッション資料ダウンロードページからリンクされています)。

第18回 エンバカデロ・デベロッパーキャンプ「開発者の疑問に答える!徹底Q&A」 - channel-e.embarcadero.com
第18回 エンバカデロ・デベロッパーキャンプ ライトニングトーク 「共有!みんなの開発事例、開発経験、テクニック 」 - channel-e.embarcadero.com

2012/05/14追記: T6のリプレイがYouTubeにアップロードされています。

2010年12月6日

Delphiで自己展開アーカイブを作成

RRUZ(Rodrigo Ruz)さんによるDelphiでSFX(Self Extracting Archives)を作成する方法。興味深い。とりあえずメモ。

Create a SFX File with delphi (Self Extracting Archives) « The Road to Delphi – a Blog About Delphi Programming (mostly)

このアーティクルのコードでは実行ファイルにリソースを格納するのにWin32APIのBeginUpdateResource (ja)、UpdateResource (ja)、EndUpdateResource (ja)を、実行ファイルで格納されているリソースを検索するのにFindResource (ja)を使用しています。

2010年12月3日

CanTools Wizards

Delphiのマスタリング/ハンドブックシリーズでおなじみのMarco CantuさんがCanTools Wizardsというウィザードセットを公開しています。

CanToolsW on marcocantu.com

上記のページからDelphi 6(CanToolsW6.bpl)/Delphi 7(CanToolsW7.bpl)/Delphi 7 + Update 1(CanToolsW71.bpl)/Delphi 2007(cantools_2007.bpl)/Delphi 2009(cantools_2009.bpl)/Delphi 2010(cantools_2010.bpl)/Delphi XE(cantools_xe.bpl)のパッケージライブラリ(bpl)がダウンロードできます。

CanTools Wizardsには以下の機能が含まれています。
  • List Wizard
  • OOP Form Wizard
  • Object Inspector Font
  • Rebuild Wizard
  • Clip History Viewer
  • VCL Hierarchy
  • DB Form Wizard
  • No ".net safe" warnings
  • Bookmark list
  • Palette Info
  • Add to project manager for .ini
  • ShowDebug Inspector
  • Publish Project
…試してみましたが微妙な感じですね。

元ねたはMarco CantuさんのCantools Wizards for Delphi XE

2010年11月30日

THTMLWriter

Nick HodgesさんがTHTMLWriterというHTMLを生成するライブラリを公開しています。

Nick Hodges | Announcing THTMLWriter
delphihtmlwriter - Project Hosting on Google Code

ライセンスはMPL 1.1となっています。Generics.Collectionsに依存しているのでDelphi 2009以降の対応になると思われます(開発そのものはDelphi 2010で行っているとのこと)。

2010年11月29日

Stuxnet

今年(2010年)の7月くらいからStuxnetと呼ばれるワーム(マルウェア)が話題になっていました。

W32.Temphid (ja) (Symantec)
Trojan-Dropper:W32/Stuxnet (F-Secure)
WORM_STUXNET.A - 概 要 (Trendmicro)
Stuxnet | ウイルス情報 | マカフィー (McAfee)
キヤノンITソリューションズ:ESET Smart Security & ESET NOD32アンチウイルス:Win32/Stuxnet.A (ESET)

Stuxnetはルートキットの特徴を持ち、複数の攻撃(感染)手段を用意していることに加え、シーメンスSiemens SimaticというPLC(いわゆるシーケンサ - シーケンサは三菱電機株式会社の登録商標ですので、たとえとしては適切ではないかもしれませんが)にアクセスしようとする、という特徴があり、色々な憶測がなされてきました。しかしここにきて多くのセキュリティ関係者の努力により、Stuxnetの正体がほぼ解明された模様です。

エフセキュアブログ : Stuxnetに関する質疑応答
Stuxnet: 画期的な解明 | Symantec Connect
エフセキュアブログ : 「Stuxnet」再び:質疑応答

これらの情報を信じる限り、Stuxnetは西側(おそらくイスラエル)の情報機関がイランの核物質精製施設(ウラン濃縮プラント)の運用を妨害するためのもの、ということのようです。Stuxnetの備える強力な感染力は外部から直接アプローチできない施設に対して間接的に浸透するための手段ということになります。まぁイスラエルはイラクの原子炉を稼動前に爆撃で破壊(Operation Opera)していたりしますから、信じられないこともない話ですが、Stuxnetによる攻撃を考案した人は相当な切れ者だと思われます(いわゆるコロンブスの卵、ですね)。

2011/01/19追記: New York Timesが記事にしたことでまた話題になっているようです。

エフセキュアブログ : 「Stuxnet」に関する新情報

2011/02/16追記: Stuxnetの解析は続いているようです。DoDやNSAからクレームがついたりはしないんでしょうか?

エフセキュアブログ : 「Stuxnet」再び
W32.Stuxnet 調査詳細の改定版を公開 | Symantec Connect

2011/02/21追記: 2011年02月10日にJPCERT/CCが主催して行われた制御システムセキュリティカンファレンス 2011でもStuxnetが取り上げられたようです。

「Stuxnet - 制御システムを狙った初のマルウエア」 - JPCERT/CC 情報流通対策グループ 小熊 信孝

2010年11月26日

Pulsar(Delphi x64)情報

Stack OverflowHow should I prepare my 32-bit Delphi programs for an eventual 64-bit compiler?(来るべき64bitコンパイラに備えて、32bit Delphiのプログラムでどのような準備をしておくべきでしょうか?)という質問に対してBarry Kellyさん非常に興味深い回答をしています。

てきとうな要約:
  • 注意書き: Barry KellyさんはEmbarcaderoに勤務していますが、Embarcaderoを代表した回答ではなく、また64bit版Delphiはこうあるべきであるという仮定に基づいたものであり、設計上異なる選択が行われることになるかもしれません。
  • NativeIntとNativeUIntというプラットフォームにより32bitまたは64bitとなる整数型が用意される。これ以外の整数型はターゲットプラットフォームによりサイズが変化することはない。
  • TComponent.Tagのように整数とポインタをキャストして使用するようなものはNativeInt/NativeUIntに置き換えられる。
  • NativeInt/NativeUIntはポインタとの相互変換を必要とする場合以外には使用するべきではない。これ以外の整数型の変数は従来通りのサイズのものでよい。参照やTHandle、HWNDのようなものだけにNativeInt/NativeUIntを使う。
  • 文字列や動的配列の(ヘッダデータのような)内部の詳細を当てにしてはいけない。
  • (RTLの)APIは可能な限り32bitと64bitの間で維持する、というのが原則になる。たとえばTListの最大要素数もMaxInt div SizeOf(Pointer)のままになる。
  • (RTLの)APIを64bitで拡張する場合、別のfunction/method/propertyでアクセスするようにする。たとえばLength()はそのままで、LongLength()を用意する、というように。
  • これに関連してサイズを縮小する方向の変換(64bitの戻値を32bit整数の変数に代入するような)に関するエラーチェックを強化する。
  • おそらく動的配列は64bitのインデックスをサポートする。
  • おそらく文字列は32bitでインデックスが制限される。実際に文字列が4GBを超える状況を想定できないため。
  • ほぼ確実にビルトインアセンブラ(BASM)はサポートされないが、オブジェクトファイル(.obj)のリンクはサポートされる。

おそらくNativeInt/NativeUIntはINT_PTR/UINT_PTR(Windows Data Types)のまともな名前バージョンです(INT_PTR/UINT_PTRはそのネーミングセンスのなさで有名)。またPulsar(64bit Delphi)でBASMがサポートされない件はフォーラムのDelphi x64 and no build-in ASM = troublesでも話題になりましたが、PulsarにBASMを間に合わせるのは困難だ、という話でした。

元ねたはNick HodgesさんFlotsam and Jetsam #15

2010年11月19日

InterBase 5/6からInterBase XEに移行するとシステムテーブルにアクセスできない問題

Support KB

no permission for read/select access to table RDB$XXXX by user SYSDBA

という記事がありました。興味深い。とりあえずメモ。

てきとうな要約: InterBase 6.5およびそれ以前のバージョンからInterBase XEにデータベースを移行するとSYSDBAでシステムテーブル(RDB$XXXX)にアクセスできない(パーミッションがない)、という問題が発生する。この問題を解決する1番目の方法はシステムテーブルへのアクセスをgrantするもので、InterBaseのインストールフォルダの下の"examples\security\readmeta.sql"をISQLかIBConsoleから実行する。2番目の方法はパフォーマンスモニタリングのためにシステムテンポラリテーブルにアクセスしたい場合のもので、通常はSYSDBAとデータベースのオーナにのみ許可されているシステムテンポラリテーブルへのアクセスを全てのユーザに公開するようなスクリプト(元記事の"create procedure granttmp as"以下の部分)を実行する。

2016/07/17追記: Support KBの記事の日本語訳が出ています。

データベースのリストア時に発生する unassigned code エラーについて

またdocwikiにも記述があります。

移行における問題 - InterBase

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)
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のリンクを追加。

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)