Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

COM [D6, Win2k]


Marina_Sm ©   (2004-11-08 12:01:00) 

Почему при вызове COM-объекта, созданного в Delphi:
tab = new ActiveXObject("FirstCom.Number");   //visial Basic
Com создается и тут же разрушается (выводится сообщение в методе destroy), хотя когда его вызываю через приложение delphi все функционирует нормально. Помогите, пожалуйста.


Marina_Sm   (2004-11-17 10:54:00) [1]

Так из Java Script тоже не работает :( Может я конечно что-то не так набила... Если не сложно пришлите, пожалуйста, исходник на почту marsv2004@mail.ru


FastByte   (2004-11-16 07:48:00) [2]

Вот кусок моего кода, который работает
1. ===== Интерфейс и сразу GUID Com класса: =======

unit uPluginInterfaceRS;
 interface
 const
  Class_EconomCalcRollingSources: TGUID =
                   '{77689308-ACF5-40AA-94EB-64F505DFB7A7}';
type
  IEconomCalcRS = interface
  ['{4C304431-FC32-48CC-B1A3-2E58F51866E3}']
    function Exec:String;
  end;
implementation
end.

2. ====== Реализация =======

unit uComObject;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
 Windows, ActiveX, Classes, ComObj,uPluginInterfaceRS;

type
 TEconomCalcRollingSources = class(TComObject,IEconomCalcRS)
 protected
   function Exec:String;
 end;

implementation

uses ComServ,uFormEconomCalc;

{ TEconomCalcRollingSources }

function TEconomCalcRollingSources.Exec: String;
var
 pForm:TFormMain;
begin
 pForm:=TFormMain.Create(nil);
 pForm.ShowModal;
 pForm.Free;
end;

initialization
 TComObjectFactory.Create(ComServer, TEconomCalcRollingSources,
 Class_EconomCalcRollingSources,
   'EconomCalcRollingSources', '', ciMultiInstance,tmApartment);
end.


Vitalik   (2004-11-10 11:25:00) [3]

На http://www.interface.ruв "поиск по сайту" введите DELPHI и COM.
Вот в 5й части про это и написано.


Vitalik   (2004-11-10 11:15:00) [4]

Предположу, что нужно создавать не COM Object, а Automation Object. Тогда ваш класс, реализующий интерфейс будет наследником не TComObject a TAutoObject. А этот класс (TAutoObject) реализует интерфейс IDispatch, необходимый для вызова методов COM объектов из скриптовых языков. Собственно, на сколько мне известно, объекты автоматизации (Aoutomation Object) для того и нужны, чтобы их можно было использовать в скриптовых языках.


Marina_Sm   (2004-11-09 20:50:00) [5]

unit NumIntf;

interface

type
 INumber = interface
   ['{B4131140-7C2F-11D0-98D0-444553540000}']
   function GetValue: Integer; stdcall;
   procedure SetValue (New: Integer); stdcall;
   procedure Increase; stdcall;
 end;

implementation

end.

Может где-нибудь есть пример? :( А то совсем этот Com замучил


VMcL   (2004-11-09 07:24:00) [6]

>> Marina_Sm  (09.11.04 00:22) [6]

А INumber?


Marina_Sm   (2004-11-09 00:22:00) [7]

unit NumServ;

interface

uses
 Windows, ActiveX, ComObj, NumIntf;

type
 TNumber = class(TComObject, INumber)
 private
   fValue: Integer;
 public
   function GetValue: Integer; virtual; stdcall;
   procedure SetValue (New: Integer); virtual; stdcall;
   procedure Increase; virtual; stdcall;
   procedure Initialize; override;
   destructor Destroy; override;
 end;

const
 Class_Number: TGUID = '{5B2EF181-3AAE-11D3-B9F1-00000100A27B}';

implementation

uses ComServ;

{ TNumber }

destructor TNumber.Destroy;
begin
 inherited;
 MessageBox (0, 'Object Destroyed',
   'TDLLNumber', mb_OK); // API call
end;

function TNumber.GetValue: Integer;
begin
 Result := fValue;
end;

procedure TNumber.Increase;
begin
 Inc (fValue);
end;

procedure TNumber.Initialize;
begin
 inherited;
 fValue := 10;
 MessageBox (0, 'Создан!!!',
   'TDLLNumber', mb_OK); // API call
end;

procedure TNumber.SetValue(New: Integer);
begin
 fValue := New;
end;

initialization
 TComObjectFactory.Create(ComServer, TNumber, Class_Number,
   'Number', 'Number Server', ciMultiInstance, tmApartment);
end.


VMcL   (2004-11-08 15:56:00) [8]

>> Marina_Sm  (08.11.04 14:25) [3]

Код COM-объекта есть?


Marina_Sm   (2004-11-08 14:35:00) [9]

Если честно, мне когда этот пример давали, сказали, что visial basic. Но мне кажется , что это Java Script (расширение js). Хотя не знаю :) А текст для вызова Word такой:
tab = new ActiveXObject("Word.Application");       //ActiveX
tab.visible = true;

function initIO() {
Shell = WScript.CreateObject("Wscript.Shell")
fso = new ActiveXObject("Scripting.FileSystemObject");
ForReading = 1, ForWriting = 2; ForAppending = 3;
}
function echo(txt) {
WScript.Echo(txt);
}


Marina_Sm   (2004-11-08 14:25:00) [10]

tab = new ActiveXObject("Comics.BGSocket");      
tab.SetValue(2);
У меня на первой строке пишет что объект создался, тут же уничтожается, и при второй строке уже пишется что tab = nil и им пользоваться нельзя (или что-то вроде этого на английском)/ хотя если word вызывать, то все проходит нормально.
Может где нибудь есть толковый пример создания COM - объекта на Delphi? Честно говоря, я уже измучалась с этим Com'ом :_-(


VMcL   (2004-11-08 14:04:00) [11]

>> Marina_Sm  (08.11.04 12:01)

Как объявлена переменная tab? Где она еще используется?


digger   (2004-11-08 12:41:00) [12]

В Delphi есть такая функция CoInitialize, которую нужно запускать перед созданием COM объекта. Может быть в VB есть?


Наверх

Титульная страница Поиск, карта сайта Написать письмо