Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
Доброго дня господа !

Цель - Создание DLL для использования НЕ только DELPHI-ой

Имею

Unit Interface
----------------------------------------------
unit InterfaceList;

interface

type 
  IMyInterface = Interface
  ['{0806339A-4EDD-48A5-A60A-54E6E9AF94E1}']
  function Substr(Const aStr: WideString; Index, Count: Integer): WideString;
end;

implementation

end.

----------------------------------------------


Unit своего объекта
----------------------------------------------
unit ObjectList;

interface

uses
  Dialogs,
  InterfaceList;

type
  TMyClass = class(TInterfacedObject, IMyInterface)
  private

  protected

  public
    destructor Destroy; override;
    function   Substr(Const aStr: WideString; Index, Count: Integer): WideString;
end;

{$R *.res}

implementation

  function TMyClass.Substr(Const aStr: WideString; Index, Count: Integer): WideString;
  begin
    Result:=Copy(aStr,Index,Count);
  end;

  destructor TMyClass.Destroy;
  begin
    ShowMessage('Destroy');
    inherited;
  end;

end.


----------------------------------------------

Unit Dll-Library
----------------------------------------------
library DllLibrary;

uses
  ComServ,
  InterfaceList in 'InterfaceList.pas',
  ObjectList    in 'ObjectList.pas';

{$R *.res}

  function CreateMyClass: IMyInterface; stdcall;
  begin
    Result:=TMyClass.Create;
  end;

  function ReturnValue: Integer; stdcall;
  begin
    Result:=100;
  end;

exports
  CreateMyClass,
  ReturnValue,
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

begin


end.

----------------------------------------------


Unit инициирующий вызов
----------------------------------------------
unit DllMain;

interface

uses
  Forms, StdCtrls, Controls, Classes, InterfaceList, SysUtils, Dialogs;

type
  TfrMain = class(TForm)
    edMain: TEdit;
    lbMain: TLabel;
    btMain: TButton;
    Button1: TButton;
    procedure btMainClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frMain: TfrMain;
  function CreateMyClass: IMyInterface; stdcall; external 'DllLibrary.dll';
  function ReturnValue:   Integer;      stdcall; external 'DllLibrary.dll'
implementation

{$R *.dfm}

procedure TfrMain.btMainClick(Sender: TObject);
var
  dllObject: IMyInterface;
begin
  dllObject:=CreateMyClass;
  lbMain.Caption:=dllObject.Substr(edMain.Text,1,10);
end;

procedure TfrMain.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(ReturnValue));
end;

end.


----------------------------------------------

Возникли вопросы
- зачем создан дополнительный класс IMyInterface,разве невозможно
сослаться непосредственно на TMyClass.
Поясните пожалуйста ...

- как вызвать функцию ReturnValue (даже не класс) из VBS

VBS - скрипт прилагаю
----------------------------------------------
Dim lb
On Error Resume Next
Err.Clear 
MsgBox "Create Dll"
Set lb = CreateObject("DllLibrary.ReturnValue")
MsgBox Err.Source & "_" & Err.Description & "_" & Err.Number
On Error Goto 0
MsgBox "Exit"


----------------------------------------------

Заранее благодарен !
5 сен 19, 23:29    [21964994]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5107
HOME_X,

VBScript умеет работать только с объектами автоматизации, т.е. интерфейсом IDispatch

для этого в дельфи нужно создать ActiveX library, добавить объект автоматизации - с этого и нужно начинать, а не с формочки
эта dll-ка эскпортирует сервисные функции, которые и используются системой для созданния объекта (DllGetClassObject)

в этом случае всю черновую работу по созданию библиотеки типов и интерфейсов дельфи возьмёт на себя, на начальнм этапе в эти кишки лезть не стоит
6 сен 19, 00:06    [21965009]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
kealon(Ruslan),

Не могли бы скинуть ссылку на простой пример
Или на основании приведенного кода сделать правильные изменения

Не приходилось такое делать

Спасибо
6 сен 19, 01:25    [21965031]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5107
HOME_X,

там праткически ничего не менялось с начальных версий дельфи - тынц

в вашем случае обязательно надо добавлять галочку "Mark interface Oleautomation"
6 сен 19, 08:03    [21965055]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
tunknown
Member

Откуда:
Сообщений: 674
На эту тему существует dynawrapNt. Ещё здесь упоминание. Возможно, полезным будет статья Adding Active Scripting to your Delphi Win32 application.

Если не секрет, то почему нужно вызывать именно из vbscript?
6 сен 19, 09:24    [21965082]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5107
tunknown,

на русском есть более ранняя и понятная статья
6 сен 19, 09:41    [21965101]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3326
это еще можно глянуть:
http://www.delphisources.ru/pages/faq/base/com_automation.html
в своё время оказалась самой информативной
6 сен 19, 10:15    [21965130]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6510
HOME_X,

А еще можно было бы экспортировать обычные функции, первым параметром бы в которых шел бы handle обьекта класса, а далее обычные параметры. Зачем интерфейсы вообще?
6 сен 19, 11:01    [21965170]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6510
а сорри, вот что нагуглилось: "You could only do this (possibly) if it was a COM object. VBScript does not support calling normal API functions"
6 сен 19, 11:18    [21965183]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
Василий 2
Member

Откуда:
Сообщений: 700
Басик же ущербный, а басик скрипт ущербный вдвойне, чего вы от него хотите
6 сен 19, 14:23    [21965379]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
kealon(Ruslan)
tunknown,

на русском есть более ранняя и понятная статья


Спасибо - работаю

еще вопросы
- будет ли COM объект работать с простейшим вызовом типа
Private Declare Function test1 Lib "D:\\testdll.dll" Alias "Square1" (ByVal n As Double, ByRef out As Double) As Double

- возможен ли его запуск из JAR библиотек (JDK 7-8)

- возможна ли работа без регистрации regsvr32.exe
Не имею допуск к реестра ПК - просто ложу DLL в любой каталог определенный в PATH сессии пользователя


Спасибо
7 сен 19, 14:52    [21965944]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
Кроик Семён
HOME_X,
Зачем интерфейсы вообще?



Тоже думал над этим
У Вас есть реальный и простой пример ?
Сбросьте как видете ситцуацию попробую


Может чтобы было красивенько ....и профессиональненко, для этого сделали
7 сен 19, 14:55    [21965945]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
Василий 2
Басик же ущербный, а басик скрипт ущербный вдвойне, чего вы от него хотите


Ну что Вам ответить - МАЕМО ЩО МАЕМО !!!!!!!

P.S. Я бы оставил вообще один язык программирования - РУССССССКИЙ
7 сен 19, 15:19    [21965959]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
HOME_X
P.S. Я бы оставил вообще один язык программирования - РУССССССКИЙ
Было уже. АЛМИР, Отстой!
7 сен 19, 17:43    [21966015]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60151
1C же есть, мегапопулярный и распространенный в своей нише.

Posted via ActualForum NNTP Server 1.5

7 сен 19, 18:13    [21966033]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
kealon(Ruslan)
HOME_X,

там праткически ничего не менялось с начальных версий дельфи - тынц

в вашем случае обязательно надо добавлять галочку "Mark interface Oleautomation"



Вроде все получилось с указанной Вами статьей - спасибо !!!!!!!

Добавлю что регистрацию DLL в Win7 необходимо проводить с правами админа (ну если типа кто забыл)

Исследовал Win - реестр - GUID и путь к dll - найден, но имя классов не обнаружил ?

Таким образом вопрос, как применительно к статье "тынц" (имена классов я БЛЕЛ четко)
следует писать вызов из VBS (обилие классов меня смутило и то что не нашел эти имена в сис. реестре)
Dim lb
On Error Resume Next
Err.Clear 
MsgBox "Create Dll"
Set lb = CreateObject("как писать здесь ????????????")
MsgBox Err.Source & "_" & Err.Description & "_" & Err.Number
On Error Goto 0
MsgBox "Exit"


Спасибо
7 сен 19, 21:33    [21966129]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
Gator
HOME_X
P.S. Я бы оставил вообще один язык программирования - РУССССССКИЙ
Было уже. АЛМИР, Отстой!


Это кажется из середины 60-х, АЛГОЛ,FORTRAN,Б3-32,МК-61,Козерог-1 и Аполлон-11

Не знаю такого языка, но точно помню что меня тогда еще не было
7 сен 19, 21:44    [21966137]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48141

HOME_X
Это кажется из середины 60-х

Нет, РАЯ это лет на 20 позже: https://ru.wikipedia.org/wiki/Учебный_алгоритмический_язык

Posted via ActualForum NNTP Server 1.5

7 сен 19, 22:05    [21966144]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
HOME_X
kealon(Ruslan)
HOME_X,

там праткически ничего не менялось с начальных версий дельфи - тынц

в вашем случае обязательно надо добавлять галочку "Mark interface Oleautomation"



Вроде все получилось с указанной Вами статьей - спасибо !!!!!!!

Добавлю что регистрацию DLL в Win7 необходимо проводить с правами админа (ну если типа кто забыл)

Исследовал Win - реестр - GUID и путь к dll - найден, но имя классов не обнаружил ?

Таким образом вопрос, как применительно к статье "тынц" (имена классов я БЛЕЛ четко)
следует писать вызов из VBS (обилие классов меня смутило и то что не нашел эти имена в сис. реестре)
Dim lb
On Error Resume Next
Err.Clear 
MsgBox "Create Dll"
Set lb = CreateObject("как писать здесь ????????????")
MsgBox Err.Source & "_" & Err.Description & "_" & Err.Number
On Error Goto 0
MsgBox "Exit"


Спасибо


Добавлю - по последнему пункту статьи
Использовал OLE VIEW -
Object classes/All Objects - похожего объекта нет
Type Library - есть в наличии тип, интерфейсы, GUID-ы

Отсюда и
Set lb = CreateObject("как писать здесь ????????????")
Подскажите где ошибка - спасибо
8 сен 19, 11:00    [21966251]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
Dimitry Sibiryakov
HOME_X
Это кажется из середины 60-х

Нет, РАЯ это лет на 20 позже: https://ru.wikipedia.org/wiki/Учебный_алгоритмический_язык
Нет. Это там ещё символ ∑ был.
Код бился на перфоленты и гонялся на Наири 1-2
8 сен 19, 11:19    [21966256]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
Юзай CreateOLEObject/GetOLEObject
посмотри Почему Эксель завершается только после CoUninitialize?
8 сен 19, 11:46    [21966263]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
Gator
Юзай CreateOLEObject/GetOLEObject
посмотри Почему Эксель завершается только после CoUninitialize?


Вопрос звучал так - как называется сервер CreateOLEObject('???????????');
Ответ по статье звучал так - "строка Help String выступает в качестве внешнего имени сокласса (СОМ сервера)."

Использование OLE View для получения информации о сервере. После регистрации СОМ сервера информацию о нем можно просмотреть с помощью OLE View. В разделе Object classes/All Objects [SIZE=2][b]информация о сервере будет записана под именем, заданным в окне редактора библиотеки типов Help String для сокласса[/b][/SIZE]. Таким образом, строка Help String выступает в качестве внешнего имени сокласса (СОМ сервера). В разделе Type Libraries можно найти информацию о библиотеке типов под именем, которое было указано в окне Help String редактора библиотеки типов для библиотеки типов.

В разделе Type Libraries можно найти информацию о библиотеке типов под именем, которое было указано в окне Help String редактора библиотеки типов для библиотеки типов.

Этот тип существует, но сервера нет, наверное что-то сделал не так (НЕДОЧИТАЛ/НЕДОПИСАЛ/НЕДОПОНЯЛ)
Или в статье момент пропущен

По Вашей ссылке имели в виду = CoInitialize(nil);
Но я смотрю ПОКА через приложение OLEVIEW
Оно визуализирует все типы и сервера OLE которые есть в системе

begin
  CoInitialize(nil);
  try
    TestExcel;
  finally
    Write('Before CoUnitialize: Do you see Excel? I think you don''t :)'); Readln;
    CoUnInitialize;
  end;
  Readln;
end.
8 сен 19, 12:44    [21966272]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
HOME_X,

подобная ситуация https://www.sql.ru/forum/558875-a/kak-pravilno-sozdat-com-obekt?hl=createobject

1) Интерфейс должен наследоваться от IDispatch
2) Методs должнs иметь dispid
3) Класс, реализующий интерфейс, должен наследоваться от TAutoObject
4) Фабрика класса должна быть TAutoObjectFactory

Или делаешь New->Automation Object
8 сен 19, 13:03    [21966273]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
HOME_X,

В системе уже должен быть установленный зарегистрированный ехешник - OLE/COM - сервер , обеспечивающий свои интерфейсы, фабрики классов etc. Напр, Word/OOWriter для doc, Acrord для pdf

Что у вас прописано в реестре для '{0806339A-4EDD-48A5-A60A-54E6E9AF94E1}'?
У меня - ничего.
8 сен 19, 16:39    [21966316]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
Gator
У меня - ничего.


Аналогично
но не хотелось бы затягивать переписку и говорить ни о чем

Вы можете
1. поработать по статье = http://www.introligator.org/articles/3/78
(затрат времени не более 3-5 мин даже у меня .....)

2. попытаться осуществить вызов созданного в статье COM объекта

Dim lb
On Error Resume Next
Err.Clear 
MsgBox "Create Dll"
Set lb = CreateObject("?????????????????????????")
call lb."ЛЮБОЙ МЕТОД С ПАРАМЕТРОМ"
MsgBox Err.Source & "_" & Err.Description & "_" & Err.Number
On Error Goto 0
MsgBox "Exit"


Мне кажется статья немножко не то регистрирует в "фабрике классов"
TTypedComObjectFactory.Create(ComServer, TSmpCOM, Class_SmpCOM, ciInternal, tmApartment);

Но четко сказать не могу - нет практики и понимания работы с COM

Спасибо
9 сен 19, 00:16    [21966441]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5107
HOME_X
Отсюда и
Set lb = CreateObject("как писать здесь ????????????")
Подскажите где ошибка - спасибо
если всё правильно написали, то
CreateObject("<Имя библиотеки типов>.<Имя CO-объекта>")


Имя класса это то, что показываетс в idl-редакторе

вот например
+
[
  uuid(8BEDA6E2-2A4C-40E8-8389-B2DD7EC0C0F2),
  version(1.0)

]
library TestLib1
{

  importlib("stdole2.tlb");

  interface IObj1;
  coclass Obj1;


  [
    uuid(D9E05CEC-4AD8-4E1E-9033-2C05EAAD239E),
    helpstring("Dispatch interface for Obj1 Object"),
    dual,
    oleautomation
  ]
  interface IObj1: IDispatch
  {
    [id(0x000000C9)]
    HRESULT _stdcall Method1([in] long Param1, [out, retval] BSTR* Param2);
  };

  [
    uuid(9E1317E8-3B21-4CAD-BB04-2C988DFEEA6A),
    helpstring("Obj1 Object")
  ]
  coclass Obj1
  {
    [default] interface IObj1;
  };

};


указан coclass Obj1;
соответственно вызов будет
CreateObject("TestLib1.Obj1")
9 сен 19, 07:23    [21966496]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11154
HOME_X
Set lb = CreateObject("?????????????????????????")
Открываете реестр, ищите ветку HKCR\CLSID<Ваш CLSID> в ней открываете подветку ProgID и смотрите на имя класса
9 сен 19, 16:18    [21967037]     Ответить | Цитировать Сообщить модератору
 Re: DLL - вызов из VBS  [new]
HOME_X
Member

Откуда:
Сообщений: 2385
Доброго дня господа

Решение по пунктам
1. Создать класс, который будет подключать COM- сервер,
в нем одно поле (Edit1), которое будет меняться

unit frMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetCurrentDir(Edit1.Text);
end;

end.


2.File->New->Other->ActiveX->ActiveX Library
Это заготовка библиотеки проекта, меняем название, подключает frMain
library MyLibrary;

uses
  ComServ,
  MyLibrary_TLB in 'MyLibrary_TLB.pas',
  MyClass in 'MyClass.pas' {MyClass: CoClass},
  frMain in 'frMain.pas' {Form1};

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

{$R *.TLB}

{$R *.RES}

begin

end.


3.File->New->Other->ActiveX->Automation Object
Вводим имя сокласса = MyClass, + check на создание библиотеки типов
Создаем один Properry в окне редактора библиотеки типов = LastValue
Используя это свойство буду менять frMain.Edit1.Text
unit MyLibrary_TLB;

// ************************************************************************ //
// WARNING                                                                    
// -------                                                                    
// The types declared in this file were generated from data read from a       
// Type Library. If this type library is explicitly or indirectly (via        
// another type library referring to this type library) re-imported, or the   
// 'Refresh' command of the Type Library Editor activated while editing the   
// Type Library, the contents of this file will be regenerated and all        
// manual modifications will be lost.                                         
// ************************************************************************ //

// PASTLWTR : 1.2
// File generated on 11/09/2019 22:22:17 from Type Library described below.

// ************************************************************************  //
// Type Lib: C:\WORK\COM_MY\MyLibrary.tlb (1)
// LIBID: {4A03744B-CA0F-4144-952C-3AA83A5FC1E0}
// LCID: 0
// Helpfile: 
// HelpString: MyLibrary Library
// DepndLst: 
//   (1) v2.0 stdole, (C:\Windows\system32\stdole2.tlb)
// ************************************************************************ //
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. 
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
  

// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:        
//   Type Libraries     : LIBID_xxxx                                      
//   CoClasses          : CLASS_xxxx                                      
//   DISPInterfaces     : DIID_xxxx                                       
//   Non-DISP interfaces: IID_xxxx                                        
// *********************************************************************//
const
  // TypeLibrary Major and minor versions
  MyLibraryMajorVersion = 1;
  MyLibraryMinorVersion = 0;

  LIBID_MyLibrary: TGUID = '{4A03744B-CA0F-4144-952C-3AA83A5FC1E0}';

  IID_IMyClass: TGUID = '{BD29A72C-421A-4F3A-9C7C-414F9BA055F9}';
  CLASS_MyClass: TGUID = '{62C64048-DC29-4AEA-B9F3-3A0F7999130A}';
type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary                    
// *********************************************************************//
  IMyClass = interface;
  IMyClassDisp = dispinterface;

// *********************************************************************//
// Declaration of CoClasses defined in Type Library                       
// (NOTE: Here we map each CoClass to its Default Interface)              
// *********************************************************************//
  MyClass = IMyClass;


// *********************************************************************//
// Interface: IMyClass
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {BD29A72C-421A-4F3A-9C7C-414F9BA055F9}
// *********************************************************************//
  IMyClass = interface(IDispatch)
    ['{BD29A72C-421A-4F3A-9C7C-414F9BA055F9}']
    function Get_LastValue: WideString; safecall;
    procedure Set_LastValue(const Value: WideString); safecall;
    property LastValue: WideString read Get_LastValue write Set_LastValue;
  end;

// *********************************************************************//
// DispIntf:  IMyClassDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {BD29A72C-421A-4F3A-9C7C-414F9BA055F9}
// *********************************************************************//
  IMyClassDisp = dispinterface
    ['{BD29A72C-421A-4F3A-9C7C-414F9BA055F9}']
    property LastValue: WideString dispid 201;
  end;

// *********************************************************************//
// The Class CoMyClass provides a Create and CreateRemote method to          
// create instances of the default interface IMyClass exposed by              
// the CoClass MyClass. The functions are intended to be used by             
// clients wishing to automate the CoClass objects exposed by the         
// server of this typelibrary.                                            
// *********************************************************************//
  CoMyClass = class
    class function Create: IMyClass;
    class function CreateRemote(const MachineName: string): IMyClass;
  end;

implementation

uses ComObj;

class function CoMyClass.Create: IMyClass;
begin
  Result := CreateComObject(CLASS_MyClass) as IMyClass;
end;

class function CoMyClass.CreateRemote(const MachineName: string): IMyClass;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_MyClass) as IMyClass;
end;

end.


В коде сокласса -
- приписать момент создания основной формы
- write-read-er на изменение свойства LastValue
- прописать момент удаление формы

Т.е.
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
function Get_LastValue: WideString; safecall;
procedure Set_LastValue(const Value: WideString); safecall;

unit MyClass;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  ComObj, ActiveX, AxCtrls, Classes, MyLibrary_TLB, StdVcl, frMain, Dialogs;

type
  TMyClass = class(TAutoObject, IConnectionPointContainer, IMyClass)
  private
    { Private declarations }
    FConnectionPoints: TConnectionPoints;
    FConnectionPoint: TConnectionPoint;
    { 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. }

    Form1: TForm1;

  public
    procedure Initialize; override;

    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;

  protected
    { Protected declarations }
    property ConnectionPoints: TConnectionPoints read FConnectionPoints implements IConnectionPointContainer;
    procedure EventSinkChanged(const EventSink: IUnknown); override;
    function Get_LastValue: WideString; safecall;
    procedure Set_LastValue(const Value: WideString); safecall;
  end;

implementation

uses ComServ;

procedure TMyClass.EventSinkChanged(const EventSink: IUnknown);
begin

end;

procedure TMyClass.Initialize;
begin
  inherited Initialize;
  FConnectionPoints := TConnectionPoints.Create(Self);
  if AutoFactory.EventTypeInfo <> nil then FConnectionPoint := FConnectionPoints.CreateConnectionPoint(AutoFactory.EventIID, ckSingle, EventConnect) else FConnectionPoint := nil;
end;


function TMyClass.Get_LastValue: WideString;
begin
  Result:=Form1.Edit1.Text;
end;

procedure TMyClass.Set_LastValue(const Value: WideString);
begin
  Form1.Edit1.Text:=Value;
end;

procedure TMyClass.AfterConstruction;
begin
  inherited;
  Form1:= TForm1.Create(nil);
  Form1.Show;
end;

procedure TMyClass.BeforeDestruction;
begin
  ShowMessage('Disconnect');
  if assigned(Form1) then Form1.Free;
  inherited;
end;

initialization
  TAutoObjectFactory.Create(ComServer, TMyClass, Class_MyClass, ciMultiInstance, tmApartment);
end.


2. regsvr32.exe MyLibrarry.dll
3. Вызовы из VBS+MO

Dim lb
On Error Resume Next
Err.Clear 
MsgBox "Create Dll"
Set lb = CreateObject("MyLibrary.MyClass")
lb.LastValue = "huilo"
MsgBox lb.LastValue
MsgBox Err.Source & "_" & Err.Description & "_" & Err.Number
On Error Goto 0
MsgBox "Exit"


Dim w As New MyClass
Sub ff12()
  w.LastValue = "huilo"
  MsgBox w.LastValue
End Sub


Основная ошибка допущенная ранее - регистрация типа, а не объекта
3.File->New->Other->ActiveX->Automation Object
initialization
TAutoObjectFactory.Create(ComServer, TMyClass, Class_MyClass, ciMultiInstance, tmApartment);

Всем сспасибо
13 сен 19, 09:34    [21970082]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить