Главная страница
    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.013 c
3-100618
АТ
2003-07-10 04:35
2003.07.31
Криво работает SQL- запрос :-(


1-100799
Checist [root]
2003-07-17 11:56
2003.07.31
Ячейки DrawGrid


7-101006
Freeze
2003-05-20 09:09
2003.07.31
Народ ХелП Надо вызвать командную строку!!!


3-100579
Bless
2003-07-08 09:51
2003.07.31
Что дает SET NOCOUNT ON?


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