Введення в FSHELL
Програмна реалізація
Інтерпретатор FSHELL призначений для виконання сценаріїв з управління різноманітними ресурсами прикладних систем в операційному середовищі Windows®. FSHELL реалізований у декількох варіантах:
- EXE – консольний додаток;
- DLL – багатопоточна динамічна бібліотека;
- OCX – ActiveX елемент.
Область застосування
FSHELL має можливість завдання в сценаріях (програмах) звернень до досить великому набору функцій бібліотеки періоду виконання Visul C++.
FSHELL забезпечує можливість підключення динамічних бібліотек – користувальницьких і системних. Обмеженням є звернення до функцій з динамічних бібліотек, які працюють з уже встановленим вікном Windows (оскільки FSHELL свого власного вікна не має).
FSHELL може бути використаний, як окремий додаток, так і в якості багатопотокової динамічної бібліотеки, що забезпечує сервіс по інтерпретації сценаріїв для іншої прикладної задачі. При цьому надаються кошти для експорту змінних і функцій прикладної задачі на рівень FSHELL – програми.
FSHELL корисний при розробці INTERNET / INTRANET – проектів для формування клієнтських сторінок, як CGI – додаток, так і в складі динамічних бібліотек стандарту ISAPI.
Синтаксис мови FSHELL
Змінні програми оголошуються оператором присвоювання := , або за допомогою функції виділення пам’яті _newchar.
FSHELL розпізнає тільки два типи змінних – ціле і вказівник узагальненого вигляду. Цього достатньо для виклику різних системних функцій, типи параметрів яких можуть відрізнятися, але все одно передаються в Windows через 32-х розрядні слова.
FSHELL надає можливість використання циклів for і while, виходу з циклів по оператору break, безумовного переходу goto, виклику FSHELL – процедури без параметрів оператором call.
Логіка програми задається за допомогою операторів if.
Точка входу в програму визначається міткою main :. Вихід з циклу інтерпретації здійснюється оператором exit або leave.
Препроцесор FSHELL обробляє оператори #define, #include ( вкладені оператори #include ні підтримуються ), #import.
Стратегія виконання сценарію
На етапі предкомпілляціі FSHELL здійснює:
- перетворення умовних операторів, операторів організації циклів в команди псевдокоду;
- формування таблиці змінних і літералів;
- заповнення таблиці вбудованих функцій;
- заповнення таблиці меток і процедур FSHELL.
Предкомпіляція виразів не проводиться.
Інформація про помилки, виявлені під час предкомпілляціі виводиться в STDOUT. Після цього проводиться виконання FSHELL – програми (незалежно від наявності помилок).
Виконання функцій (вбудованих і імпортованих з інших бібліотек) захищено операторами обробки виключень. Виникнення виключення при виконанні функції не призводить до аварійного завершення сценарію.
У загальному вигляді, стратегія виконання сценарію зводиться до спроби виконати його “НЕ ЗВАЖАЮЧИ НІ НА ЩО”. У багатьох випадках це виявляється зручним.
FSHELL (як динамична бібліотека ) допускає повторний запуск з програми за допомогою функції fshell_run(). При цьому виконання сценарію триває з точки, яка визначається останнім виконаним оператором exit або leave. Це дає можливість керувати поведінкою додатку з сценарію.
Опис мови FSHELL
Ключові слова
FSELL використовує наступні ключові слова:
Ключове слово | Опис |
---|---|
break call do else endif endwhile end exit for goto if jnt leave next return tst then to while |
Вихід із циклів for і while Виклик процедури FSHELL Використовується в операторах for, while Використовується в операторі if Використовується в операторі if Використовується в операторі while Синонім exit Вихід із сценарія Оператор циклу Безумовний перехід до мітці Умовний оператор Псевдокод ( jump not true ) Вихід із сценарія Використовується в операторі for Повернення з процедури Псевдокод ( test ) Використовується в операторі if Використовується в операторі for Оператор циклу |
Змінні
Ідентифікатор – це послідовність символів, що починається з латинської літери на будь-якому регістрі.
Змінна являє собою ідентифікатор.
Можливі два типи змінних – ціле (4 байти) і вказівник узагальненого вигляду. Тип вказівника визначається контекстом використовуваної функції.
Змінні оголошуються чотирма способами.
Перший спосіб – оператор присвоювання:
Var1 := 100 // десятична константа
FileName := “d:\fshell\fshell.exe”
Другий спосіб – оператор #define:
#define LF 0x0A // шестнадцатирічна константа
#define Signature “SMF-70″
Третій спосіб – оператор _newchar:
pArray := _newchar(256)
_strcpy(pArray,”Hello World”)
puts(pArray)
_delete(pArray)
Четвертий спосіб – виклик функції fshell_export_var із додатка. Приклад для Visual C++:
int fh = fshell_alloc()
char VarToExport[MAX_PATH]; // експортована змінна>
strcpy(VarToExport, “Welcome to FSHELL programming !”);
fshell_export_var(fh, “ApplicationVar”, VarToExport, MAX_PATH, 1);
fshell_compile(fh, “script.f”);
fshell_run(fh);
fshell_free(fh);
Під час виконання сценарію змінна VarToExport буде доступна із скрипта “script.f ” під ім’ям ApplicationVar:
_strcpy(ApplicationVar, “Нове значення“)
_printf(“Переменная VarToExport: %s”, ApplicationVar)
ЗАУВАЖЕННЯ 1
Передбачений доступ до вбудованих змінних з іменами a … z. Доступ до цих змінних здійснюється швидше, так як не пов’язаний з пошуком в загальній таблиці змінних.
ЗАУВАЖЕННЯ 2
При завданні строкових змінних обробка символів виду ‘\ <значення>’ не проводиться (‘\ n‘, ‘\ t‘, …). Наприклад, у рядку “\\\\” міститиметься чотири зворотних косих риси, а не дві, як це було б в програмі на мові С.
Вирази
Вирази складаються з підвиразів, пов’язаних знаками операцій. Окремі елементи виразу можуть бути укладені в круглі дужки.
Обчислення виразів проводиться методом рекурсивного спуску на етапі виконання сценарію. Виявлення помилок обчислення не приводить до завершення сценарію.
Припустимими операціями є:
Арифметичні цілочисельні операції: | + складання – віднімання * множення / ділення % остаток від ділення ^ піднесення до степеня |
Арифметичні цілочисельні унарні операції: | + унарний плюс – унарний мінус |
Логічні унарні операції | ! логічне заперечення |
Логічні операції | & логічне І| логічне ІЛІ |
Операції порівняння | > більше < менше = дорівнює # не дорівнює |
Бітові операції | ~ побітова інверсія |
Оператор присвоювання | <змінна>:=<вираз> |
Приклад використання логічних операцій:
_printf( “*** Операція ‘|’ ” )
x1 := 0 | 0
x2 := 0 | 1
x3 := 1 | 0
x4 := 1 | 1
_printf( “0 | 0 = %d”, x1 )
_printf( “0 | 1 = %d”, x2 )
_printf( “1 | 0 = %d”, x3 )
_printf( “1 | 1 = %d”, x4 )
РЕЗУЛЬТАТ:
*** Операція ‘|’
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
_printf( “*** Операція ‘&’ ” )
x1 := 0 & 0
x2 := 0 & 1
x3 := 1 & 0
x4 := 1 & 1
_printf( “0 & 0 = %d”, x1 )
_printf( “0 & 1 = %d”, x2 )
_printf( “1 & 0 = %d”, x3 )
_printf( “1 & 1 = %d”, x4 )
РЕЗУЛЬТАТ:
*** Операція ‘&’
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
_printf( “*** Унарні операції” )
_printf( “— ‘НІ’ ” )
x1 := !0
x2 := !1
x3 := !2
_printf( “!0 = %d”, x1 )
_printf( “!1 = %d”, x2 )
_printf( “!2 = %d”, x3 )
РЕЗУЛЬТАТ:
*** Унарні операції
— ‘НІ’
!0 = 1
!1 = 0
!2 = 0
_printf( “— ‘Інверсія’ ” )
x1 := ~0
x2 := ~1
_printf( “~0 = %d”, x1 )
_printf( “~1 = %d”, x2 )
x1 := 100
_printf( “x = %d (%.8X)”, x1, x1 )
y1 := ~x1
_printf( “~x = %d (%.8X)”, y1, y1 )
z1 := ~y1
_printf( “~~x = %d (%.8X)”, z1, z1 )
РЕЗУЛЬТАТ:
— ‘Інверсія’
~0 = -1
~1 = -2
x = 100 (00000064)
~x = -101 (FFFFFF9B)
Умовний оператор
Умовний оператор має слідуючий вид:
if ( умова ) then
// дія, коли умова = 1
else
// дія, коли умова = 0
endif
Допускається до 50 рівнів вкладеності операторів if.
Приклад:
a := 100
b := 200
If ( a = 100) then
If (b = 200 ) then
Res := 1
else
Res := -1
endif
else
Res := -1
endif
_printf(“Result equals %d”, res);
Оператори циклів
Передбачено два види операторів циклу: while и for.
Оператор while має слідуючу структуру:
while ( <вираз> ) do
// тіло циклу
endwhile
Оператор for має слідуючу структуру:
for i := <змінна> := <початкове значення> to <кінцеве значення> do
// тіло циклу
next
Допускається до 50 рівнів вкладеності операторів while и for.
Вихід з циклу може бути здійснений оператором break.
Приклад:
i := 0
while (1) do
i := i + 1
if ( i = 100 ) then break endif
endwhile
_printf(“while cycle iterated %d times”, i)
Мітки, процедури, оператори безумовного переходу
Метка визначається таким чином:
<идентифікатор>:
Оператор call призначений для організації в програмі переходу на початок процедури, яка завершується оператором ‘return’.
call <метка>
Оператор безумовного переходу ‘goto’ призначений для організації в програмі безумовного переходу до мітки.
Виклик функцій
При виклику функцій (вбудованих і імпортованих) використовується наступний синтаксис:
_<ім’я функції>([<список параметрів, розділених комами>])
Така форма виклику дозволяє прискорити пошук в таблицях описів функцій.
ЗАУВАЖЕННЯ 1
При оголошенні імпортованої функції слід додавати префікс ‘_‘ перед ім’ям, наприклад для доступу до функції ‘WSAStartup’ необхідно вказати
_import(“_WSAStartup”, “wsock32.dll”, 2)
або
#import _WSAStartup wsock32.dll 2
ЗАУВАЖЕННЯ 2
В данній версії інтерпретатора FSHELL не забезпечується обчислення виразів в аргументах і, як наслідок, вказівка виклику функції як аргумент іншої функції.
Препроцесор
Препроцесор FSHELL обробляє наступні директиви:
#define ABC 123
– визначає константу. Директива являє собою повний аналог оператора присвоювання (ABC: = 123) з тією різницею, що директива #define заносить значення змінної до виконання програми, при цьому сам код оператора присвоєння відсутня.
#import _Function func.dll 3
– визначає імпортовану функцію. Директива являє собою повний аналог виклику _import з тією різницею, що директива #import реєструє функцію до виконання програми, при цьому сам виклик _import відсутній.
#include “header.h”
– включає файл заголовка. Вкладені виклики #include не підтримуються.
Коментарі
Рядки коментаря починаються двома символами “//” і можуть бути розміщені в будь-якому місці програми.
Структура програми
Програма ( сценарій, скрипт ) FSHELL має слідуючу структуру:
//// директиви препроцесора
//// визначення констант
#define LF 0x0A
//// вказівка файлів, що включаються, які можуть містити
//// оператори #define , #import і опис процедур
#include “prg.h”
//// опис функцій, імпортуємих із динамічних бібліотек
#import _ExtraFunction extra.dll 1
//// головний модуль, який визначається міткою main:
main:
// тіло головного модуля
// може містити додаткові оператори exit,
// виклики імпортованих і вбудованих функцій
// і оголошених процедур
//// вихід, може бути здійснений оператором leave (<вираз>)
exit
//// опис процедур
procedure_1:
// тіло процедури
return
ЗАУВАЖЕННЯ
Оператор exit завжди повертає 0 в програму, що викликає, оператор leave – вираз, вказаний другим операндом.
БНФ
Для любителів російської словесності наводимо скорочений опис правил освіти виразів мови FSHELL у формі Бекуса–Наура.
<літера> ::= a | b … | z | A | B … | Z
<цифра> ::= 1 | 2 … | 9
<підкреслення> ::= ‘_’
<пробіл> ::= ‘ ‘
<роздільник> ::= один з {;,+-<>/*%^=()&|!~#:\n\r\t} | <пробіл>
<символ> ::= { будь який ASCII символ, який має візуальне уявлення }
<идентифікатор> ::= <літера> |
< идентифікатор > <підкреслення> |
< идентифікатор > <літера> |
< идентифікатор ><цифра>
<число> ::= <цифра> | <число><цифра> | 0x< число > | 0X< число >
<строка> ::= “<символ> | < строка ><символ >|”
<аргумент> ::= <идентифікатор> | <число> | <строка>
<список аргументів> ::=[] | [ <аргумент>] | [<список аргументів>, <аргумент>]
<виклик функції> ::= _<идентифікатор>(<список аргументів>)
<унарная операція> ::= + | – | ~ | !
<ступінь> ::= ^
<мультиплікативна операція> ::= * | / | %
<аддитивна операція> ::= + | –
<логична операція> ::= | & | < | > | = | #
<операнд> ::= [<унарна операція>]<идентифікатор> |
[<унарна операція>]<виклик функції> | [<унарна операція>]<вираз в дужках><множник> ::= <операнд><ступінь><операнд>
< доданок > ::= <множник> <мультиплікативна операція> <множник>
< вираз > ::= < доданок ><аддитивна операція>< доданок > |
< доданок ><логічна операція>< доданок >
<вираз в дужках > ::= (< вираз >)
ЗАУВАЖЕННЯ
У даній версії інтерпретатора FSHELL не забезпечується вказівка виклику функції як аргументу інший функції.
Варіанти реалізації
FSHELL.EXE
FSHELL.EXE являє собою консольний додаток. У даній версії єдиним аргументом командного рядка є ім’я файлу сценарію.
fshell.exe script.f
Розширення файлу сценарію не аналізується.
При запуску без аргументів FSHELL.EXE припускає, що він використовується як CGI – додаток. У цьому випадку проводиться спроба доступу до змінної середовища ‘PATH_INFO’. Значення цієї змінної інтерпретується як ім’я файлу сценарію. Дана схема застосовується при виклику FSHELL.EXE сервером Web.
FSHELL.DLL
FSHELL.DLL являє собою багатопоточну динамічну бібліотеку, що експортує наступні функції:
fshell_alloc – розподіл блоку управління сценарієм
fshell_add_var – додавання змінної в сценарій
fshell_export_var – експорт змінної додатку в сценарій
fshell_export_func – експорт функції додатку в сценарій
fshell_step_func – вказівка функції додатку для трасування
fshell_compile – предкомпіляція сценарія
fshell_run – запуск сценарію
fshell_free – видалення блоку управління сценарієм
Таким чином надається можливість виконання різних сценаріїв в різних потоках додатку і виклик декількох сценаріїв усередині одного потоку.
FSHELL.OCX
FSHELL.OCX являє собою AciveX – елемент, побудований з використанням MFC ActiveX ControlWizard середовища Visual C ++ версії 5.0.
Робота з цим елементом здійснюється з використанням таких методів:
Alloc, ExportVar, ExportFunc, StepFunc, Compile, Run, Free
Ці методи є функціональними аналогами функцій FSHELL.DLL.
FSHELL.OCX легко вбудовується в користувальницький додаток, а також – в HTML сторінку. Для цього досить додати до сторінці наступний тег:
<OBJECT ID=”Fshell1″ WIDTH=100 HEIGHT=50
CLASSID=”CLSID:223DE972-61B2-11D1-8763-484F4D005CDA”>
<PARAM NAME=”_Version” VALUE=”65536″>
<PARAM NAME=”_ExtentX” VALUE=”2117″>
<PARAM NAME=”_ExtentY” VALUE=”1058″>
<PARAM NAME=”_StockProps” VALUE=”0″>
Вбудовані функції
Введення
У цьому розділі перераховані вбудовані функції FSHELL. Всі функції повертають значення – 4-х байтовий код, який може бути або числом, або покажчиком на область пам’яті.
У тому випадку, якщо “C” – аналог розглянутої функції не повертає значення, виконавча система FSHELL все одно його формує (тільки в цьому випадку він буде рівним нулю).
Параметри функцій також можуть бути або числами, або покажчиками на області пам’яті, що визначається контекстом використовуваної функції.
Якщо програміст стикається з необхідністю доступу до структур даних, він може робити вибірку і запис значень байтів, коротких слів (2 байти) і довгих слів (4 байти) за допомогою функцій _byte, _short, _long и _setbyte, _setshort, _setlong.
Виклик будь-якої функції розпізнається FSHELL по префіксу ‘_’.
ЗАУВАЖЕННЯ:
В цій версії FSHELL допускається передавати функціям до 10 параметрів.
Функції загального призначення
Нижче перераховані функції бібліотеки періоду виконання “C” (runtime), загальні для багатьох компіляторів “C”. Їх опис можна отримати в оперативній довідці будь-якого компілятора.
_srand, _rand, _printf, _sprintf, _fprintf, _scanf, _sscanf, _fscanf, _gets, _puts, _strchr, _strrchr, _strstr, _strcmp, _strncmp, _stricmp, _strnicmp, _toupper, _tolower, _strlen, _strcat, _strncat, _strcpy, _strncpy, _strset, _strnset, _access, _fopen, _fclose, _fgets, _fputs, _feof, _fflush, _fseek, _ftell, _fread, _fwrite, _time , _ctime , _localtime, _asctime, _strftime, _findfirst, _findnext, _findclose, _system, _kbhit, _getch, _getche, _rename, _unlink, _setvbuf, _getenv
Функції Microsoft® Win32® API
Дані функції призначені для роботи з ядром Windows. Їх опис найкраще подивитися в оперативній довідці Visual C ++ версії 5.0.
_Sleep , _CreateSemaphore, _ReleaseSemaphore, _WaitForSingleObject, _CloseHandle, _InitializeCriticalSection, _EnterCriticalSection, _LeaveCriticalSection, _DeleteCriticalSection, _GetCurrentThread , _MoveFile, _MoveFileEx, _CopyFile, _DeleteFile, _CreateDirectory, _RemoveDirectory, _GetCurrentDirectory, _SetCurrentDirectory, _GetFullPathName, _MultiByteToWideChar, SystemParametersInfo, _GetCommandLine
Спеціальні функції
Дана група функцій забезпечує роботу з пам’яттю, імпортом функцій з інших динамічних бібліотек, перенесенням і копіюванням файлів, а також – рішенням інших суспільно необхідних завдань.
_import( fname, dllname, qa)
Вказує FSHELL, в якій динамічній бібліотеці шукати зазначену функцію.
ПАРАМЕТРИ:
fname – ім’я функції, має починатися з символу ‘_’;
dllname – ім’я динамічної бібліотеки (коротке або повне);
qa – кількість аргументів (у даній версії не використовується).
_stop()
Перекладає FSHELL в режим покрокового виконання сценарію. При цьому виводиться діалогове вікно з кнопками управління виконанням.
_offset( addr, off)
Формує нову адресу, складаючи адреса addr і зміщення off.
Кілька застаріла.
_byte( addr, off)
Проводить вибірку байта з області пам’яті, що задається адресою addr зі зміщенням off.
ПАРАМЕТРИ:
addr – адреса області пам’яті;
off – зміщення.
_short( addr, off)
Проводить вибірку короткого слова (2 байти) з області пам’яті, що задається адресою addr зі зміщенням off.
ПАРАМЕТРИ:
addr – адреса області пам’яті;
off – зміщення.
_long( addr, off)
Проводить вибірку довгого слова (4 байти) з області пам’яті, що задається адресою addr зі зміщенням off.
ПАРАМЕТРИ:
addr – адреса області пам’яті;
off – зміщення.
_setbyte(addr, off, value)
Проводить запис байта зі значенням value в область пам’яті, що задається адресою addr зі зміщенням off.
ПАРАМЕТРИ:
addr – адреса області пам’яті;
off – зміщення;
value – значення байту.
_setshort( addr, off, value)
Проводить запис короткого слова (2 байти) зі значенням value в область пам’яті, що задається адресою addr зі зміщенням off.
ПАРАМЕТРИ:
addr – адреса області пам’яті;
off – зміщення;
value – значення байту.
_setlong( addr, off, value)
Проводить запис довгого слова (4 байти) зі значенням value в область пам’яті, що задається адресою addr зі зміщенням off.
ПАРАМЕТРИ:
addr – адреса області пам’яті;
off – зміщення;
value – значення байту.
_newchar( size)
Розподіляє пам’ять заданого обсягу.
ПАРАМЕТРИ:
size – розмір запитуваної пам’яті.
_delete( addr)
Звільняє пам’ять, розподілену функцією _newchar.
ПАРАМЕТРИ:
addr – адреса пам’яті, яку повернула функція _newchar.
_fmove ( source, dest)
Аналог MoveFileEx з встановленими режимами MOVEFILE_COPY_ALLOWED і MOVEFILE_REPLACE_EXISTING (див. справку по Visual C++).
_fmovetodir ( p_source, p_destdir)
Проводить перенесення файлу в заданий каталог.
ПАРАМЕТРИ:
p_source – им’я файлу;
p_destdir – им’я каталогу.
_fcopytodir ( source, destdir)
Проводить копіювання файлу в заданий каталог.
ПАРАМЕТРИ:
source – им’я файлу;
destdir – им’я каталогу.
_MessageBox( text, title, style)
Виводить діалогове вікно з кнопками.
ПАРАМЕТРИ:
text – текст вікна;
title – заголовок вікна;
style – стиль вікна (див. справку Visual C++ по функції MessаgeBox).
_findvar( varname)- Шукає змінну з ім’ям varname в словнику змінних FSHELL. Повертає 1 у разі успіху і 0 в протилежному випадку.
_fork() – Проводить запуск копії FSHELL зі збереженими значеннями змінних і лічильника команд в окремому потоці (а не в процесі, як в UNIX).
_gettid() – Повертає ідентифікатор потоку запущеного функцією fork.
Інші корисні функції
Ці функції допоможуть прикрасити Ваші сценарії.
_PlaySound( file, mode)
Аналог функції sndPlaySound ( див. довідку по Visual C++ ).
ПАРАМЕТРИ:
file – файл який “програється” ;
mode – режим (0 – синхронний, 1 – асинхронний, …)
_ShellExecute( fname, pars, dir, sh)
“Виконує” файл з розширенням, зареєстрованим в системі (* .wav, * .avi, * .doc …). Можливості декілька урізані порівняно з оригіналом функції з SHELLAPI.
ПАРАМЕТРИ:
fname – ім’я “виконуваного” файлу
pars –додаткові параметри (якщо fname є ім’ям програми)
dir – робочий каталог за замовчуванням
sh – вид вікна (якщо fname є ім’ям програми). Допустимі значення описані в довідці VisualC++ по функції ShellExecute.
Особливості програмування
Багатопотокові додатки
FSHELL.DLL є багатопотокової бібліотекою. Кожен виклик функції fshell_alloc () формує в пам’яті новий блок управління інтерпретацією. Таким чином надається можливість запускати з потоків Вашого додатку FSHELL – сценарії паралельно.
Запуск сценарію проводиться в такій послідовності:
int fh; // дескриптор блока управління сценарієм
fh = fshell_alloc(); // розподіл блоку управління
// тут можна зробити налаштування сценарію
// – додати або експортувати змінні додатки,
// – експортувати функції
fshell_compile(fh, “first.f”) // предкомпіляція сценарія “first.f”
fshell_run(fh); // запуск сценарія
fshell_free(fh); //видалення блока управління сценарієм
При використанні FSHELL.OCX застосовується така ж схема запуску.
Методика відладки
Сценарії FSHELL легко відладжуються за допомогою тестових повідомлень викликом функцій __printf, _puts, _MessageBox.
При налагодженні віконного додатку, розробленого в середовищі Visual C ++, що використовує FSHELL як динамічну бібліотеку можна використовувати функцію _MessageBox, або приєднання консолі за допомогою функції AllocConsole (). В останньому випадку висновок функцій _printf і _puts буде перенаправлений в нове консольне вікно.
Якщо виникає необхідність трасування виконання скрипта, вставте в його текст виклик функції _stop. Після кожного виконаного оператора буде виводиться вікно з інформацією про це операторі (в предкомпілірованном вигляді).
У складних випадках налагодження, наприклад – для ISAPI – додатків можна рекомендувати висновок тестової інформації в файл.
Необхідні динамічні бібліотеки
Для роботи FSHELL потрібні такі бібліотеки:
– mfc42.dll;
– msvcirt.dll;
– msvcrt.dll.