DLL - вызов из VBS

HOME_X
Дата: 05.09.2019 23:29:37
Доброго дня господа !

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


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

Заранее благодарен !
kealon(Ruslan)
Дата: 06.09.2019 00:06:32
HOME_X,

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

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

в этом случае всю черновую работу по созданию библиотеки типов и интерфейсов дельфи возьмёт на себя, на начальнм этапе в эти кишки лезть не стоит
HOME_X
Дата: 06.09.2019 01:25:19
kealon(Ruslan),

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

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

Спасибо
kealon(Ruslan)
Дата: 06.09.2019 08:03:36
HOME_X,

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

в вашем случае обязательно надо добавлять галочку "Mark interface Oleautomation"
tunknown
Дата: 06.09.2019 09:24:17
На эту тему существует dynawrapNt. Ещё здесь упоминание. Возможно, полезным будет статья Adding Active Scripting to your Delphi Win32 application.

Если не секрет, то почему нужно вызывать именно из vbscript?
kealon(Ruslan)
Дата: 06.09.2019 09:41:28
tunknown,

на русском есть более ранняя и понятная статья
makhaon
Дата: 06.09.2019 10:15:55
это еще можно глянуть:
http://www.delphisources.ru/pages/faq/base/com_automation.html
в своё время оказалась самой информативной
Кроик Семён
Дата: 06.09.2019 11:01:01
HOME_X,

А еще можно было бы экспортировать обычные функции, первым параметром бы в которых шел бы handle обьекта класса, а далее обычные параметры. Зачем интерфейсы вообще?
Кроик Семён
Дата: 06.09.2019 11:18:25
а сорри, вот что нагуглилось: "You could only do this (possibly) if it was a COM object. VBScript does not support calling normal API functions"
Василий 2
Дата: 06.09.2019 14:23:28
Басик же ущербный, а басик скрипт ущербный вдвойне, чего вы от него хотите