Rev 7597 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7597 | akron1 | 1 | Компилятор языка программирования Oberon-07/16 для i486 |
2 | Windows/Linux/KolibriOS. |
||
6613 | leency | 3 | ------------------------------------------------------------------------------ |
4 | |||
7597 | akron1 | 5 | Параметры командной строки |
6613 | leency | 6 | |
7597 | akron1 | 7 | Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или |
8 | UTF-8 с BOM-сигнатурой. |
||
9 | Выход - испоняемый файл формата PE32, ELF или MENUET01/MSCOFF. |
||
10 | Параметры: |
||
11 | 1) имя главного модуля |
||
12 | 2) имя результирующего файла |
||
13 | 3) тип приложения и платформа |
||
14 | "console" - Windows console |
||
15 | "gui" - Windows GUI |
||
16 | "dll" - Windows DLL |
||
17 | "kos" - KolibriOS |
||
18 | "obj" - KolibriOS DLL |
||
19 | "elfexe" - Linux ELF-EXEC |
||
7693 | akron1 | 20 | "elfso" - Linux ELF-SO |
7597 | akron1 | 21 | 4) необязательные параметры-ключи |
22 | -stk |
||
23 | -base адрес загрузки исполняемого файла в килобайтах |
||
24 | -ver |
||
25 | -nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже) |
||
6613 | leency | 26 | |
7597 | akron1 | 27 | параметр -nochk задается в виде строки из символов: |
28 | "p" - указатели |
||
29 | "t" - типы |
||
30 | "i" - индексы |
||
31 | "b" - неявное приведение INTEGER к BYTE |
||
32 | "c" - диапазон аргумента функции CHR |
||
33 | "w" - диапазон аргумента функции WCHR |
||
34 | "r" - эквивалентно "bcw" |
||
35 | "a" - все проверки |
||
36 | |||
37 | Порядок символов может быть любым. Наличие в строке того или иного |
||
38 | символа отключает соответствующую проверку. |
||
39 | |||
40 | Например: -nochk it - отключить проверку индексов и охрану типа. |
||
41 | -nochk a - отключить все отключаемые проверки. |
||
42 | |||
43 | Например: |
||
44 | |||
45 | Compiler.exe "C:\example.ob07" "C:\example.exe" console -stk 1 |
||
46 | Compiler.exe "C:\example.ob07" "C:\example.dll" dll |
||
47 | Compiler.exe "C:\example.ob07" "C:\example.exe" gui -stk 4 |
||
48 | Compiler.exe "C:\example.ob07" "C:\example.exe" console -nochk pti |
||
49 | Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.kex" kos -stk 2 |
||
50 | Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.obj" obj -ver 2.7 |
||
51 | Compiler.exe "C:\example.ob07" "C:\example" elfexe |
||
52 | |||
53 | В случае успешной компиляции, компилятор передает код завершения 0, иначе 1. |
||
54 | При работе компилятора в KolibriOS, код завершения не передается. |
||
55 | |||
6613 | leency | 56 | ------------------------------------------------------------------------------ |
7597 | akron1 | 57 | Отличия от оригинала |
6613 | leency | 58 | |
7597 | akron1 | 59 | 1. Расширен псевдомодуль SYSTEM |
60 | 2. В идентификаторах допускается символ "_" |
||
61 | 3. Добавлены системные флаги |
||
62 | 4. Усовершенствован оператор CASE (добавлены константные выражения в |
||
63 | метках вариантов и необязательная ветка ELSE) |
||
64 | 5. Расширен набор стандартных процедур |
||
65 | 6. Семантика охраны/проверки типа уточнена для нулевого указателя |
||
66 | 7. Семантика DIV и MOD уточнена для отрицательных чисел |
||
67 | 8. Добавлены однострочные комментарии (начинаются с пары символов "//") |
||
68 | 9. Разрешено наследование от типа-указателя |
||
69 | 10. Добавлен синтаксис для импорта процедур из внешних библиотек |
||
70 | 11. "Строки" можно заключать также в одиночные кавычки: 'строка' |
||
71 | 12. Добавлен тип WCHAR |
||
6613 | leency | 72 | |
73 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 74 | Особенности реализации |
6613 | leency | 75 | |
7597 | akron1 | 76 | 1. Основные типы |
6613 | leency | 77 | |
7597 | akron1 | 78 | Тип Диапазон значений Размер, байт |
6613 | leency | 79 | |
7597 | akron1 | 80 | INTEGER -2147483648 .. 2147483647 4 |
81 | REAL 4.94E-324 .. 1.70E+308 8 |
||
82 | CHAR символ ASCII (0X .. 0FFX) 1 |
||
83 | BOOLEAN FALSE, TRUE 1 |
||
84 | SET множество из целых чисел {0 .. 31} 4 |
||
85 | BYTE 0 .. 255 1 |
||
86 | WCHAR символ юникода (0X .. 0FFFFX) 2 |
||
6613 | leency | 87 | |
7597 | akron1 | 88 | 2. Максимальная длина идентификаторов - 1024 символов |
89 | 3. Максимальная длина строковых констант - 1024 символов (UTF-8) |
||
90 | 4. Максимальная размерность открытых массивов - 5 |
||
91 | 5. Процедура NEW заполняет нулями выделенный блок памяти |
||
92 | 6. Глобальные и локальные переменные инициализируются нулями |
||
93 | 7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая |
||
94 | модульность отсутствуют |
||
95 | 8. Тип BYTE в выражениях всегда приводится к INTEGER |
||
96 | 9. Контроль переполнения значений выражений не производится |
||
97 | 10. Ошибки времени выполнения: |
||
6613 | leency | 98 | |
7597 | akron1 | 99 | - ASSERT(x), при x = FALSE |
100 | - разыменование нулевого указателя |
||
101 | - целочисленное деление на 0 |
||
102 | - вызов процедуры через процедурную переменную с нулевым значением |
||
103 | - ошибка охраны типа |
||
104 | - нарушение границ массива |
||
105 | - непредусмотренное значение выражения в операторе CASE |
||
106 | - ошибка копирования массивов v := x, если LEN(v) < LEN(x) |
||
107 | - неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255) |
||
108 | - CHR(x), если (x < 0) OR (x > 255) |
||
109 | - WCHR(x), если (x < 0) OR (x > 65535) |
||
110 | |||
6613 | leency | 111 | ------------------------------------------------------------------------------ |
7597 | akron1 | 112 | Псевдомодуль SYSTEM |
6613 | leency | 113 | |
114 | Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры, |
||
115 | ошибки при использовании процедур псевдомодуля SYSTEM могут привести к |
||
116 | повреждению данных времени выполнения и аварийному завершению программы. |
||
117 | |||
7597 | akron1 | 118 | PROCEDURE ADR(v: любой тип): INTEGER |
119 | v - переменная или процедура; |
||
120 | возвращает адрес v |
||
6613 | leency | 121 | |
7597 | akron1 | 122 | PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER |
123 | возвращает адрес x |
||
6613 | leency | 124 | |
7597 | akron1 | 125 | PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER |
126 | возвращает адрес x |
||
6613 | leency | 127 | |
7597 | akron1 | 128 | PROCEDURE SIZE(T): INTEGER |
129 | возвращает размер типа T |
||
6613 | leency | 130 | |
7597 | akron1 | 131 | PROCEDURE TYPEID(T): INTEGER |
132 | T - тип-запись или тип-указатель, |
||
133 | возвращает номер типа в таблице типов-записей |
||
6613 | leency | 134 | |
7597 | akron1 | 135 | PROCEDURE INF(): REAL |
136 | возвращает специальное вещественное значение "бесконечность" |
||
6613 | leency | 137 | |
7597 | akron1 | 138 | PROCEDURE GET(a: INTEGER; |
139 | VAR v: любой основной тип, PROCEDURE, POINTER) |
||
140 | v := Память[a] |
||
6613 | leency | 141 | |
7597 | akron1 | 142 | PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER) |
143 | Память[a] := x; |
||
144 | Если x: BYTE или x: WCHAR, то значение x будет расширено |
||
145 | до 32 бит, для записи байтов использовать SYSTEM.PUT8, |
||
146 | для WCHAR -- SYSTEM.PUT16 |
||
7107 | akron1 | 147 | |
7693 | akron1 | 148 | PROCEDURE PUT8(a: INTEGER; x: INTEGER, SET, BYTE, CHAR, WCHAR) |
7597 | akron1 | 149 | Память[a] := младшие 8 бит (x) |
6613 | leency | 150 | |
7693 | akron1 | 151 | PROCEDURE PUT16(a: INTEGER; x: INTEGER, SET, BYTE, CHAR, WCHAR) |
7597 | akron1 | 152 | Память[a] := младшие 16 бит (x) |
153 | |||
154 | PROCEDURE MOVE(Source, Dest, n: INTEGER) |
||
155 | Копирует n байт памяти из Source в Dest, |
||
156 | области Source и Dest не могут перекрываться |
||
157 | |||
158 | PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER) |
||
159 | Копирует n байт памяти из Source в Dest. |
||
160 | Эквивалентно |
||
161 | SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n) |
||
162 | |||
163 | PROCEDURE CODE(byte1, byte2,... : INTEGER) |
||
164 | Вставка машинного кода, |
||
165 | byte1, byte2 ... - константы в диапазоне 0..255, |
||
166 | например: |
||
167 | SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *) |
||
168 | |||
6613 | leency | 169 | Также в модуле SYSTEM определен тип CARD16 (2 байта). Для типа CARD16 не |
170 | допускаются никакие явные операции, за исключением присваивания. |
||
171 | Преобразования CARD16 -> INTEGER и INTEGER -> CARD16 могут быть реализованы |
||
172 | так: |
||
173 | |||
7597 | akron1 | 174 | PROCEDURE Card16ToInt (w: SYSTEM.CARD16): INTEGER; |
175 | VAR i: INTEGER; |
||
176 | BEGIN |
||
177 | SYSTEM.PUT(SYSTEM.ADR(i), w) |
||
178 | RETURN i |
||
179 | END Card16ToInt; |
||
6613 | leency | 180 | |
7597 | akron1 | 181 | PROCEDURE IntToCard16 (i: INTEGER): SYSTEM.CARD16; |
182 | VAR w: SYSTEM.CARD16; |
||
183 | BEGIN |
||
184 | SYSTEM.GET(SYSTEM.ADR(i), w) |
||
185 | RETURN w |
||
186 | END IntToCard16; |
||
6613 | leency | 187 | |
188 | Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях. |
||
189 | |||
190 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 191 | Системные флаги |
6613 | leency | 192 | |
193 | При объявлении процедурных типов и глобальных процедур, после ключевого |
||
7597 | akron1 | 194 | слова PROCEDURE может быть указан флаг соглашения о вызове: [stdcall], |
195 | [ccall], [ccall16], [windows], [linux]. Например: |
||
6613 | leency | 196 | |
7597 | akron1 | 197 | PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER; |
6613 | leency | 198 | |
7597 | akron1 | 199 | Если указан флаг [ccall16], то принимается соглашение ccall, но перед |
200 | вызовом указатель стэка будет выравнен по границе 16 байт. |
||
201 | Флаг [windows] - синоним для [stdcall], [linux] - синоним для [ccall16]. |
||
202 | Знак "-" после имени флага ([stdcall-], [linux-], ...) означает, что |
||
203 | результат процедуры можно игнорировать (не допускается для типа REAL). |
||
204 | |||
6613 | leency | 205 | При объявлении типов-записей, после ключевого слова RECORD может быть |
7597 | akron1 | 206 | указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей |
207 | записи. Записи с системным флагом не могут иметь базовый тип и не могут быть |
||
6613 | leency | 208 | базовыми типами для других записей. |
209 | Для использования системных флагов, требуется импортировать SYSTEM. |
||
210 | |||
211 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 212 | Оператор CASE |
6613 | leency | 213 | |
214 | Синтаксис оператора CASE: |
||
215 | |||
7597 | akron1 | 216 | CaseStatement = |
217 | CASE Expression OF Сase {"|" Сase} |
||
218 | [ELSE StatementSequence] END. |
||
219 | Case = [CaseLabelList ":" StatementSequence]. |
||
220 | CaseLabelList = CaseLabels {"," CaseLabels}. |
||
221 | CaseLabels = ConstExpression [".." ConstExpression]. |
||
6613 | leency | 222 | |
223 | Например: |
||
224 | |||
7597 | akron1 | 225 | CASE x OF |
226 | |-1: DoSomething1 |
||
227 | | 1: DoSomething2 |
||
228 | | 0: DoSomething3 |
||
229 | ELSE |
||
230 | DoSomething4 |
||
231 | END |
||
6613 | leency | 232 | |
233 | В метках вариантов можно использовать константные выражения, ветка ELSE |
||
7597 | akron1 | 234 | необязательна. Если значение x не соответствует ни одному варианту и ELSE |
235 | отсутствует, то программа прерывается с ошибкой времени выполнения. |
||
6613 | leency | 236 | |
237 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 238 | Тип WCHAR |
6613 | leency | 239 | |
7597 | akron1 | 240 | Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и |
241 | ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и |
||
242 | ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает |
||
243 | только тип CHAR. Для получения значения типа WCHAR, следует использовать |
||
244 | процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять |
||
245 | исходный код в кодировке UTF-8 c BOM. |
||
246 | |||
247 | ------------------------------------------------------------------------------ |
||
248 | Проверка и охрана типа нулевого указателя |
||
249 | |||
6613 | leency | 250 | Оригинальное сообщение о языке не определяет поведение программы при |
251 | выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих |
||
252 | Oberon-реализациях выполнение такой операции приводит к ошибке времени |
||
253 | выполнения. В данной реализации охрана типа нулевого указателя не приводит к |
||
254 | ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет |
||
255 | значительно сократить частоту применения охраны типа. |
||
256 | |||
257 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 258 | Дополнительные стандартные процедуры |
6613 | leency | 259 | |
7597 | akron1 | 260 | DISPOSE (VAR v: любой_указатель) |
261 | Освобождает память, выделенную процедурой NEW для |
||
262 | динамической переменной v^, и присваивает переменной v |
||
263 | значение NIL. |
||
6613 | leency | 264 | |
7597 | akron1 | 265 | COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR); |
266 | v := x; |
||
267 | Если LEN(v) < LEN(x), то строка x будет скопирована |
||
268 | не полностью |
||
6613 | leency | 269 | |
7597 | akron1 | 270 | LSR (x, n: INTEGER): INTEGER |
271 | Логический сдвиг x на n бит вправо. |
||
7107 | akron1 | 272 | |
7597 | akron1 | 273 | MIN (a, b: INTEGER): INTEGER |
274 | Минимум из двух значений. |
||
7107 | akron1 | 275 | |
7597 | akron1 | 276 | MAX (a, b: INTEGER): INTEGER |
277 | Максимум из двух значений. |
||
6613 | leency | 278 | |
7597 | akron1 | 279 | BITS (x: INTEGER): SET |
280 | Интерпретирует x как значение типа SET. |
||
281 | Выполняется на этапе компиляции. |
||
6613 | leency | 282 | |
7597 | akron1 | 283 | LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER |
284 | Длина 0X-завершенной строки s, без учета символа 0X. |
||
285 | Если символ 0X отсутствует, функция возвращает длину |
||
286 | массива s. s не может быть константой. |
||
6613 | leency | 287 | |
7597 | akron1 | 288 | WCHR (n: INTEGER): WCHAR |
289 | Преобразование типа, аналогично CHR(n: INTEGER): CHAR |
||
6613 | leency | 290 | |
291 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 292 | DIV и MOD |
6613 | leency | 293 | |
7597 | akron1 | 294 | x y x DIV y x MOD y |
6613 | leency | 295 | |
7597 | akron1 | 296 | 5 3 1 2 |
297 | -5 3 -2 1 |
||
298 | 5 -3 -2 -1 |
||
299 | -5 -3 1 -2 |
||
6613 | leency | 300 | |
301 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 302 | Импортированные процедуры |
6613 | leency | 303 | |
7597 | akron1 | 304 | Синтаксис импорта: |
6613 | leency | 305 | |
7597 | akron1 | 306 | PROCEDURE [callconv, "library", "function"] proc_name (FormalParam): Type; |
6613 | leency | 307 | |
7597 | akron1 | 308 | - callconv -- соглашение о вызове |
309 | - "library" -- имя файла динамической библиотеки |
||
310 | - "function" -- имя импортируемой процедуры |
||
6613 | leency | 311 | |
7597 | akron1 | 312 | например: |
6613 | leency | 313 | |
7597 | akron1 | 314 | PROCEDURE [windows, "kernel32.dll", "ExitProcess"] exit (code: INTEGER); |
6613 | leency | 315 | |
7597 | akron1 | 316 | PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN); |
6613 | leency | 317 | |
7597 | akron1 | 318 | В конце объявления может быть добавлено (необязательно) "END proc_name;" |
6613 | leency | 319 | |
7597 | akron1 | 320 | Объявления импортированных процедур должны располагаться в глобальной |
321 | области видимости модуля после объявления переменных, вместе с объявлением |
||
322 | "обычных" процедур, от которых импортированные отличаются только отсутствием |
||
323 | тела процедуры. В остальном, к таким процедурам применимы те же правила: |
||
324 | их можно вызвать, присвоить процедурной переменной или получить адрес. |
||
6613 | leency | 325 | |
7597 | akron1 | 326 | Так как импортированная процедура всегда имеет явное указание соглашения о |
327 | вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием |
||
328 | соглашения о вызове: |
||
6613 | leency | 329 | |
7597 | akron1 | 330 | VAR |
331 | ExitProcess: PROCEDURE [windows] (code: INTEGER); |
||
332 | con_exit: PROCEDURE [stdcall] (bCloseWindow: BOOLEAN); |
||
6613 | leency | 333 | |
7597 | akron1 | 334 | В KolibriOS импортировать процедуры можно только из библиотек, размещенных |
335 | в /rd/1/lib. Импортировать и вызывать функции инициализации библиотек |
||
336 | (lib_init, START) при этом не нужно. |
||
6613 | leency | 337 | |
7597 | akron1 | 338 | Для Linux, импортированные процедуры не реализованы. |
6613 | leency | 339 | |
340 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 341 | Скрытые параметры процедур |
6613 | leency | 342 | |
7597 | akron1 | 343 | Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке |
344 | формальных параметров, но учитываются компилятором при трансляции вызовов. |
||
345 | Это возможно в следующих случаях: |
||
6613 | leency | 346 | |
7597 | akron1 | 347 | 1. Процедура имеет формальный параметр открытый массив: |
348 | PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL); |
||
349 | Вызов транслируется так: |
||
350 | Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x)) |
||
351 | 2. Процедура имеет формальный параметр-переменную типа RECORD: |
||
352 | PROCEDURE Proc (VAR x: Rec); |
||
353 | Вызов транслируется так: |
||
354 | Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x)) |
||
6613 | leency | 355 | |
356 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 357 | Модуль RTL |
6613 | leency | 358 | |
7597 | akron1 | 359 | Все программы неявно используют модуль RTL. Компилятор транслирует |
360 | некоторые операции (проверка и охрана типа, сравнение строк, сообщения об |
||
361 | ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не |
||
7693 | akron1 | 362 | следует явно вызывать эти процедуры, за исключением процедур SetDll и SetFini |
363 | если приложение компилируется как Windows DLL или Linux SO, соответственно: |
||
6613 | leency | 364 | |
7597 | akron1 | 365 | PROCEDURE SetDll |
366 | (process_detach, thread_detach, thread_attach: DLL_ENTRY); |
||
367 | где TYPE DLL_ENTRY = |
||
368 | PROCEDURE (hinstDLL, fdwReason, lpvReserved: INTEGER); |
||
6613 | leency | 369 | |
7597 | akron1 | 370 | SetDll назначает процедуры process_detach, thread_detach, thread_attach |
371 | вызываемыми при |
||
372 | - выгрузке dll-библиотеки (process_detach) |
||
373 | - создании нового потока (thread_attach) |
||
374 | - уничтожении потока (thread_detach) |
||
6613 | leency | 375 | |
7693 | akron1 | 376 | |
377 | PROCEDURE SetFini (ProcFini: PROC); |
||
378 | где TYPE PROC = PROCEDURE (* без параметров *) |
||
379 | |||
380 | SetFini назначает процедуру ProcFini вызываемой при выгрузке so-библиотеки. |
||
381 | |||
382 | Для прочих типов приложений, вызов процедур SetDll и SetFini не влияет на |
||
7597 | akron1 | 383 | поведение программы. |
7693 | akron1 | 384 | |
7597 | akron1 | 385 | Сообщения об ошибках времени выполнения выводятся в диалоговых окнах |
386 | (Windows), в терминал (Linux), на доску отладки (KolibriOS). |
||
6613 | leency | 387 | |
388 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 389 | Модуль API |
6613 | leency | 390 | |
7597 | akron1 | 391 | Существуют несколько реализаций модуля API (для различных ОС). |
392 | Как и модуль RTL, модуль API не предназначен для прямого использования. |
||
393 | Он обеспечивает связь RTL с ОС. |
||
6613 | leency | 394 | |
395 | ------------------------------------------------------------------------------ |
||
7597 | akron1 | 396 | Генерация исполняемых файлов DLL |
6613 | leency | 397 | |
7597 | akron1 | 398 | Разрешается экспортировать только процедуры. Для этого, процедура должна |
399 | находиться в главном модуле программы, и ее имя должно быть отмечено символом |
||
400 | экспорта ("*"). KolibriOS DLL всегда экспортируют идентификаторы "version" |
||
401 | (версия программы) и "lib_init" - адрес процедуры инициализации DLL: |
||
6613 | leency | 402 | |
7597 | akron1 | 403 | PROCEDURE [stdcall] lib_init (): INTEGER |
6613 | leency | 404 | |
7597 | akron1 | 405 | Эта процедура должна быть вызвана перед использованием DLL. |
7693 | akron1 | 406 | Процедура всегда возвращает 1.>>>>>"ptibcwra"> |