Форум: "KOL";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
ВнизActiveX with KOL Найти похожие ветки
← →
Fantasist (2002-11-27 07:07) [0]Продолжаем разговор.
Самое интересное, что народ спрашивает время от времени, но вроде и не интересуется. Тем не менее, я написал минимальный механизм для поддержки ActiveX с использованием KOL. Сам юнит выкладывать здесь не буду, а выложу примеры использования. Если кому интересно, откликнитесь!
library KOLAciveDll;
uses
KOLActiveX;
type
//Интерфейсы
kIAnsInterface=object(kIUnknown)
GetSum:function (var sum:integer):HResult; stdcall;
end;
kISumInterface=object(kIAnsInterface)
MakeSum:function (n,m:integer):HResult; stdcall;
end;
kIDiffInterface=object(kIAnsInterface)
MakeDiff:function (n,m:integer):HResult; stdcall;
end;
//СОМ объект с подержкой интерфейсов kISumInterface,kIDiffInterface
TKOLActiveTest=object(TInterfacedObj)
private
fSumInterface:kISumInterface;
fDiffInterface:kIDiffInterface;
fSum:Integer;
protected
function _MakeSum(n,m:integer):HResult; stdcall;
function _MakeDiff(n,m:integer):HResult; stdcall;
function _GetSum(var sum:integer):HResult; stdcall;
procedure SetInterfaceTable; virtual;
end;
PKOLActiveTest=^TKOLActiveTest;
const
ISumInterface_IID:TGUID="{9A97B5A0-0189-11D7-A5C2-0050FC76AD24}";
IDiffInterface_IID:TGUID="{9A97B5A2-0189-11D7-A5C2-0050FC76AD24}";
KOLActiveTest_CLSID:TGUID="{9A97B5A1-0189-11D7-A5C2-0050FC76AD24}";
//Функция создающая наш объект
function CreateKOLActiveTest:PKOLActiveTest;
begin
new(Result,Create);
end;
//Процедура инициализации. Здесь будем указывать, какие СОМ объекты у нас есть
procedure InitProc(var Col:TCoObjectCollection);
begin
//CLSID //Make function //ProgID
Col.AddCoObject(KOLActiveTest_CLSID,@CreateKOLActiveTest,"KOLTest.ActiveX");
end;
{ TKOLActiveTest }
procedure TKOLActiveTest.SetInterfaceTable;
begin
//Инитиализация интерфейсов - вызывается при создании объекта
inherited;
with fSumInterface do
begin
MakeSum:=@TKOLActiveTest._MakeSum;
GetSum:=@TKOLActiveTest._GetSum;
end;
with fDiffInterface do
begin
MakeDiff:=@TKOLActiveTest._MakeDiff;
GetSum:=@TKOLActiveTest._GetSum;
end;
AddInterface(ISumInterface_IID,@fSumInterface);
AddInterface(IDiffInterface_IID,@fDiffInterface);
end;
function TKOLActiveTest._MakeSum(n, m: integer): HResult;
begin
PrepareInterfaceMethod; //Это должно стоять вначале каждого метода интерфейса
fsum:=n+m;
Result:=S_OK;
end;
function TKOLActiveTest._MakeDiff(n, m: integer): HResult;
begin
PrepareInterfaceMethod; //Это должно стоять вначале каждого метода интерфейса
fsum:=n-m;
Result:=S_OK;
end;
function TKOLActiveTest._GetSum(var sum: integer): HResult;
begin
PrepareInterfaceMethod; //Это должно стоять вначале каждого метода интерфейса
sum:=fsum;
Result:=S_OK;
end;
begin
//Указываем процедуру инициализации через глобальную переменную ObjInitProc
ObjInitProc:=InitProc;
end.
← →
Fantasist (2002-11-27 07:13) [1]Вышеприведенная dll может быть зарегестрированна стандартными способами (например: regsvr32.exe KOLAciveDll.dll) и соответсвенно использоваться. Пример со стандартной библиотекой:
unit TestUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ActiveX, ComObj;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
ITestInterface=interface
function GetSum(var sum:integer):HResult; stdcall;
function MakeOperation(n,m:integer):HResult; stdcall;
end;
const
ISumInterface_IID:TGUID="{9A97B5A0-0189-11D7-A5C2-0050FC76AD24}";
IDiffInterface_IID:TGUID="{9A97B5A2-0189-11D7-A5C2-0050FC76AD24}";
KOLActiveTest_CLSID:TGUID="{9A97B5A1-0189-11D7-A5C2-0050FC76AD24}";
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ISum,IDiff:ITestInterface;
Ifc:IUnknown;
Res:Integer;
begin
Ifc:=CreateComObject(KOLActiveTest_CLSID);
Ifc.QueryInterface(ISumInterface_IID,ISum);
ISum.QueryInterface(IDiffInterface_IID,IDiff);
ISum.MakeOperation(7,3);
ISum.GetSum(Res);
ShowMessage(IntToStr(Res));
IDiff.MakeOperation(7,3);
IDiff.GetSum(Res);
ShowMessage(IntToStr(Res));
end;
end.
← →
Boguslaw (2002-11-27 18:05) [2]Wonderfull ! You could publish all these examples with FAQ about how to write ActiveX in KOL or send it to Vladimir Kladov. I"m sure we all are interested in small activex (especially activeforms) but most of us are not keen on OLE/COM internal issues.Sorry...:-(
I wish to study COM implementation but in case of lack of time and good Internet tutorials I can"t right now.
← →
Fantasist (2002-11-30 22:45) [3]I don"t think it"s enough for publication - at least this library should implement dispathcable interfaces. But I believe, that soon I will complete it.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c