Внимание! Данный пример был разработан в среде программирования Delphi 7 и под управлением Windows XP.
Я уже писал про совместное использование Delphi 7 и VBScripts, для чего это связка нужна и как ее использовать (http://notidealrunner.blogspot.com/2019/05/vbscripts-delphi.html). Возможно, вы тоже нашли в этом пользу использования. Единственное что мне не понравилось это то, что наши VBS-скрипты всегда необходимо таскать вместе с исполняемой частью программы. А что будет, если при выполнение программы, необходимых скриптов не окажется? Программа откажется работать или будет работать не так как вы задумывали. Или, если вы не хотите демонстрировать программный код VBS-скриптов, распространяемые вместе с исполняемой программой, то вам понадобится спрятать, каким-то образом, это код. Долго я пытался я найти решение как лучше спрятать VBS-скрипты. Единственным решением которое я нашел, это засунуть VBS-скрипт в ресурсный файл Windows и скомпоновать его с исполняемой программой. Единственный минус данного способа, это увеличение объема исполняемой программы, но и это можно обойти, я так предполагаю, скомпоновав данный ресурсный файл с динамической линкуемой dll – библиотекой, но в этом посте мы не будем рассматривать это способ.
Давайте приступим к созданию нового проекта. Создайте в среде Delphi 7 проект с именем p6.dpr. Основной модуль программы сохраните под именем p6_unit1.pas. Файл скрипта назовите sum.vbs и сохраните его в корне папки проекта p6. Код скрипта будет такой-же как и в проекте по этому посту http://notidealrunner.blogspot.com/2019/05/vbscripts-delphi.html.
Далее нам необходимо в каталоге проекта p6 создать файл ресурсов компиляции с именем sum.rc. Содержимое файла компиляции будет следующее:
VBSCRIPTS RCDATA sum.vbs
То есть мы в качестве ресурсов нашего приложения указываем наш файл VBS-скрипта.
Файл ресурсов компиляции sum.rc необходимо скомпилировать при помощи компилятора ресурсов brcc32.exe, этот компилятор ресурсов расположен в каталоге, где расположены бинарные файлы Delphi, у меня это каталог c:\Program Files\BORLAND\Delphi7\Bin\. Убедитесь, что данный каталог добавлен в переменную окружения Path. Запустите командную строку Windows, перейдите в каталог проекта и выполните команду компиляции ресурсов.
brcc32.exe sum.rc
В качестве результата в каталоге проекта вы получите файл ресурсов sum.RES, который необходимо в файле модуля p6_unit1.pas подключить. Смотрите код ниже:
var
Form1: TForm1;
ScriptString: String;
implementation
{$R *.dfm}
{$R sum.res}
На форму с именем Form1 необходимо перетащить компонент ScriptControl. Я уже писал, как установить данный компонент и задействовать его в проекте (Смотрите статью http://notidealrunner.blogspot.com/2019/05/vbscripts-delphi.html).
Перейдем к описанию кода проекта Delphi.
1. В обработчике создания формы мы обращаемся к потоку ресурсов нашего приложения типа TResourceStream с целью получить доступ к нашему пользовательскому ресурсу данных в формате RCDATA с именем VBSCRIPTS. Потом создаем пустой строковый поток типа TStringStream, в который мы будем копировать данные из потока ресурсов типа TResourceStream. Далее сохраняем данные из строкового потока в глобальную строковую переменную типа String с именем ScriptString. В конце работы обработчика мы освобождаем используемые потоки типа TResourceStream и типа TStringStream.
procedure TForm1.FormCreate(Sender: TObject);
var
RS: TResourceStream;
SS: TStringStream;
begin
RS := TResourceStream.Create(hInstance, 'VBSCRIPTS', RT_RCDATA);
SS := TStringStream.Create('');
try
SS.CopyFrom(RS, RS.Size);
ScriptString := SS.DataString;
finally
FreeAndNil(SS);
FreeAndNil(RS);
end;
end;
2. Далее в обработчике нажатия кнопки мы загружаем скрипт из глобальной строковой переменной типа String с именем ScriptString и запускаем функцию Sum на исполнение.
procedure TForm1.Button1Click(Sender: TObject);
var
varr, res:Variant;
pPar:PSafeArray;
SA : TSafeArrayBound;
a: Integer;
b: Integer;
ValErrorCode: Integer;
begin
Val(Edit1.Text, a, ValErrorCode);
Val(Edit2.Text, b, ValErrorCode);
try
ScriptControl1.Language := 'VBScript';
ScriptControl1.AddCode(ScriptString);
SA.cElements := 2;
pPar := SafeArrayCreate(varVariant, 1, SA);
varr := VarArrayCreate([0, 1], varVariant);
varr[0]:=a;
varr[1]:=b;
pPar:=PSafeArray(TVarData(varr).VArray);
res:=ScriptControl1.Run('Sum',pPar);
Label5.Caption := VarToStr(res);
except
on E: Exception do
MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0);
end;
end;
3. Вот и все. Теперь исполняемый файл программы можно будет перемещать без VBS-скриптов.
Код модуля p6_unit1.pas
Код проекта p6.dpr
Код VBS-скрипта sum.vbs
Я уже писал про совместное использование Delphi 7 и VBScripts, для чего это связка нужна и как ее использовать (http://notidealrunner.blogspot.com/2019/05/vbscripts-delphi.html). Возможно, вы тоже нашли в этом пользу использования. Единственное что мне не понравилось это то, что наши VBS-скрипты всегда необходимо таскать вместе с исполняемой частью программы. А что будет, если при выполнение программы, необходимых скриптов не окажется? Программа откажется работать или будет работать не так как вы задумывали. Или, если вы не хотите демонстрировать программный код VBS-скриптов, распространяемые вместе с исполняемой программой, то вам понадобится спрятать, каким-то образом, это код. Долго я пытался я найти решение как лучше спрятать VBS-скрипты. Единственным решением которое я нашел, это засунуть VBS-скрипт в ресурсный файл Windows и скомпоновать его с исполняемой программой. Единственный минус данного способа, это увеличение объема исполняемой программы, но и это можно обойти, я так предполагаю, скомпоновав данный ресурсный файл с динамической линкуемой dll – библиотекой, но в этом посте мы не будем рассматривать это способ.
Давайте приступим к созданию нового проекта. Создайте в среде Delphi 7 проект с именем p6.dpr. Основной модуль программы сохраните под именем p6_unit1.pas. Файл скрипта назовите sum.vbs и сохраните его в корне папки проекта p6. Код скрипта будет такой-же как и в проекте по этому посту http://notidealrunner.blogspot.com/2019/05/vbscripts-delphi.html.
On Error Resume Next Function Sum(a,b) Sum = a + b End function
Далее нам необходимо в каталоге проекта p6 создать файл ресурсов компиляции с именем sum.rc. Содержимое файла компиляции будет следующее:
VBSCRIPTS RCDATA sum.vbs
То есть мы в качестве ресурсов нашего приложения указываем наш файл VBS-скрипта.
Файл ресурсов компиляции sum.rc необходимо скомпилировать при помощи компилятора ресурсов brcc32.exe, этот компилятор ресурсов расположен в каталоге, где расположены бинарные файлы Delphi, у меня это каталог c:\Program Files\BORLAND\Delphi7\Bin\. Убедитесь, что данный каталог добавлен в переменную окружения Path. Запустите командную строку Windows, перейдите в каталог проекта и выполните команду компиляции ресурсов.
brcc32.exe sum.rc
В качестве результата в каталоге проекта вы получите файл ресурсов sum.RES, который необходимо в файле модуля p6_unit1.pas подключить. Смотрите код ниже:
var
Form1: TForm1;
ScriptString: String;
implementation
{$R *.dfm}
{$R sum.res}
На форму с именем Form1 необходимо перетащить компонент ScriptControl. Я уже писал, как установить данный компонент и задействовать его в проекте (Смотрите статью http://notidealrunner.blogspot.com/2019/05/vbscripts-delphi.html).
Перейдем к описанию кода проекта Delphi.
1. В обработчике создания формы мы обращаемся к потоку ресурсов нашего приложения типа TResourceStream с целью получить доступ к нашему пользовательскому ресурсу данных в формате RCDATA с именем VBSCRIPTS. Потом создаем пустой строковый поток типа TStringStream, в который мы будем копировать данные из потока ресурсов типа TResourceStream. Далее сохраняем данные из строкового потока в глобальную строковую переменную типа String с именем ScriptString. В конце работы обработчика мы освобождаем используемые потоки типа TResourceStream и типа TStringStream.
procedure TForm1.FormCreate(Sender: TObject);
var
RS: TResourceStream;
SS: TStringStream;
begin
RS := TResourceStream.Create(hInstance, 'VBSCRIPTS', RT_RCDATA);
SS := TStringStream.Create('');
try
SS.CopyFrom(RS, RS.Size);
ScriptString := SS.DataString;
finally
FreeAndNil(SS);
FreeAndNil(RS);
end;
end;
2. Далее в обработчике нажатия кнопки мы загружаем скрипт из глобальной строковой переменной типа String с именем ScriptString и запускаем функцию Sum на исполнение.
procedure TForm1.Button1Click(Sender: TObject);
var
varr, res:Variant;
pPar:PSafeArray;
SA : TSafeArrayBound;
a: Integer;
b: Integer;
ValErrorCode: Integer;
begin
Val(Edit1.Text, a, ValErrorCode);
Val(Edit2.Text, b, ValErrorCode);
try
ScriptControl1.Language := 'VBScript';
ScriptControl1.AddCode(ScriptString);
SA.cElements := 2;
pPar := SafeArrayCreate(varVariant, 1, SA);
varr := VarArrayCreate([0, 1], varVariant);
varr[0]:=a;
varr[1]:=b;
pPar:=PSafeArray(TVarData(varr).VArray);
res:=ScriptControl1.Run('Sum',pPar);
Label5.Caption := VarToStr(res);
except
on E: Exception do
MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0);
end;
end;
3. Вот и все. Теперь исполняемый файл программы можно будет перемещать без VBS-скриптов.
Код модуля p6_unit1.pas
unit p6_unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, MSScriptControl_TLB; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Button1: TButton; ScriptControl1: TScriptControl; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; ScriptString: String; implementation {$R *.dfm} {$R sum.res} uses ActiveX; procedure TForm1.FormCreate(Sender: TObject); var RS: TResourceStream; SS: TStringStream; begin RS := TResourceStream.Create(hInstance, 'VBSCRIPTS', RT_RCDATA); SS := TStringStream.Create(''); try SS.CopyFrom(RS, RS.Size); ScriptString := SS.DataString; finally FreeAndNil(SS); FreeAndNil(RS); end; end; procedure TForm1.Button1Click(Sender: TObject); var varr, res:Variant; pPar:PSafeArray; SA : TSafeArrayBound; a: Integer; b: Integer; ValErrorCode: Integer; begin Val(Edit1.Text, a, ValErrorCode); Val(Edit2.Text, b, ValErrorCode); try ScriptControl1.Language := 'VBScript'; ScriptControl1.AddCode(ScriptString); SA.cElements := 2; pPar := SafeArrayCreate(varVariant, 1, SA); varr := VarArrayCreate([0, 1], varVariant); varr[0]:=a; varr[1]:=b; pPar:=PSafeArray(TVarData(varr).VArray); res:=ScriptControl1.Run('Sum',pPar); Label5.Caption := VarToStr(res); except on E: Exception do MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0); end; end; end.
Код проекта p6.dpr
program p6; uses Forms, p6_unit1 in 'p6_unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
Код VBS-скрипта sum.vbs
On Error Resume Next Function Sum(a,b) Sum = a + b End function
Комментариев нет:
Отправить комментарий