Форум программистов, компьютерный форум CyberForum.ru

COM object/Automation - Delphi WinAPI

Восстановить пароль Регистрация
 
elite001
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 22
27.10.2016, 12:38     COM object/Automation #1
Всем привет и хорошего настроения,
экспериментирую тут с объектами автоматизации, а именно хочу не длл сделать, а exe, запущен ехе - можно подключиться из другой проги, имея в наличии интерфейсы и методы, долго читал разные статьи и прочие заметки, долго не понимал, почему ошибка "Interface not Supported", случайно на форуме увидел, что ехе-сервер нужно разок запустить через \RegServer и тогда все подключается, методы отрабатываются, правда если ехе-сервер не запущен, при вызове методов из другой программы, он запускается, а при закрытии вызывающей программы и сервер закрывается...
вопрос, а действительно нужен этот параметр \RegServer, без него никак?

для чего: ехспиренс, фан, создать приложение, с интерфейсами и методами, создать ком враппер в виде длл,которую зарегистрирую через regsvr32 и обращаться к приложению через эту длл из другой программы, управлять им в общем...


Всем спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2016, 12:38     COM object/Automation
Посмотрите здесь:

Нулевые значения баз данных. Object reference not set to an instance of an object C#
Ошибка 'Automation server can't create object' C# ASP.NET
Вызов внешних функций. Object reference not set to an instance of an object .NET
Получение имени объекта. Функция public String getName(Object object) {...} Java
JavaScript VBScript - существование automation object
C# ASP.NET .NET 4.x Передача строки из GridView: Object reference not set to an instance of an object
Delphi Method 'cell' not supported by automation object
jQuery Uncaught TypeError: Object [object Object] has no method
Заполнение формы в брузере. Фрейм ошибка method value not supported by automation object Delphi
Ошибка: Method HorizontalAlligment not supported by automation object Delphi
Pascal ABC Ошибка времени выполнения: Object reference not set to an instance of an object
Скрипт не работает - NullReferenceException: Object reference not set to an instance of an object MissionSay.S

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MyEternity
 Аватар для MyEternity
84 / 84 / 19
Регистрация: 25.04.2016
Сообщений: 453
27.10.2016, 14:34     COM object/Automation #2
Цитата Сообщение от elite001 Посмотреть сообщение
долго читал разные статьи и прочие заметки
1. Видимо не долго....
Цитата Сообщение от elite001 Посмотреть сообщение
долго не понимал
2. Видимо и сейчас не понимаете.
Цитата Сообщение от elite001 Посмотреть сообщение
вопрос, а действительно нужен этот параметр \RegServer, без него никак?
Ответ: да, действительно. Да, без него никак, смотрите пункт 2.
elite001
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 22
28.10.2016, 11:49  [ТС]     COM object/Automation #3
Цитата Сообщение от MyEternity Посмотреть сообщение
Сообщение от elite001
долго читал разные статьи и прочие заметки
1. Видимо не долго....
Сообщение от elite001
долго не понимал
2. Видимо и сейчас не понимаете.
Сообщение от elite001
вопрос, а действительно нужен этот параметр \RegServer, без него никак?
Ответ: да, действительно. Да, без него никак, смотрите пункт 2.
не понимаю, согласен..
Действительно без регистрации никак..
подскажите еще, пожалуйста, если я добавлю созданный мной интерфейс к наследуемым элементам класса (надеюсь выразился правильно)
т.е.
Delphi
1
TForm1 = class(TForm,IMyInt)
что мне нужно сделать, как объявить функцию, чтобы она срабатывала?
пытался так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
type
  TForm1 = class(TForm,IMyInt)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  protected
    Procedure Method_2(const pS: WideString);safecall;
    procedure IMyInt.Method_1 = Method_2;
    //procedure Method_1(const pS: WideString);safecall;
  private
  public
 end;
соответственно
Delphi
1
2
3
4
5
procedure TForm1.Method_2(const pS: WideString);
begin
  form1.Caption:=pS;
  messagebox(0,'100','',0);
end;
но ничего не происходит, я уже запутался =( что-то надо инициализировать?
перерегистрировал ехе'шник..
код юнита с интерфейсом, строка в комменте срабатывает..
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
unit Unit2;
 
{$WARN SYMBOL_PLATFORM OFF}
 
interface
 
uses
  ComObj, ActiveX, AxCtrls, Classes,
Project1_TLB, StdVcl,windows;
 
type
  TMyInt = class(TAutoObject, IConnectionPointContainer, IMyInt)
  private
    { Private declarations }
    FConnectionPoints: TConnectionPoints;
    FConnectionPoint: TConnectionPoint;
    FEvents: IMyIntEvents;
    { note: FEvents maintains a *single* event sink. For access to more
      than one event sink, use FConnectionPoint.SinkList, and iterate
      through the list of sinks. }
  public
    procedure Initialize; override;
  protected
    procedure Method_1(const pS: WideString); safecall;
    { Protected declarations }
    property ConnectionPoints: TConnectionPoints read FConnectionPoints
      implements IConnectionPointContainer;
    procedure EventSinkChanged(const EventSink: IUnknown); override;
 
  end;
 
implementation
 
uses ComServ;
 
procedure TMyInt.EventSinkChanged(const EventSink: IUnknown);
begin
  FEvents := EventSink as IMyIntEvents;
end;
 
procedure TMyInt.Initialize;
begin
  inherited Initialize;
  FConnectionPoints := TConnectionPoints.Create(Self);
  if AutoFactory.EventTypeInfo <> nil then
    FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
      AutoFactory.EventIID, ckSingle, EventConnect)
  else FConnectionPoint := nil;
end;
 
 
procedure TMyInt.Method_1(const pS: WideString);
begin
//  messagebox(0,PWIDEChar(pS),'',0);
end;
 
initialization
  TAutoObjectFactory.Create(ComServer, TMyInt, Class_MyInt,
    ciMultiInstance, tmApartment);
end.

спасибо за наставления!

Добавлено через 53 минуты
В общем я совсем запутался в этих интерфейсах, ком объектах и прочем... если в юнит2 добавить в секцию юзес юнит1 и в методе уже оперировать с form1, то все работает, в принципе - то что мне и нужно.. но как теперь вызывать евенты?

Добавлено через 19 часов 9 минут
просто шикарнейшая статья про евенты и комы...
изложено доступно и понятно.. спасибо всем!!!
HTML5
1
http://edn.embarcadero.com/article/27126
Yandex
Объявления
28.10.2016, 11:49     COM object/Automation
Ответ Создать тему
Опции темы

Текущее время: 15:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru