コンポーネントの登録方法等
64 ビットの開発環境におけるコンポーネント |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE5(UP2) |
ユニットファイルに 32 ビットと 64 ビットの区別はない |
Delphi XE2 では 64 ビットのアプリケーション,つまり EXE が作成できるようになりましたが,基本的に,コンポーネントのユニットファイルそのものに 32 ビットと 64 ビットの区別はありません.
拡張子が .dpk のパッケージファイルも同じです.
全てのコンポーネントが 32 ビットと 64 ビットの両方で使用可能とは限りません.また,使用可能であっても正常に動作するとは限りません.これはソースコードの処理内容にもよります.
|
32 ビットの開発環境でコンポーネントを使用可能にしておく |
以下の説明では dclusr.dpk を使用しています.
64 ビットのプロジェクトでコンポーネントを使用する場合でも,[ターゲットプラットフォーム] を Win32 にして 32 ビット版のパッケージにコンポーネントをインストール (追加) します.下図は,図の下のコードのコンポーネントを dclusr.dpk に追加した結果です.dclusr.dpk は,dclusr.dproj でも同じです.
当サイトの [コンポーネントの登録方法等] で説明しているのは,この 32 ビットの開発環境におけるパッケージのインストールやコンポーネントの登録方法です.
[ターゲットプラットフォーム] が Win32 の状態でこのコンポーネントを使用したプロジェクトを作成すると,[ターゲットプラットフォーム] を Win64 にしてもコンパイルできます.
|
|
図1
インストールしたコンポーネント |
リスト1
テストに使用したコンポーネントのソースコード |
unit plTestPanel;
interface
uses
Windows, Classes, Messages, Controls, ExtCtrls;
type
TplTestPanel = class(TPanel)
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('plXRAY', [TplTestPanel]);
end;
{ TplTestPanel }
constructor TplTestPanel.Create(AOwner: TComponent);
begin
inherited;
end;
end.
インストールしたコンポーネントは 64 ビット用のプロジェクトで使用できますが,[ターゲットプラットフォーム] を Win64 にすると,インストールしたコンポーネントは,下図のように,コンポーネントパレットのアイコンが使用不可の状態になります.しかも筆者の環境では 継承元の TPanel のアイコンではなく,コンポーネントのデフォルトのアイコンになってしまいました.したがって,このままでは 64 ビットのプロジェクトのフォームに追加して利用できません. |
|
図2
64 ビットの開発環境ではコンポーネントが追加利用できない |
パッケージを 32 ビットと 64 ビット兼用にする方法 |
インストールしたコンポーネントを 64 ビットの開発環境で (設計時に) 使用可能にするには,パッケージのプロジェクトのリソースを書き換えます.
以下のコードを書いたテキストファイルを作成して,パッケージ名.rc と言う名前でライブラリのパスが通った場所に置きます.今回は dclusr.rc という名前にして,dclusr.dpk と同じフォルダ内に置いてテストしています.
IDE でパッケージを開いたら,そのプロジェクトにこの .rc ファイルを追加してパッケージをビルド (再構築) して上書き保存します.
パッケージのプロジェクトに .rc ファイルを追加してビルド (再構築) すると .res ファイルが自動的に置き換わります.
|
PLATFORMTARGETS RCDATA {3}
|
図3
パッケージのプロジェクトに rc ファイルを追加する
- [プロジェクトに追加] で追加できる
- 追加したらパッケージをビルド (再構築)
- 上書き保存して IDE を閉じる
|
下図はこの方法でインストール済みのパッケージをビルドした結果です.コンポーネントパレットのアイコンが使用可能な状態になっているのが確認できます.
もちろんですが,パッケージのコンパイルやビルド (再構築) ,コンポーネントのパッケージへの追加 (インストール) は,[ターゲットプラットフォーム] を Win32
にした状態で実行します.
|
|
図4
コンポーネントは [ターゲットプラットフォーム] を Win32 してインストールしている |
ターゲットのプラットフォームの識別子は System.Classes
で定義されています.Delphi XE5(UP2) Pro の場合は以下のようになっています.rc ファイルに記述した 3 は pidWin32 or pidWin64 ということになります.
|
[備考]
VCL のパッケージのリソースは,デフォルトでは pidWin32 だけとなっています.
|
{ Platform identifiers }
pidWin32 = $0001;
pidWin64 = $0002;
pidOSX32 = $0004;
pidiOSSimulator = $0008;
pidAndroid = $0010;
pidLinux32 = $0020;
pidiOSDevice = $0040;
コンポーネントのソースコードでプラットフォームを指定する方法 |
前項のオンラインヘルプの記事にあるように,コンポーネントのクラス定義の前に,以下のようなプラットフォームの属性を追加する方法もあります.
|
[ComponentPlatformsAttribute(pidWin32 or pidWin64)]
この方法は,コンポーネントのクラスに対して個別に設定しますから,32 ビットと 64 ビットで使用可能なコンポーネントを振り分けることができます.
コンポーネントのソースコードを変更したらパッケージのビルド (再構築) が必要です.
パッケージのコンパイルやビルド (再構築) ,コンポーネントのパッケージへの追加 (インストール) は,[ターゲットプラットフォーム] を Win32 にした状態で実行します.
|
リスト3
テストに使用したコンポーネントのソースコード
プラットフォームの属性をコンポーネントのソースコードに追加 |
unit plTestPanel;
interface
uses
Windows, Classes, Messages, Controls, ExtCtrls;
type
[ComponentPlatformsAttribute(pidWin32 or pidWin64)]
TplTestPanel = class(TPanel)
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('plXRAY', [TplTestPanel]);
end;
{ TplTestPanel }
constructor TplTestPanel.Create(AOwner: TComponent);
begin
inherited;
end;
64 ビット版の DLL , TLB, OCX ファイルからタイプライブラリの取り込み,あるいは ActiveX コントロールの取り込みでユニット (pas) を作成した場合は注意が必要です.以下を参考にしてください. |
パッケージ形式として 64 ビット版のタイプライブラリの取り込みを行った場合,ライブラリのパスの設定が必要となります.ライブラリのパスの設定には,次のような環境変数も使用できます.
|
$(BDS)\lib\win64\release
$(BDSLIB)\$(Platform)\release
|