powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - вызов из VBS
28 сообщений из 28, показаны все 2 страниц
DLL - вызов из VBS
    #39858193
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

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

Имею

Unit Interface
----------------------------------------------
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
unit InterfaceList;

interface

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

implementation

end.


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


Unit своего объекта
----------------------------------------------
Код: pascal
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.
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
----------------------------------------------
Код: pascal
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.
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 инициирующий вызов
----------------------------------------------
Код: pascal
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.
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 - скрипт прилагаю
----------------------------------------------
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
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"



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

Заранее благодарен !
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858208
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

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

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

в этом случае всю черновую работу по созданию библиотеки типов и интерфейсов дельфи возьмёт на себя, на начальнм этапе в эти кишки лезть не стоит
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858226
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

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

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

Спасибо
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858242
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

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

в вашем случае обязательно надо добавлять галочку "Mark interface O leautomation"
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858260
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На эту тему существует dynawrapNt . Ещё здесь упоминание . Возможно, полезным будет статья Adding Active Scripting to your Delphi Win32 application .

Если не секрет, то почему нужно вызывать именно из vbscript?
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858274
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tunknown,

на русском есть более ранняя и понятная статья
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858289
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это еще можно глянуть:
http://www.delphisources.ru/pages/faq/base/com_automation.html
в своё время оказалась самой информативной
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858313
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

А еще можно было бы экспортировать обычные функции, первым параметром бы в которых шел бы handle обьекта класса, а далее обычные параметры. Зачем интерфейсы вообще?
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858323
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а сорри, вот что нагуглилось: "You could only do this (possibly) if it was a COM object. VBScript does not support calling normal API functions"
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858446
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Басик же ущербный, а басик скрипт ущербный вдвойне, чего вы от него хотите
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858744
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 сессии пользователя


Спасибо
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858745
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик СемёнHOME_X,
Зачем интерфейсы вообще?



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


Может чтобы было красивенько ....и профессиональненко, для этого сделали
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858757
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Басик же ущербный, а басик скрипт ущербный вдвойне, чего вы от него хотите

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

P.S. Я бы оставил вообще один язык программирования - РУССССССКИЙ
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858798
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XP.S. Я бы оставил вообще один язык программирования - РУССССССКИЙБыло уже. АЛМИР, Отстой!
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858813
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1C же есть, мегапопулярный и распространенный в своей нише.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858876
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)HOME_X,

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

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


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

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

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

Таким образом вопрос, как применительно к статье "тынц" (имена классов я БЛЕЛ четко)
следует писать вызов из VBS (обилие классов меня смутило и то что не нашел эти имена в сис. реестре)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
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"



Спасибо
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858879
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorHOME_XP.S. Я бы оставил вообще один язык программирования - РУССССССКИЙБыло уже. АЛМИР, Отстой!

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

Не знаю такого языка, но точно помню что меня тогда еще не было
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858885
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XЭто кажется из середины 60-х

Нет, РАЯ это лет на 20 позже: https://ru.wikipedia.org/wiki/Учебный_алгоритмический_язык
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858948
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xkealon(Ruslan)HOME_X,

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

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


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

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

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

Таким образом вопрос, как применительно к статье "тынц" (имена классов я БЛЕЛ четко)
следует писать вызов из VBS (обилие классов меня смутило и то что не нашел эти имена в сис. реестре)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
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("как писать здесь ????????????")
Подскажите где ошибка - спасибо
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858951
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovHOME_XЭто кажется из середины 60-х

Нет, РАЯ это лет на 20 позже: https://ru.wikipedia.org/wiki/Учебный_алгоритмический_язык Нет. Это там ещё символ ∑ был.
Код бился на перфоленты и гонялся на Наири 1-2
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858954
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858962
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorЮзай CreateOLEObject/GetOLEObject
посмотри Почему Эксель завершается только после CoUninitialize?

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

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


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

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

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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
begin
  CoInitialize(nil);
  try
    TestExcel;
  finally
    Write('Before CoUnitialize: Do you see Excel? I think you don''t :)'); Readln;
    CoUnInitialize;
  end;
  Readln;
end.
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858963
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39858999
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

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

Что у вас прописано в реестре для '{0806339A-4EDD-48A5-A60A-54E6E9AF94E1}'?
У меня - ничего.
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39859077
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorУ меня - ничего.


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

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

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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
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

Спасибо
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39859116
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XОтсюда и
Set lb = CreateObject("как писать здесь ????????????")
Подскажите где ошибка - спасибоесли всё правильно написали, то
Код: vbnet
1.
CreateObject("<Имя библиотеки типов>.<Имя CO-объекта>")



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

вот например
Код: plaintext
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.
[
  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;
соответственно вызов будет
Код: vbnet
1.
CreateObject("TestLib1.Obj1")
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39859430
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Код: vbnet
1.
Set lb = CreateObject("?????????????????????????")

Открываете реестр, ищите ветку HKCR\CLSID<Ваш CLSID> в ней открываете подветку ProgID и смотрите на имя класса
...
Рейтинг: 0 / 0
DLL - вызов из VBS
    #39861301
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа

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

Код: plsql
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.
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
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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
Код: plsql
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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
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;

Код: vbnet
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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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);

Всем сспасибо
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - вызов из VBS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]