Главная страница
    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-100723
sagchat
2003-07-18 20:22
2003.07.31
трайнер для GTA


4-101036
Asteroid
2003-05-29 02:56
2003.07.31
WM_MEASUREITEM глючит?


14-100945
` frizZ. `
2003-07-13 19:07
2003.07.31
Microsoft Win32 Software Development Kit


11-100651
Arhangel
2002-11-30 15:20
2003.07.31
Есть архив?


1-100770
MaDgic
2003-07-08 14:03
2003.07.31
ListView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский