Конференция "Сети" » COM сервер на Delphi и его вызов на JavaScript
 
  • hattak © (04.11.10 18:19) [0]
    Добрый вечер, господа!
    Возникла следующая проблема - нужно написать 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'ом скажем ... ?
    Спасибо!
  • hattak © (04.11.10 18:27) [1]
    з.ы. в delphi так t := CreateCOMObject(stringtoguid('com_server.Test')) as itest; тоже работает )))
  • Сергей М. © (04.11.10 18:39) [2]
    Так ты же создасл не ActiveX-сервер, а просто некий COM-сервер .. Но юзать его в JS-коде при этом пытаешься именно как AX-сервер, коим он у тебя НЕ является
  • hattak © (04.11.10 18:57) [3]
    т.е. сервер должен являтся именно ActivX сервером?
    просто я смотрел сначала вызов на VBScript, там:
    <script language="VBScript">
    set coms=CreateObject("com_server.Test")
    coms.ShowIt("123")
    </script>
    тоже не работает, кстати)))
    здесь функция CreateObject используется, т.е. по ней не понятно, астивХ это или нет, а в js вместо неё ActiveXObject ... гым)) ладно, попробую сделать именно активХ сервер, посмотрим щас)
  • hattak © (04.11.10 19:19) [4]
    да! огромное спасибо! ActiveX сервер вызывается норально и с помощью JavaScripе и с помощью VBScript))
 
Конференция "Сети" » COM сервер на Delphi и его вызов на JavaScript
Есть новые Нет новых   [134436   +25][b:0][p:0]