Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.009 c
1-100710
Дома
2003-07-18 15:00
2003.07.31
Гипер подсказка...


3-100568
62mkv
2003-07-08 13:12
2003.07.31
BDE 5.2


3-100529
Buka
2003-07-01 19:23
2003.07.31
Можно ли принципиально увидеть русский текст?


1-100810
vil
2003-07-17 13:11
2003.07.31
Поменять свойства у однаковых компонентов


9-100524
Axis_of_Evil
2003-02-05 10:02
2003.07.31
А где взять картинки а-ля Диабло, Варкрафт?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский