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

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

Цель - Создание 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Откуда: СПб --> Dortmund
Сообщений: 6572
а сорри, вот что нагуглилось: "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

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

Откуда:
Сообщений: 2440
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

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



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


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

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


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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 2440
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

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


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

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

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

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

Откуда:
Сообщений: 2440
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

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

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

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

Откуда:
Сообщений: 2440
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

Откуда:
Сообщений: 2440
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

Откуда: Москва
Сообщений: 14978
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

Откуда:
Сообщений: 2440
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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить