お客様のシステムはC/SとB/Sを組み合わせたもので、当初B/S部分はIntraWebを使用する予定でした。
たまたま Delphi.net が登場したため、B/S 部分は Delphi.net に切り替えられました。
開発プロセス中に問題が発生しました。暗号化アルゴリズムは Delphi 7 によって開発されました。
時間があまりにも厳しくて、Delphi.net を使って暗号アルゴリズムを書き換えるのは不可能だったので、COM/COM+ を考えました。
Delphi.net に関する情報がほとんどなく、COM/COM+ との相互運用性に関する情報がさらに少ないのは残念です。
そこで私は自分で調べて、次のことを思いつきました(ソースコードは添付)。
1. Delphi 7 で COM/COM+ を作成する
(1) IDE で、[ファイル] -> [新規作成] -> [その他] -> [ActiveX] -> [ActiveX ライブラリ]
プロジェクト ファイルを CompRoject として保存します。
(2) IDE で、ファイル -> 新規 -> その他 -> ActiveX -> COM オブジェクト、
「クラス名」列に「Test」と入力し、ユニットを「Test」として保存します。
(3) IDE の [表示] -> [タイプ ライブラリ] の ITest に GetMsg という名前のプロセスを追加します。
(4)Ctrl + F9;
(5) 実行 -> IDE で ActiveX サーバーを登録 // COM/COM+ の登録はコマンド ラインを使用して行うこともできます。
2. Delphi.net で COM/COM+ を呼び出す
(1) IDE で、[ファイル] -> [新規作成] -> [asp.net Web アプリケーション] を選択します。
自分で対処しなければならないトラブルがたくさん出てくるかもしれません!
(2) COM/COM+ への参照を追加します。
IDE プロジェクト -> 参照の追加 -> COM インポートで、
登録した ComProject を選択し、[参照の追加] をクリックして参照を追加します。
[OK] をクリックします (プロジェクト ファイル (ASP.NET Web アプリケーション) に注意してください)
パス (Path) には中国語を使用できません)。
(3) WebForm1 の use に ComProject を追加します。
(4) COM/COM+を呼び出す
WebForm1 の上に 2 つの Web コントロール (ボタンとラベル) を配置します。
ボタンをダブルクリックし、プロセスを記述します。
変数
メッセージ: 文字列;
オブジェクト: TObject;
始める
Obj := Server.CreateObject('ComProject.Test') // COM/COM+ を作成します。
Test(Obj).GetMsg(Msg); // Obj を Test に変換し、GetMsg メソッドを呼び出します。
Label1.Text := メッセージ;
終わり;
(5) WebForm1.aspx の Page 行に Aspcompat="true" を追加します。
例: <%@ Page language="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
(6) Ctrl + F9、実行 -> 実行 (またはデバッグなしで実行);
(7) Webページ上の ボタンをクリックして完了ですか?
//以下はソースコード部分です。
COM/COM+ プロジェクト ファイル (ComProject.dpr):
ライブラリ ComProject;
用途
コムサーブ、
「ComProject_TLB.pas」の ComProject_TLB、
'Test.pas' {テスト: CoClass} でテストします。
輸出
DllGetClassObject、
DllCanUnloadNow、
DllRegisterServer、
DllUnregisterServer;
{$R *.TLB}
{$R *.RES}
始める
終わり。
//COM/COM+ テスト ユニット (Test.pas):
単体テスト。
{$WARN SYMBOL_PLATFORM オフ}
インタフェース
用途
Windows、ActiveX、クラス、ComObj、ComProject_TLB、StdVcl;
タイプ
TTest = クラス(TTypedComObject, ITest)
保護された
関数 GetMsg(out Msg: WideString): HResult;
{ここで ITest メソッドを宣言します}
終わり;
実装
ComServ を使用します。
関数 TTest.GetMsg(out Msg: WideString): HResult;
始める
Msg := 'Com/Com+ テストは成功しました!';
終わり;
初期化
TTypedComObjectFactory.Create(ComServer, TTest, Class_Test,
ciMultiInstance、tmApartment);
終わり。
//COM/COM+ タイプ ライブラリ t ユニット (ComProject_TLB.pas):
ユニット ComProject_TLB;
//*********************************************** ********************** //
// 警告
// -------
// このファイルで宣言された型は、ファイルから読み取られたデータから生成されました。
// Type Library の場合、このタイプ ライブラリは明示的または間接的に (経由で)
// このタイプ ライブラリを参照する別のタイプ ライブラリ) が再インポートされるか、
// タイプ ライブラリ エディタの「更新」コマンドは、編集中にアクティブ化されます。
// タイプ ライブラリ。このファイルの内容は再生成され、すべて
// 手動による変更は失われます。
//*********************************************** ********************** //
// PASSLWTR: 1.2
// ファイルは 2004-2-6 13:28:46 に後述のタイプ ライブラリから生成されました。
//*********************************************** ********************** //
// タイプ ライブラリ: D:/Program Files/Borland/Delphi7/Projects/comtest2/ComProject.tlb (1)
// リビッド: {92B46A1D-8A31-46C5-98FE-C03FEA98DC21}
//LCID:0
// ヘルプファイル:
// ヘルプ文字列: ComProject ライブラリ
//DepndLst:
// (1) v2.0 stdole、(D:/WINDOWS/system32/stdole2.tlb)
//*********************************************** ********************** //
{$TYPEDADDRESS OFF} // ユニットは型チェックされたポインターなしでコンパイルする必要があります。
{$WARN SYMBOL_PLATFORM オフ}
{$WRITEABLECONST ON}
{$VARPROPSETTER オン}
インタフェース
Windows、ActiveX、クラス、グラフィックス、StdVCL、バリアントを使用します。
//*********************************************** *********************//
// TypeLibrary で宣言された GUIDS には次のプレフィックスが使用されます。
// タイプ ライブラリ: LIBID_xxxx
// コクラス : CLASS_xxxx
// DISPInterfaces : DIID_xxxx
// 非 DISP インターフェイス: IID_xxxx
//*********************************************** *********************//
定数
// TypeLibrary メジャー バージョンとマイナー バージョン
ComProjectMajorVersion = 1;
ComProjectMinorVersion = 0;
LIBID_ComProject: TGUID = '{92B46A1D-8A31-46C5-98FE-C03FEA98DC21}';
IID_ITest: TGUID = '{96CECA70-1438-4C54-982E-67C378F085E8}';
CLASS_Test: TGUID = '{CA54722F-C5EF-4814-A8DB-C1C357832F08}';
タイプ
//*********************************************** *********************//
// TypeLibrary で定義された型の前方宣言
//*********************************************** *********************//
ITest = インターフェース;
//*********************************************** *********************//
// タイプ ライブラリで定義された CoClasses の宣言
// (注: ここでは、各 CoClass をそのデフォルト インターフェイスにマップします)
//*********************************************** *********************//
テスト = ITest;
//*********************************************** *********************//
//インターフェース: ITest
// フラグ: (256) OleAutomation
// GUID: {96CECA70-1438-4C54-982E-67C378F085E8}
//*********************************************** *********************//
ITest = インターフェイス(IUnknown)
['{96CECA70-1438-4C54-982E-67C378F085E8}']
関数 GetMsg(out Msg: WideString): HResult;
終わり;
//*********************************************** *********************//
// クラス CoTest は、Create メソッドと CreateRemote メソッドを提供します。
// によって公開されるデフォルト インターフェイス ITest のインスタンスを作成します
// CoClass テスト。関数は次のユーザーによって使用されることを目的としています。
// クライアントは、
// このタイプライブラリのサーバー。
//*********************************************** *********************//
CoTest = クラス
クラス関数 Create: ITest;
クラス関数 CreateRemote(const MachineName: string): ITest;
終わり;
実装
ComObj を使用します。
クラス関数 CoTest.Create: ITest;
始める
結果 := ITest として ComObject(CLASS_Test) を作成します。
終わり;
クラス関数 CoTest.CreateRemote(const MachineName: string): ITest;
始める
結果 := ITest として RemoteComObject(MachineName, CLASS_Test) を作成します。
終わり;
終わり。
/////////////////////////////////////// 以下は COM/COM+ を呼び出すためのソース コードですDelphi.net より/// ////////////////////////////
//WebForm1.pas ユニット:
ユニット WebForm1;
インタフェース
用途
System.Collections、System.ComponentModel、
System.Data、System.Drawing、System.Web、System.Web.sessionState、
System.Web.UI、System.Web.UI.WebControls、System.Web.UI.HtmlControls、
コムプロジェクト;
タイプ
TWebForm1 = クラス(System.Web.UI.Page)
{$REGION 'デザイナーが管理するコード'}
厳格なプライベート
プロシージャ初期化コンポーネント;
プロシージャ Button1_Click(送信者: System.Object; e: System.EventArgs);
{$ENDREGION}
厳格なプライベート
プロシージャ Page_Load(送信者: System.Object; e: System.EventArgs);
厳重に保護されている
Button1: System.Web.UI.WebControls.Button;
ラベル 1: System.Web.UI.WebControls.Label;
プロシージャ OnInit(e: EventArgs);
プライベート
{プライベート宣言}
公共
{公的宣言}
終わり;
実装
{$REGION 'デザイナーが管理するコード'}
/// <概要>
/// デザイナーのサポートに必要なメソッド -- 変更しないでください
/// このメソッドの内容をコード エディターで表示します。
/// </概要>
プロシージャ TWebForm1.InitializeComponent;
始める
Include(Self.Button1.Click, Self.Button1_Click);
Include(Self.Load, Self.Page_Load);
終わり;
{$ENDREGION}
プロシージャ TWebForm1.Page_Load(送信者: System.Object; e: System.EventArgs);
始める
// TODO: ここにページを初期化するためのユーザー コードを入力します
終わり;
プロシージャ TWebForm1.OnInit(e: EventArgs);
始める
//
// デザイナーのサポートに必要
//
コンポーネントを初期化します。
継承されたOnInit(e);
終わり;
プロシージャ TWebForm1.Button1_Click(送信者: System.Object; e: System.EventArgs);
変数
メッセージ: 文字列;
オブジェクト: TObject;
始める
Obj := Server.CreateObject('ComProject.Test');
Test(Obj).GetMsg(Msg);
Label1.Text := メッセージ;
終わり;
終わり。
///WebForm1.aspx ユニット:
<%@ Page language="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<頭>
<タイトル></タイトル>
<meta name="GENERATOR" content="Borland パッケージ ライブラリ 7.1">
</head>
<body ms_positioning="GridLayout">
<form runat="サーバー">
<asp:button id=ボタン1
style="Z-INDEX: 1; LEFT: 238px; POSITION: 絶対; TOP: 158px"
runat="サーバー" text="ボタン">
</asp:ボタン>
<asp:label id=ラベル1
style="Z-INDEX: 2; LEFT: 190px; POSITION: 絶対; TOP: 54px"
runat="server">ラベル</asp:label>
</form>
</body>
</html>