-
Добрый вечер, господа! Возникла следующая проблема - нужно написать COM-сервер, расположенный в DLL, методы которого можно вызвать из веб-страницы с помощью JavaScript, скажем. Примером такого сервера является функция "Закачать все при помощи ReGet" которая появляется при утановке менеджера закачек ReGet в контекстном меню IE. Суть в том, чтобы можно было передать данные из Web-страницы в com-сервер. Итак, создаю мастером простейший com сервер (пример взял из статей в сети, разумется:)) ):
DLL: ---------------------------- library com_server; uses ComServ, com_server_TLB in 'com_server_TLB.pas', Unit1 in 'Unit1.pas' {Test: CoClass}; exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; {$R *.RES} begin end.
Unit1: ---------------------------- unit Unit1; {$WARN SYMBOL_PLATFORM OFF} interface uses Windows, ActiveX, Classes, ComObj, com_server_TLB, StdVcl; type TTest = class(TTypedComObject, ITest) protected procedure ShowIt(const S: WideString); safecall; end; implementation uses ComServ; procedure TTest.ShowIt(const S: WideString); begin MessageBox(0, PChar(S), NIL, 0); end; initialization TTypedComObjectFactory.Create(ComServer, TTest, Class_Test, ciMultiInstance, tmApartment); end.
com_server_TLB: --------------------------- unit com_server_TLB; {$TYPEDADDRESS OFF} {$WARN SYMBOL_PLATFORM OFF} {$WRITEABLECONST ON} {$VARPROPSETTER ON} interface
uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants; const com_serverMajorVersion = 1; com_serverMinorVersion = 0; LIBID_com_server: TGUID = '{60CA7774-9D44-4755-BB30-894E9C61221B}'; IID_ITest: TGUID = '{99754134-DAFF-49BD-BB0D-C9E4AB1D7D58}'; CLASS_Test: TGUID = '{4F7E6A2E-BA42-4DCE-9BED-309E50BEC6D1}'; type ITest = interface; Test = ITest; ITest = interface(IUnknown) ['{99754134-DAFF-49BD-BB0D-C9E4AB1D7D58}'] procedure ShowIt(const S: WideString); safecall; end; CoTest = class class function Create: ITest; class function CreateRemote(const MachineName: string): ITest; end;
implementation
uses ComObj;
class function CoTest.Create: ITest; begin Result := CreateComObject(CLASS_Test) as ITest; end;
class function CoTest.CreateRemote(const MachineName: string): ITest; begin Result := CreateRemoteComObject(MachineName, CLASS_Test) as ITest; end;
end. ---------------------------------
Так, всё вроде хорошо ... компилируем и получаем com_server.dll, регистрируем её, всё хорошо. Далее, пишем на delphi клиент, чтобы проверить, работает сервер или нет:
uses ..., com_server_TLB;
procedure TForm1.Button1Click(Sender: TObject); var t:itest; begin t := CreateCOMObject(StringToGUID('{4F7E6A2E-BA42-4DCE-9BED-309E50BEC6D1}')) as itest; t.ShowIt('123'); end;
Итак, после нажатия кнопки на экране видем окошко надпись "123", т.е. сервер работает ...
Пытаюсь вызвать сервер из Web-страницы ...
<script language="javascript"> var coms = new ActiveXObject("com_server.Test"); coms.ShowIt("123"); </script>
-не работает, говорит что coms = null, т.е. сервер не вызвался, хотя если написать, скажем ... var coms = new ActiveXObject("Word.Application"); - то запускается Ворд без проблем.
Как мне сделать чтобы функции моего сервера можно было вызвать из web-страницы, так же как это можно сделать с Word'ом скажем ... ? Спасибо!
-
з.ы. в delphi так t := CreateCOMObject(stringtoguid('com_server.Test')) as itest; тоже работает )))
-
Так ты же создасл не ActiveX-сервер, а просто некий COM-сервер .. Но юзать его в JS-коде при этом пытаешься именно как AX-сервер, коим он у тебя НЕ является
-
т.е. сервер должен являтся именно ActivX сервером? просто я смотрел сначала вызов на VBScript, там: <script language="VBScript"> set coms=CreateObject("com_server.Test") coms.ShowIt("123") </script> тоже не работает, кстати))) здесь функция CreateObject используется, т.е. по ней не понятно, астивХ это или нет, а в js вместо неё ActiveXObject ... гым)) ладно, попробую сделать именно активХ сервер, посмотрим щас)
-
да! огромное спасибо! ActiveX сервер вызывается норально и с помощью JavaScripе и с помощью VBScript))
|