Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - вызов из VBS / 25 сообщений из 28, страница 1 из 2
05.09.2019, 23:29
    #39858193
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
Доброго дня господа !

Цель - Создание 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
06.09.2019, 00:06
    #39858208
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
HOME_X,

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

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

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

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

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

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

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

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

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

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

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



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


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

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

P.S. Я бы оставил вообще один язык программирования - РУССССССКИЙ
...
Рейтинг: 0 / 0
07.09.2019, 17:43
    #39858798
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
HOME_XP.S. Я бы оставил вообще один язык программирования - РУССССССКИЙБыло уже. АЛМИР, Отстой!
...
Рейтинг: 0 / 0
07.09.2019, 18:13
    #39858813
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
1C же есть, мегапопулярный и распространенный в своей нише.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.09.2019, 21:33
    #39858876
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
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
07.09.2019, 21:44
    #39858879
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
GatorHOME_XP.S. Я бы оставил вообще один язык программирования - РУССССССКИЙБыло уже. АЛМИР, Отстой!

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

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

Нет, РАЯ это лет на 20 позже: https://ru.wikipedia.org/wiki/Учебный_алгоритмический_язык
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.09.2019, 11:00
    #39858948
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
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
08.09.2019, 11:19
    #39858951
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
Dimitry SibiryakovHOME_XЭто кажется из середины 60-х

Нет, РАЯ это лет на 20 позже: https://ru.wikipedia.org/wiki/Учебный_алгоритмический_язык Нет. Это там ещё символ ∑ был.
Код бился на перфоленты и гонялся на Наири 1-2
...
Рейтинг: 0 / 0
08.09.2019, 11:46
    #39858954
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
...
Рейтинг: 0 / 0
08.09.2019, 12:44
    #39858962
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
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
08.09.2019, 13:03
    #39858963
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
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
08.09.2019, 16:39
    #39858999
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
HOME_X,

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

Что у вас прописано в реестре для '{0806339A-4EDD-48A5-A60A-54E6E9AF94E1}'?
У меня - ничего.
...
Рейтинг: 0 / 0
09.09.2019, 00:16
    #39859077
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DLL - вызов из VBS
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DLL - вызов из VBS / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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