Система заказчика представляет собой комбинацию C/S и B/S. Изначально планировалось, что часть B/S будет использовать IntraWeb.
Появился Delphi.net, поэтому часть B/S была переключена на Delphi.net;
В процессе разработки возникла проблема: алгоритм шифрования был разработан Delphi 7.
Времени было слишком мало, и переписать алгоритм шифрования с помощью Delphi.net было невозможно, поэтому я подумал о COM/COM+.
Жаль, что на Delphi.net очень мало информации и еще меньше информации о совместимости с COM/COM+.
Итак, я исследовал это сам и пришел к следующему (исходный код прилагается):
1. Создайте COM/COM+ в Delphi 7.
(1) В среде IDE выберите Файл -> Создать -> Другое -> ActiveX -> Библиотека ActiveX,
Сохраните файл проекта как CompRoject;
(2) В среде IDE выберите «Файл» -> «Создать» -> «Другое» -> ActiveX -> COM-объект,
Заполните «Тест» в столбце «Имя класса» и сохраните модуль как «Тест»;
(3) Добавьте процесс с именем GetMsg в ITest в View -> Type Library в IDE;
(4)Ctrl + F9;
(5) Выполнить -> Зарегистрировать сервер ActiveX в IDE // Регистрация COM/COM+ также может быть выполнена с помощью командной строки;
2. Вызов COM/COM+ в Delphi.net.
(1) В IDE выберите «Файл» -> «Создать» -> веб-приложение asp.net,
Вы можете столкнуться с массой неприятностей, с которыми придется справляться самостоятельно!
(2) Добавьте ссылку на COM/COM+:
В проекте IDE -> Добавить ссылку -> Импорт COM,
Выберите ComProject, который вы только что зарегистрировали, и нажмите «Добавить ссылку», чтобы добавить ссылку.
Нажмите «ОК» (обратите внимание на файл проекта (веб-приложение ASP.NET).
Путь (Путь) не может использовать китайский язык);
(3) Добавьте ComProject для использования в WebForm1;
(4) Вызов COM/COM+
Поместите два веб-элемента управления над WebForm1: кнопку и метку;
Дважды нажмите кнопку и в процессе напишите:
вар
Сообщение: строка;
Объект: ТОбъект;
начинать
Obj := Server.CreateObject('ComProject.Test'); // Создание COM/COM+
Test(Obj).GetMsg(Msg); // Преобразуем Obj в Test и вызываем метод GetMsg;
Метка1.Текст := Сообщение;
конец;
(5) Добавьте Aspcompat="true" в строку страницы файла WebForm1.aspx.
Например: <%@ Page Language="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
(6) Ctrl + F9, «Выполнить» -> «Выполнить» (или «Запустить без отладки»);
(7) Нажмите кнопку на веб-странице. Готово?
//Ниже приведена часть исходного кода:
Файл проекта COM/COM+ (ComProject.dpr):
библиотека КомПроект;
использует
КомСерв,
ComProject_TLB в «ComProject_TLB.pas»,
Протестируйте в «Test.pas» {Test: CoClass};
экспорт
Длллжетклассобжект,
DllCanUnloadNow,
ДлРегистерСервер,
Дллунрегистрсервер;
{$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;
//************************************************ ********************** //
// ПРЕДУПРЕЖДЕНИЕ
// -------
// Типы, объявленные в этом файле, были сгенерированы на основе данных, прочитанных из
// Библиотека типов. Если эта библиотека типов явно или косвенно (через
// другая библиотека типов, ссылающаяся на эту библиотеку типов) повторно импортирована, или
// Команда «Обновить» редактора библиотеки типов, активируемая при редактировании
// Библиотека типов, содержимое этого файла будет перегенерировано и все
// ручные изменения будут потеряны.
//************************************************ ********************** //
// ПАСТЛВТР: 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
// Файл справки:
// HelpString: библиотека ComProject
//DepndLst:
// (1) стандартный файл v2.0, (D:/WINDOWS/system32/stdole2.tlb)
//************************************************ ********************** //
{$TYPEDADDRESS OFF} // Модуль должен быть скомпилирован без указателей с проверкой типа.
{$WARN SYMBOL_PLATFORM ВЫКЛ}
{$WRITEABLECONST ВКЛ}
{$VARPROPSETTER ВКЛ}
интерфейс
использует Windows, ActiveX, классы, графику, StdVCL, варианты;
//************************************************ *********************//
// GUIDS, объявленные в TypeLibrary, используются следующие префиксы:
// Библиотеки типов: LIBID_xxxx
// Соклассы: CLASS_xxxx
// Интерфейсы DISP: DIID_xxxx
// Интерфейсы, отличные от DISP: IID_xxxx
//************************************************ *********************//
константа
// Библиотека типов Основная и второстепенная версии
КомПроектМайорВерсион = 1;
КомПроектМинорВерсион = 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. Функции предназначены для использования.
// клиенты, желающие автоматизировать объекты CoClass, предоставляемые
// сервер этого типа — библиотека.
//************************************************ *********************//
КоТест = класс
функция класса Создать: ITest;
функция класса CreateRemote (const MachineName: строка): ITest;
конец;
выполнение
используетComObj;
функция класса CoTest.Create: ITest;
начинать
Результат: = CreateComObject(CLASS_Test) как ITest;
конец;
функция класса CoTest.CreateRemote(const MachineName: string): ITest;
начинать
Результат: = CreateRemoteComObject(MachineName, CLASS_Test) как ITest;
конец;
конец.
///////////////////////////////////////Ниже приведен исходный код для вызова 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);
строго охраняемый
Кнопка1: System.Web.UI.WebControls.Button;
Метка1: System.Web.UI.WebControls.Label;
процедура OnInit (e: EventArgs переопределить);
частный
{Частные заявления}
общественный
{Публичные заявления}
конец;
выполнение
{$REGION 'Код, управляемый дизайнером'}
/// <сводка>
/// Обязательный метод для поддержки Designer — не изменять
/// содержимое этого метода с помощью редактора кода.
/// </сводка>
процедура TWebForm1.InitializeComponent;
начинать
Включить(Self.Button1.Click, Self.Button1_Click);
Включить(Self.Load, Self.Page_Load);
конец;
{$ENDREGION}
процедура TWebForm1.Page_Load (отправитель: System.Object; e: System.EventArgs);
начинать
// ЗАДАЧА: поместите сюда пользовательский код для инициализации страницы
конец;
процедура TWebForm1.OnInit(e: EventArgs);
начинать
//
// Требуется для поддержки дизайнера
//
ИнициализироватьКомпонент;
унаследованныйOnInit (е);
конец;
процедура TWebForm1.Button1_Click(отправитель: System.Object; e: System.EventArgs);
вар
Сообщение: строка;
Объект: ТОбъект;
начинать
Obj := Server.CreateObject('ComProject.Test');
Тест(Объект).GetMsg(Сообщение);
Метка1.Текст := Сообщение;
конец;
конец.
///Модуль 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>
<голова>
<title></title>
<meta name="GENERATOR" content="Библиотека пакетов Borland 7.1">
</голова>
<body ms_positioning="GridLayout">
<form runat="сервер">
<asp:button id=Button1
style="Z-INDEX: 1; СЛЕВА: 238 пикселей; ПОЛОЖЕНИЕ: абсолютное; ВЕРХУ: 158 пикселей"
runat="сервер" текст="Кнопка">
</asp:button>
<asp:label id=Label1
style="Z-INDEX: 2; СЛЕВА: 190 пикселей; ПОЛОЖЕНИЕ: абсолютное; ВЕРХУ: 54 пикселей"
runat="server">Метка</asp:label>
</форма>
</тело>
</html>