![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 есть?