powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - вызов из VBS
25 сообщений из 28, страница 1 из 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
25 сообщений из 28, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - вызов из VBS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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