고객사 시스템은 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 개체,
Class Name 열에 Test를 입력하고 단위를 Test로 저장합니다.
(3) IDE의 View -> Type Library에서 ITest에 GetMsg라는 프로세스를 추가합니다.
(4) Ctrl + F9;
(5) 실행 -> IDE에 ActiveX 서버 등록 // 명령줄을 사용하여 COM/COM+ 등록을 수행할 수도 있습니다.
2. Delphi.net에서 COM/COM+를 호출합니다.
(1) IDE에서 파일 -> 새로 만들기 -> asp.net 웹 애플리케이션,
스스로 해결해야 할 많은 문제에 직면할 수 있습니다!
(2) COM/COM+에 대한 참조를 추가합니다.
IDE 프로젝트 -> 참조 추가 -> COM 가져오기에서
방금 등록한 ComProject를 선택하고 참조 추가를 클릭하여 참조를 추가합니다.
확인을 클릭하세요(프로젝트 파일(ASP.NET 웹 응용 프로그램)에 주의하세요)
경로(Path)는 중국어를 사용할 수 없습니다);
(3) WebForm1에서 사용할 ComProject를 추가합니다.
(4) COM/COM+ 호출
WebForm1 위에 두 개의 웹 컨트롤(버튼 및 레이블)을 배치합니다.
버튼을 두 번 클릭하고 프로세스를 작성합니다.
var
메시지: 문자열;
개체: TObject;
시작하다
Obj := Server.CreateObject('ComProject.Test') // COM/COM+ 생성
Test(Obj).GetMsg(Msg); // Obj를 Test로 변환하고 GetMsg 메서드를 호출합니다.
Label1.Text := 메시지;
끝;
(5) WebForm1.aspx의 페이지 라인에 Aspcompat="true"를 추가하고,
예: <%@ 페이지 언어="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
(6) Ctrl + F9, 실행 -> 실행(또는 디버깅 없이 실행);
(7) 웹 페이지에서 버튼을 클릭하면 완료되나요?
//다음은 소스코드 부분입니다.
COM/COM+ 프로젝트 파일(ComProject.dpr):
라이브러리 ComProject;
용도
ComServ,
'ComProject_TLB.pas'의 ComProject_TLB,
'Test.pas'에서 테스트하세요. {Test: CoClass};
수출
DllGetClass객체,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.TLB}
{$R *.RES}
시작하다
끝.
//COM/COM+ 테스트 유닛(Test.pas):
단위 테스트;
{$WARN SYMBOL_PLATFORM 꺼짐}
인터페이스
용도
Windows, ActiveX, 클래스, ComObj, ComProject_TLB, StdVcl;
유형
TTest = 클래스(TTypedComObject, ITest)
보호됨
function 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;
//************************************************ ********************** //
// 경고
// -------
// 이 파일에 선언된 유형은 다음에서 읽은 데이터에서 생성되었습니다.
// 유형 라이브러리. 이 유형 라이브러리가 명시적으로 또는 간접적으로(를 통해)
// 이 형식 라이브러리를 참조하는 다른 형식 라이브러리)를 다시 가져오거나
// 편집하는 동안 활성화된 유형 라이브러리 편집기의 '새로 고침' 명령
// 유형 라이브러리, 이 파일의 내용이 재생성되고 모든
// 수동 수정 사항이 손실됩니다.
//************************************************ ********************** //
// PASTLWTR: 1.2
// 아래 설명된 형식 라이브러리에서 2004-2-6 13:28:46에 생성된 파일입니다.
//************************************************ ********************** //
// Lib 유형: D:/Program Files/Borland/Delphi7/Projects/comtest2/ComProject.tlb (1)
// 리비드: {92B46A1D-8A31-46C5-98FE-C03FEA98DC21}
//LCID: 0
// 도움말 파일:
// HelpString: ComProject 라이브러리
//DepndLst:
// (1) v2.0 stdole, (D:/WINDOWS/system32/stdole2.tlb)
//************************************************ ********************** //
{$TYPEDADDRESS OFF} // 유닛은 유형 검사 포인터 없이 컴파일되어야 합니다.
{$WARN SYMBOL_PLATFORM 꺼짐}
{$WRITEABLECONST ON}
{$VARPROPSETTER 켜기}
인터페이스
Windows, ActiveX, 클래스, 그래픽, StdVCL, 변형을 사용합니다.
//************************************************ *********************//
// TypeLibrary에 선언된 GUID는 다음 접두사가 사용됩니다.
// 유형 라이브러리: LIBID_xxxx
// CoClass: CLASS_xxxx
// DISP인터페이스: DIID_xxxx
// DISP가 아닌 인터페이스: IID_xxxx
//************************************************ *********************//
const
// 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 = 인터페이스;
//************************************************ *********************//
// Type Library에 정의된 CoClasses 선언
// (참고: 여기서는 각 CoClass를 기본 인터페이스에 매핑합니다.)
//************************************************ *********************//
테스트 = ITest;
//************************************************ *********************//
//인터페이스: ITest
// 플래그: (256) OleAutomation
// GUID: {96CECA70-1438-4C54-982E-67C378F085E8}
//************************************************ *********************//
ITest = 인터페이스(IUnknown)
['{96CECA70-1438-4C54-982E-67C378F085E8}']
function GetMsg(out Msg: WideString): HResult;
끝;
//************************************************ *********************//
// Class CoTest는 Create 및 CreateRemote 메서드를 제공합니다.
// 노출된 기본 인터페이스 ITest의 인스턴스를 생성합니다.
// CoClass 테스트입니다.
// 노출된 CoClass 객체를 자동화하려는 클라이언트
// 이 유형 라이브러리의 서버입니다.
//************************************************ *********************//
CoTest = 클래스
클래스 함수 생성: ITest;
클래스 함수 CreateRemote(const MachineName: string): ITest;
끝;
구현
용도ComObj;
클래스 함수 CoTest.Create: ITest;
시작하다
결과 := CreateComObject(CLASS_Test) as ITest;
끝;
클래스 함수 CoTest.CreateRemote(const MachineName: string): ITest;
시작하다
결과 := CreateRemoteComObject(MachineName, CLASS_Test) as ITest;
끝;
끝.
/////////////////////////////////////다음은 COM/COM+를 호출하는 소스코드입니다. Delphi.net에서 /// ////////////////////////////
//WebForm1.pas 유닛:
단위 WebForm1;
인터페이스
용도
시스템.컬렉션, 시스템.컴포넌트 모델,
시스템.데이터, 시스템.드로잉, 시스템.웹, 시스템.웹.세션상태,
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);
엄격하게 보호됨
버튼1: System.Web.UI.WebControls.Button;
라벨1: System.Web.UI.WebControls.Label;
프로시저 OnInit(e: EventArgs);
사적인
{비공개 선언}
공공의
{공개 선언}
끝;
구현
{$REGION '디자이너 관리 코드'}
/// <요약>
/// Designer 지원을 위한 필수 메소드 - 수정하지 마세요.
/// 코드 편집기를 사용하여 이 메서드의 내용을 확인합니다.
/// </summary>
절차 TWebForm1.InitializeComponent;
시작하다
포함(Self.Button1.Click, Self.Button1_Click);
포함(Self.Load, Self.Page_Load);
끝;
{$ENDREGION}
절차 TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
시작하다
// TODO: 여기에 페이지를 초기화하는 사용자 코드를 입력하세요.
끝;
절차 TWebForm1.OnInit(e: EventArgs);
시작하다
//
// 디자이너 지원에 필요
//
초기화구성요소;
상속받은OnInit(e);
끝;
절차 TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
var
메시지: 문자열;
개체: TObject;
시작하다
Obj := Server.CreateObject('ComProject.Test');
테스트(Obj).GetMsg(Msg);
Label1.Text := 메시지;
끝;
끝.
///WebForm1.aspx 단위:
<%@ 페이지 언어="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="볼랜드 패키지 라이브러리 7.1">
</head>
<body ms_positioning="GridLayout">
<form runat="서버">
<asp:버튼 ID=Button1
style="Z-INDEX: 1; 왼쪽: 238px; 위치: 절대; 위쪽: 158px"
runat="서버" text="버튼">
</asp:버튼>
<asp:레이블 ID=Label1
style="Z-INDEX: 2; 왼쪽: 190px; 위치: 절대; 위쪽: 54px"
runat="server">레이블</asp:label>
</form>
</body>
</html>