C++Builder 2010 に最新のIndy10を統合する
高橋(智)です。
今日は、Delphi/C++Builderに搭載されているネットワーク用のコンポーネント「Indy10」について書いてみます。このIndy10は、その公式サイトにも記載されている通り、まだ安定版には達しておらず、現在もなお頻繁にアップデート作業が行われています。
そのため、Delphi/C++Builderに付属している版のIndy10の不具合に遭遇した場合には、最新のIndy10を自前でIDEに統合する必要が出てきます。そこで、C++Builder 2010を例にして、その統合手順を書いてみようと思います。(※Delphi 2010の方は統合がかなり簡単なので…)
1. http://indy.fulgan.com/ZIP/ に置かれている最新のDevelopment Snapshotである「IndyTiburon.zip」をダウンロードします。
2. IndyTiburon.zipを展開します。今回は「C:\Indy10」に展開しました。展開する際に、含まれているファイルを更新日付順に並び替えて参照すると、かなりの数のファイルが更新されていることが分かりますね~。変更履歴については、付属の「changelog.txt」を覗いてみてください。

3. C++Builder 2010 を起動して、すべてのファイルを閉じたら、[コンポーネント]-[パッケージのインストール]を選択し、「Indy 10 コア設計時」および「Indy 10 プロトコル設計時」のパッケージを削除してしまいます。
4. さらに、[ツール]-[オプション]ダイアログ内の[パスとディレクトリ]で、[インクルード パス]から $(BDS)\include\Indy10 を削除します。同様に、[ライブラリ パス]から $(BDS)\lib\Indy10 を削除し、[ブラウザ検索パス]から $(BDS)\source\Indy\Indy10\Core $(BDS)\source\Indy\Indy10\System $(BDS)\source\Indy\Indy10\Protocols の3つを削除します。
5. ここでIDEをいったん終了し、コマンドプロンプトを開きます。環境変数PATHに、Delphiコンパイラ「dcc32.exe」のあるフォルダを追加して、dcc32.exeが実行できるようにしておきます。C++Builderのパーソナリティのみがインストールされている場合は、IDEからDelphi向けパッケージプロジェクト(.dpkファイル)を開けないためです。
6. さらに、以降のコマンド実行時に参照する環境変数も以下のように設定しておきます。なお、これらの具体的な場所は、OSやインストールフォルダに合わせて変更する必要があるでしょう。
set DCP="C:\Documents and Settings\All Users\Documents\RAD Studio\7.0\Dcp"
set BPL="C:\Documents and Settings\All Users\Documents\RAD Studio\7.0\Bpl"
set INC="C:\Embarcadero\Rad Studio\7.0\include"
set LIB="C:\Embarcadero\Rad Studio\7.0\lib"
set INDY="C:\Indy10\Lib\System";"C:\Indy10\Lib\Core";"C:\Indy10\Lib\Protocols"
7. C:\Indy10\Lib\System に移動して、IndySystem130.dpk をビルドします。
dcc32.exe -JL -$YD –no-config -B -AWinTypes=Windows;WinProcs=Windows -DDEBUG -I%INDY%;%LIB%;%DCP%;%INC% -LE%BPL% -LN%DCP% -NB%DCP% -NO%DCP% -O%INDY%;%LIB%;%DCP%;%INC% -R%INDY%;%LIB%;%DCP%;%INC% -U%INDY%;%LIB%;%DCP%;%INC% -K00400000 –description:"Indy 10 System" IndySystem130.dpk
8. C:\Indy10\Lib\Core に移動して、IndyCore130.dpk をビルドします。
dcc32.exe -JL -$YD –no-config -B -AWinTypes=Windows;WinProcs=Windows -DDEBUG -I%INDY%;%LIB%;%DCP%;%INC% -LE%BPL% -LN%DCP% -NB%DCP% -NO%DCP% -O%INDY%;%LIB%;%DCP%;%INC% -R%INDY%;%LIB%;%DCP%;%INC% -U%INDY%;%LIB%;%DCP%;%INC% -K00400000 –description:"Indy 10 Core" IndyCore130.dpk
9. 同じフォルダの dclIndyCore130.dpk をビルドします。
dcc32.exe -JL -$YD –no-config -B -AWinTypes=Windows;WinProcs=Windows -DDEBUG -I%INDY%;%LIB%;%DCP%;%INC% -LE%BPL% -LN%DCP% -NB%DCP% -NO%DCP% -O%INDY%;%LIB%;%DCP%;%INC% -R%INDY%;%LIB%;%DCP%;%INC% -U%INDY%;%LIB%;%DCP%;%INC% -K00400000 –description:"Indy 10 Core Design Time" dclIndyCore130.dpk
10. C:\Indy10\Lib\Protocols に移動して、IndyProtocols130.dpk をビルドします。
dcc32.exe -JL -$YD –no-config -B -AWinTypes=Windows;WinProcs=Windows -DDEBUG -I%INDY%;%LIB%;%DCP%;%INC% -LE%BPL% -LN%DCP% -NB%DCP% -NO%DCP% -O%INDY%;%LIB%;%DCP%;%INC% -R%INDY%;%LIB%;%DCP%;%INC% -U%INDY%;%LIB%;%DCP%;%INC% -K00400000 –description:"Indy 10 Protocols" IndyProtocols130.dpk
11. 同じフォルダの dclIndyProtocols130.dpk をビルドします。
dcc32.exe -JL -$YD –no-config -B -AWinTypes=Windows;WinProcs=Windows -DDEBUG -I%INDY%;%LIB%;%DCP%;%INC% -LE%BPL% -LN%DCP% -NB%DCP% -NO%DCP% -O%INDY%;%LIB%;%DCP%;%INC% -R%INDY%;%LIB%;%DCP%;%INC% -U%INDY%;%LIB%;%DCP%;%INC% -K00400000 –description:"Indy 10 Protocols Design Time" dclIndyProtocols130.dpk
12. 再びIDEを起動して、すべてのファイルを閉じたら、[コンポーネント]-[パッケージのインストール]を選択し、以下の2つの設計時パッケージを追加します。
C:\Documents and Settings\All Users\Documents\RAD Studio\7.0\Dcp\dclIndyCore130.bpl
C:\Documents and Settings\All Users\Documents\RAD Studio\7.0\Dcp\dclIndyProtocols130.bpl"
13. さらに、[ツール]-[オプション]ダイアログ内の[パスとディレクトリ]で、[インクルード パス]に C:\Indy10\Lib\System C:\Indy10\Lib\Core C:\Indy10\Lib\Protocols の3つを追加し、それらの順位を先頭にします。同様に、[ライブラリ パス]に C:\Documents and Settings\All Users\Documents\RAD Studio\7.0\Dcp を追加し、これも順位を先頭にします。さらに、[ブラウザ検索パス]に C:\Indy10\Lib\System C:\Indy10\Lib\Core C:\Indy10\Lib\Protocols の3つを追加し、これらの順位も先頭にします。
14. これで完了です。新規にC++BuilderのVCLフォームアプリケーションを作成して、Indy10のコンポーネントをフォームに配置します。プロジェクトのコンパイルとリンクが成功したら、デバッグ実行してみましょう。[表示]-[デバッグ]-[モジュール]のウィンドウに、以下の新しい実行時パッケージがあれはOKです。
C:\Documents and Settings\All Users\Documents\RAD Studio\7.0\Bpl\IndySystem130.bpl
C:\Documents and Settings\All Users\Documents\RAD Studio\7.0\Bpl\IndyCore130.bpl
C:\Documents and Settings\All Users\Documents\RAD Studio\7.0\Bpl\IndyProtocols130.bpl
Share This | Email this page to a friend
Posted by Tomohiro Takahashi on November 2nd, 2009 under C++, Delphi | Comment now »C++Builder/Delphi 2010 ヘルプアップデート1
Twitter等で弊社のサイトをウオッチされている方は既にお気づきと思いますが、
C++Builder/Delphi 2010のヘルプアップデート1が公開されました。
インストールの際に「自動アップデート」をオフにされていた方は、Windowsのスタートメニューより [すべてのプログラム|Embarcadero RAD Studio 2010|更新プログラムの確認]にて確認することができます(注: インターネット接続している必要があります)
詳細につきましてはリリースノートをご参照下さい。
ヘルプアップデート1 リリースノート
Share This | Email this page to a friend
Posted by Chikako Yonezawa on October 30th, 2009 under C++, Delphi | Comment now »続: VCL for PHP の最新版について
高橋(智)です。
はやしさんが執筆されたDelphi for PHPの連載記事が、先日より@IT(アットマーク・アイティ)上で公開されています。
[Delphi for PHPを使い倒す!(前編)- cotorolsクラスの不具合の修正]
http://www.atmarkit.co.jp/fcoding/articles/d4php/01/d4php01c.html
ビジュアル操作でPHPアプリケーションを構築できる簡単さの裏では、JavaScriptやオープンソースなどのさまざまな仕組みが支えております。上の記事で紹介されている(?)ようなライブラリの不具合に遭遇した場合に、原因やその回避方法などを見つけるのは少し苦労しますが、Mixiやfreemlなどのコミュニティやエンバカデロのフォーラムもありますので、一度訪ねてみてください。
ちなみに、今回の不具合はさきほどSorceforge上で修正してチェックインしておきました。この修正を含む最新版を入手するには、以前このブログで紹介した「VCL for PHP の最新版について」のエントリを参考にしてください。
http://vcl4php.svn.sourceforge.net/viewvc/vcl4php/trunk/vcl/?view=log
——
Revision 272 - Directory Listing
Modified Mon Oct 19 05:41:59 2009 UTC (25 seconds ago) by ttakahashi
+Fix: Hidden field is set properly before submitting a form
——
Share This | Email this page to a friend
Posted by Tomohiro Takahashi on October 19th, 2009 under PHP | 1 Comment »@ITで、ただ今連載中(Delphi for PHP, 3rdRail)
@ITにて、Webアプリケーション開発ツール Delphi for PHPと 3rdRailに関する記事が連載されているのをご存知ですか?
■ Delphi for PHP
-
Delphi for PHPを使い倒す!(前編)
筆者は、デベロッパーキャンプ等でおなじみの「はやしつとむ」氏で、この前編では、簡単なアプリケーションを作成しながらイベントの動作の説明も行っています。
■ 3rdRail
-
第8回 Webブラウザー・ツールで動作確認をしよう
筆者は、Banana Systems株式会社の富田 陽介氏で、実は今年の3月からコツコツと連載しています。
この第8回では、今までの連載で作成したアプリケーションの動作確認の手順と、それに関連する事項について説明しています。
Share This | Email this page to a friend
Posted by Chikako Yonezawa on October 9th, 2009 under PHP, Ruby | Comment now »Delphi/C++Builder 2010のBDEで…
高橋(智)です。
QualityCentral(QC)のシスオペとして毎日レポートをチェックしていますが、日々報告されてくる問題を見て初めて知る現象もけっこうあります。最近知ったのですが、Delphi 2010のTQuery(BDE)でパラメータ付きクエリを扱う際に、そのパラメータに文字列をセットする処理がDelphi 2009と異なっているようなのです。
具体的なQCの報告としては以下の2つとなります。
[tquery string parameter bug]
http://qc.embarcadero.com/wc/qcmain.aspx?d=78037
[Error ParamByName result IsEmpty]
http://qc.embarcadero.com/wc/qcmain.aspx?d=77939
まず、ParadoxにBDEのTQueryを使って、SELECT * FROM biolife WHERE Common_Name=:Common_Name というパラメータ付きクエリを設計します。
文字列として処理される「:Common_Nameパラメータ」に、TEditのTextプロパティを設定するコードを書きます。この時、いままでどおり「AsStringプロパティ」を使おうとするのですが、Delphi 2010ではなぜかクエリの結果が空になってしまいます。Delphi 2009では問題無かったのですが…
現時点では、Delphi 2010では以下のように、Unicode文字列対応の「AsStringプロパティ」ではなく、Ansi文字列版の「AsAnsiStringプロパティ」のほうを利用する必要があります。これにより、クエリの結果が正しく得られるようになります。古いDelphiやC++BuilderのBDE(Paradox,dBase)プロジェクトをそのまま2010に移植する場合には注意が必要です。
Share This | Email this page to a friend
Posted by Tomohiro Takahashi on September 29th, 2009 under C++, Database, Delphi | Comment now »C++Builder/Delphi/RAD Studio 2010 Update 1と Extrasイメージ
C++Builder/Delphi/RAD Studio 2010の Update 1 が公開されました。
インストールの際に「自動アップデート」をオフにされていた方は、Windowsのスタートメニューより [すべてのプログラム|Embarcadero RAD Studio 2010|更新プログラムの確認]にて確認することができます(注: インターネット接続している必要があります)
詳細につきましてはリリースノートをご参照下さい。
Update 1 リリースノート
また、メディアの Extrasディレクトリ内に格納されているイメージが公開となりました。
こちらは主にESDイメージにてインストールされた方が対照となります。
(ISOイメージをダウンロードしてインストールされた方は ISOイメージ内に、メディアからインストールされた方はメディア内にこのフォルダは存在します)
こちらよりダウンロードが可能です。
Extras directory files for RAD Studio, Delphi & C++Builder 2010
Share This | Email this page to a friend
Posted by Chikako Yonezawa on September 25th, 2009 under C++, Delphi | Comment now »Delphi 2010: RTTI新機能を試す(動的なインスタンス生成)
高橋(智)です。
1か月ほど前に「Delphi 2010: RTTI新機能を試す」と題して、TObject型の引数を受け取るメソッドが動的にSQLのINSERT文を生成するコードを紹介しました。今回はその逆の処理を試してみようと思います。つまり、.EXEファイルのビルド時には直接参照していない未知のクラスのインスタンスを、そのクラス名だけを使って動的に生成しようというものです。
まず、以下のように自作パッケージ「Package1.bpl」を新規作成し、その中に前回の記事で使用した「Employee」クラスを定義します。このパッケージをビルドしたら、パスの通っているフォルダにコピーしておきます。
次に、新しいVCLフォームアプリケーションを作成して、その実装コードに
・Package1.bplをロードする
・Unit5.EmployeeクラスのRTTI情報を取得する
・Unit5.Employeeクラスのコンストラクタ(今回は引数無し)情報を取得する
・Unit5.Employeeクラスのインスタンスを生成する
・Unit5.Employeeクラスのインスタンスの各フィールドに値をセットする
・Unit5.Employeeクラスのインスタンスを解放する
という一連の処理を記述しました。
ご覧のように、この.EXEファイルのコードには、Employeeクラスを直接参照するコードはありません。しかし、新しいRTTI機能を使って、汎用的な「TOjbect型」への参照のみを通してEmployeeクラスのインスタンスのフィールド値設定が行えます。
このような機能を応用すれは、EJB3.0(JPA)のような汎用的なO/Rマッパー(永続化フレームワーク)が作れそうですね。
なお、今回の.EXEファイルのビルド時には「実行時パッケージを使用して構築」を「有効」にしています。これにより、.EXEファイルには含まれていないクラスに対しても新しいRTTI機能を利用できるようになっています。
Share This | Email this page to a friend
Posted by Tomohiro Takahashi on September 10th, 2009 under C++, Database, Delphi | Comment now »CodeRage 4
大阪での Developer Camp、たくさんの開発者の皆様にご参加いただき終了いたしました。ご参加いただきました皆様、ありがとうございました。
さて、今週、9月8日から11日までの間(日本時間 9月8日夜半から12日)、米国にてオンラインイベント CodeRage 4が開催されます。
先日発表になった C++Builder/Delphi/Delphi Prism/RAD Studio 2010をはじめ、エンバカデロの各製品についてのいろいろなセッションが行なわれます。
時間的には、日本の真夜中なものが多いですが、ご興味のある方は是非ご参加下さいませ。

Share This | Email this page to a friend
Posted by Chikako Yonezawa on September 7th, 2009 under Event | Comment now »Delphi 2010: DataSnap 2010でREST,JSONを試す
高橋(智)です。
今日は、Delphi 2010のDataSnapで追加された機能「RESTによるアクセス」「JSONによる入出力」を試してみようと思います。
まず、DataSnapサーバーを作りますが、2010で追加されたウィザードが便利です。プロトコルとして「HTTP」を選択します。
自動的にサーバーメソッドのサンプルとして「EchoStringメソッド」が追加されました。string型の引数を1つとり、戻り値としてstring型を返すものです。では、JSON形式で表現されるとても単純なオブジェクトを返すように変更してみます。EchoStringメソッドの戻り値の型をstring型から「TJSONObject型」に変更し、usesに「DBXJSONユニット」を追加します。とりあえずバラメータは置いておいて、戻り値のTJSONObjectに「TJSONPair.Create(’fullname’, ‘エンバカデロ’)」をセットします。
DataSnapサーバーを8080番ポートで起動したら、IEなどのWebブラウザで直接「EchoStringメソッド」にアクセスしてみましょう。URLは「 http://localhost:8080/datasnap/rest/TServerMethods2/EchoString/abc 」です。結果としてJSON形式のレスポンスが得られました。
では、WebブラウザでHTMLにアクセスし、その中にあるHTMLのボタンを押したらJavaScriptで記述された「Ajax」のコードを通してDataSnapサーバーのEchoStringメソッドにアクセスし、JSON形式のレスポンスをパースする処理を行ってみます。以下のように「エンバカデロ」という値をAjax経由で取得できました。
なお、今回はRESTのレスポンス(JSON形式)にマルチバイト文字(エンバカデロ)を使用しましたが、RESTのリクエスト(HTTPのGETメソッドのURL)にマルチバイトの文字列パラメータを含める場合にはURLエンコード(%xx%yy%zzの形式)を使用することになりそうですね。
参考:
[Adrian Andrei - JSON Types for Server Methods in DataSnap 2010]
http://blogs.embarcadero.com/adrian/2009/08/19/json-types-for-server-methods-in-datasnap-2010/
[Adrian Andrei - DataSnap 2009 Client/Server Communication Protocol and Beyond]
http://it-republik.de/konferenzen/delphi_live/material/delphilive09_andrei_datasnap.pdf
Share This | Email this page to a friend
Posted by Tomohiro Takahashi on August 28th, 2009 under C++, Delphi, PHP | Comment now »Delphi 2010: 新機能 delayed ディレクティブ
高橋(智)です。
今日は、Delphi 2010 のコンパイラに追加された一見地味でありながら、魅力的な機能を紹介しようと思います。すでにAllenさんがblogで紹介されていますが、DLLの関数呼び出しコードにおけるそのエントリポイントの解決を、実際の呼び出し時まで遅延させる新しいディレクティブ「 delayed; 」が追加されました。
[Procrastinators Unite… Eventually!]
http://blogs.embarcadero.com/abauer/2009/08/25/38894
この「 delayed; 」の簡単な使い方は上のAllenさんのblogを見ていただくとして、以下、私が以前にteamjのblogで書いた
[InitializeCriticalSectionEx]
http://blogs.embarcadero.com/teamj/2009/05/25/461/
のコードをDelphi 2010で書き直してみようと思います。
そのblogでは、WindowsXPやWindows2000の「kernel32.dll」には搭載されていない「InitializeCriticalSectionEx」というWin32APIを呼び出しています。どのOSでも「.EXEファイルが起動できるよう」にするために、WindowsVista/2008/7の場合には「LoadLibrary/GetProcAddress」を使って動的に「InitializeCriticalSectionEx」のエントリポイントを取得しています。
それでは、「 delayed; 」を使ったコードに書き直してみます。一気にスッキリしたコードになりました。「InitializeCriticalSectionEx(css[i], 0, CRITICAL_SECTION_NO_DEBUG_INFO)」のコードは通常の関数呼び出しに見えますが、実際には1回目の呼び出し時に「LoadLibrary/GetProcAddress」が利用され、2回目以降は1回目の処理をスキップして、「InitializeCriticalSectionEx」が呼び出されるようになります。このようなコードはDelphiコンパイラが自動で追加してくれます。
-------------------------------------
function InitializeCriticalSectionEx(var lpCriticalSection: TRTLCriticalSection;
dwSpinCount: DWORD; Flags: DWORD): BOOL; stdcall; external ‘kernel32.dll’ name ‘InitializeCriticalSectionEx’ delayed;
const CRITICAL_SECTION_NO_DEBUG_INFO = $01000000;
procedure TForm5.Button1Click(Sender: TObject);
var
i: Integer;
css: array of TRTLCriticalSection;
Vista_2008_Win7: Boolean;
begin
SetLength(css, 1000000);
Vista_2008_Win7 := CheckWin32Version(6, 0); // Check OS Version
for i := 0 to Length(css)-1 do
begin
if Vista_2008_Win7 then
InitializeCriticalSectionEx(css[i], 0, CRITICAL_SECTION_NO_DEBUG_INFO)
else
InitializeCriticalSection(css[i]);
end;
for i := 0 to Length(css)-1 do
begin
EnterCriticalSection(css[i]);
// …
LeaveCriticalSection(css[i]);
end;
for i := 0 to Length(css)-1 do
DeleteCriticalSection(css[i]);
end;
-------------------------------------
なお、C++Builderには昔から同様の機能が搭載されていまして、以前のデベロッパーキャンプでは
[リンカ「DLL遅延ロードオプション」の意外な使い道]
http://edn.embarcadero.com/jp/article/images/37640/a3.pdf
として紹介しました。しかし、C++Builderの場合には.DLL全体(全関数)を遅延ロードすることになりますし、kernel32.dllのようなシステムDLLは遅延ロードの対象にすることはできません。
以上のように、個別の関数だけ遅延ロードできるようにしたDelphi 2010のコンパイラはとても魅力的だと思います。また、上のC++Builderのセッション資料で解説している「VCLのGUI機能を内蔵するDLLの初期化問題」にも対応できるようになるのではないか? と思います。この件については時間があれば解説したいと思います。
Share This | Email this page to a friend
Posted by Tomohiro Takahashi on August 26th, 2009 under C++, Delphi | 1 Comment »













RSS Feed
