powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Под какой лицензией firebird.pas?
57 сообщений из 57, показаны все 3 страниц
Под какой лицензией firebird.pas?
    #39624623
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу его пропатчить (его нужно пропатчить, т.к. там много всего) и выложить на GitHub. Какую лицензию указывать?
Если IDPL, то получается все кто заиспользуют пропатченную версию будут вынуждены следовать лицензии и публиковать код firebird.pas. Можно ли как-нибудь без этого? Может есть возможность сделать для генерируемых API свободную лицензию (public domain)? Или всё что идёт с Firebird обязано быть под IDPL?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624638
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

он генерируется, посему его не надо патчить.
Патчить надо генератор - extern\cloop
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624669
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommerто получается все кто заиспользуют пропатченную версию будут вынуждены следовать лицензии и публиковать код firebird.pas.
прочитай еще раз лицензию, внимательно.
Публиковать изменения должен тот, кто эти изменения производит. При этом, если измененный exe выложен публично.
Тот, кто пользуется, ничего никуда выкладывать не должен. Иначе сейчас все, кто пользуются ФБ, должны были бы опубликовать эти исходники. Что являлось бы полным маразмом.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624680
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

Хочу табы заменить на пробелы.
Хочу в записях убрать лишние пробелы между именами полей и двоеточием.
Хочу в записях сделать правильное выравнивание.
Хочу Record заменить на record, destroy на Destroy. И вообще сделать как принято в паскале.
Хочу заменить NativeInt для Delphi 2007 и ниже (он там поломан).
Хочу кое где заменить NativeIntPtr на Pointer, т.к. там именно Pointer нужен.
Хочу все декларации типов и констант поместить в супертип, чтобы наружу не торчала сотня-другая типов и констант (у меня есть свой ITransaction, не хочу чтобы он путался с Firebird.ITransaction (и вообще префикс I для интерфейсов). Так же типы вроде BooleanPtr, TraceCounts, Dsc не должны с такими именами торчать наружу).
Хочу загружать клиента динамически. Мне не подходит вот это:
Код: pascal
1.
function fb_get_master_interface : IMaster; cdecl; external 'fbclient';


Хочу выложить это и сообщить разработчику cloop. Он возьмёт себе что посчитает нужным. Вопрос под какой лицензией выложить.

Где кстати можно взять firebird.pas для 4 версии? В дистрибутиве альфы его нет, на GitHub тоже нет.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624689
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvПубликовать изменения должен тот, кто эти изменения производит.
Т.е. если я внесу в firebird.pas изменения, дам его вам, вы его заиспользуете в своих коммерческих проектах, то после этого вы не будете должны выложить этот firebird.pas у себя на сайте? Или будете должны?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624692
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

а не проще ли выложить патч для cloop?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624695
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerХочу выложить это и сообщить разработчику cloop. Он возьмёт себе что посчитает нужным.
Вопрос под какой лицензией выложить.

Просто клонируй репозиторий Firebird и не парься с лицензиями.

PS: На pull request можешь не тратить время.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624728
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Дениса не проще ли выложить патч для cloop?
Возможно. А возможно будет проще мне потратить 20 минут на то чтобы пропатчить и выложить firebird.pas и 20 минут потратить разработчику cloop чтобы применить изменения, чем мне потратить несколько часов (C++ мне не родной).
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624733
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommerвы его заиспользуете в своих коммерческих проектах, то после этого вы не будете должны выложить этот firebird.pas у себя на сайте? Или будете должны?
конечно нет. Я или кто-то еще делал изменения - какая разница? Я же не публикую результат компиляции, и никому его не даю.

Господи, ну прочитайте же пункт 3.2
3.2. Availability of Source Code. Any Modification which You create or to
which You contribute must be made available in Source Code form under the
terms of this License either on the same media as an Executable version or via
an accepted Electronic Distribution Mechanism to anyone to whom you made
an Executable version available


Беру ваш исходник (или свой исходник), и использую сам. Я, конечно, могу сам себе отправить этот исходник, но это уже будет граничить с шизофренией :-)
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624753
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvЯ же не публикую результат компиляции, и никому его не даю.
А если даёте и даже продаёте: Hommer Т.е. если я внесу в firebird.pas изменения, дам его вам, вы его заиспользуете в своих коммерческих проектах, то после этого вы не будете должны выложить этот firebird.pas у себя на сайте? Или будете должны??
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624755
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerХочу табы заменить на пробелы.
Хочу в записях убрать лишние пробелы между именами полей и двоеточием.
Хочу в записях сделать правильное выравнивание.
Хочу Record заменить на record, destroy на Destroy. И вообще сделать как принято в паскале.

это всё легко решается в патчем cloop и особых мегазнаний для этого не нужно.

HommerХочу все декларации типов и констант поместить в супертип, чтобы наружу не торчала сотня-другая типов и констант (у меня есть свой ITransaction, не хочу чтобы он путался с Firebird.ITransaction (и вообще префикс I для интерфейсов). Так же типы вроде

то что у тебя есть свой ITransaction никого не волнует. При желании ты можешь их отличать по полному имени.

HommerХочу загружать клиента динамически. Мне не подходит вот это:

ты хочешь так, а другие хотят другого. Почему все должны ориентироваться на то что ты хочешь? В конце концов заменить одну строчку у себя в проекте ты всегда можешь. Другие тоже могут, если захотят.

HommerГде кстати можно взять firebird.pas для 4 версии? В дистрибутиве альфы его нет, на GitHub тоже нет.

сгенерируй его сам. Как минимум до выхода beta API будет меняться, поэтому пока выкладывать этот файл нет смысла.
Я как то разбирался с клопом для генерации Firebird.pas для трёшки, он хоть и плохо документирован, но по исходникам вроде всё понятно (формат командной строки), там ничего сложного нет.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624773
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerСимонов Дениса не проще ли выложить патч для cloop?
Возможно. А возможно будет проще мне потратить 20 минут на то чтобы пропатчить и выложить firebird.pas и 20 минут потратить разработчику cloop чтобы применить изменения, чем мне потратить несколько часов (C++ мне не родной).Для того, чтобы кто-то менял cloop по твоим хотелкам, его нужно сильно в этом заинтересовать.
И вообще сначала убедить, что ты хочешь чего-то хорошего и нужного.
Я сильно сомневаюсь, что кто-либо захочет смотреть что ты там наменял в firebird.pas и потом искать способы реализовать это в cloop.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624790
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисто что у тебя есть свой ITransaction никого не волнует. При желании ты можешь их отличать по полному имени.
Мне пользоваться, поэтому меня волнует.

Симонов Денисты хочешь так, а другие хотят другого. Почему все должны ориентироваться на то что ты хочешь? В конце концов заменить одну строчку у себя в проекте ты всегда можешь. Другие тоже могут, если захотят.Я хочу у себя в GitHub выложить пропатченный firebird.pas. Есть возражения? :) Потом можно подумать про cloop.
Вопрос какую лицензию указать и почему именно такую.

Симонов ДенисHommerГде кстати можно взять firebird.pas для 4 версии? В дистрибутиве альфы его нет, на GitHub тоже нет.
сгенерируй его сам.
Он должен быть в снапшотах, а его нет. Правильно ли будет использовать firebird.pas от тройки?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624808
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerМне пользоваться, поэтому меня волнует.
ну так и делай под себя зачем другим навязывать свои хотелки.
З.Ы. По первым 4 пунктам ничего против не имею, но патчить надо клопа

HommerОн должен быть в снапшотах, а его нет. Правильно ли будет использовать firebird.pas от тройки?

Когда собираются снапшоты дополнительные генерации не запускаются.
Скачай https://github.com/FirebirdSQL/firebird/tree/master/extern/cloop и скомпилируй клопа. Потом сгенерируй новый firebird.pas

В 4.0 API был существенно расширен. Не знаю подойдёт ли к нему старый firebird.pas, но даже если подойдёт, то он будет как минимум не полный.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624810
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladHommerпропущено...

Возможно. А возможно будет проще мне потратить 20 минут на то чтобы пропатчить и выложить firebird.pas и 20 минут потратить разработчику cloop чтобы применить изменения, чем мне потратить несколько часов (C++ мне не родной).Для того, чтобы кто-то менял cloop по твоим хотелкам, его нужно сильно в этом заинтересовать.
И вообще сначала убедить, что ты хочешь чего-то хорошего и нужного.
И как же быть?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624814
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

и ещё. В новых дельфях есть форматирование кода, которое настраивается. Почему бы не настроить форматирование под себя, не взять firebird.pas и запустить это форматирование. Как минимум 4 первые проблемы ты решишь.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624844
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerhvladДля того, чтобы кто-то менял cloop по твоим хотелкам, его нужно сильно в этом заинтересовать.
И вообще сначала убедить, что ты хочешь чего-то хорошего и нужного.
И как же быть?Лучше всего - патчить cloop.
Если нет сил\желания - создать список "чего не так" в нынешнем генераторе и предложить его разработчикам.
Можно даже в трекере.
Быть готовым защищать свою точку зрения и убеждать остальных.

PS Мне тоже не нравится текущий firebird.pas, так что шансы у тебя есть :)
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624891
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerА если даёте и даже продаёте:
я не понимаю, в чем проблема прочитать этот треклятый пункт 3.2?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624900
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Дениси ещё. В новых дельфях есть форматирование кода, которое настраивается. Почему бы не настроить форматирование под себя, не взять firebird.pas и запустить это форматирование. Как минимум 4 первые проблемы ты решишь.
А почему бы не иметь правильно отформатированный код firebird.pas в дистрибутиве Firebird?
Как минимум те кто использует firebird.pas не задавались бы вопросом "ftw with code?".

Кстати вот код из fpc (\source\rtl\linux\system.pp):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
{
    This file is part of the Free Pascal run time library.
    Copyright (c) 2000 by Marco van de Voort
    member of the Free Pascal development team.

    System unit for Linux.

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 **********************************************************************}

{ These things are set in the makefile, }
{ But you can override them here.}
{ If you use an aout system, set the conditional AOUT}
{ $Define AOUT}

Unit System;

{*****************************************************************************}
                                    interface
{*****************************************************************************}

{$define FPC_IS_SYSTEM}
{$define HAS_CMDLINE}
{$define USE_NOTHREADMANAGER}

{$i osdefs.inc}

{$I sysunixh.inc}

function get_cmdline:Pchar; 
property cmdline:Pchar read get_cmdline;

{$if defined(CPUARM) or defined(CPUM68K) or (defined(CPUSPARC) and defined(VER2_6))}

{$define fpc_softfpu_interface}
{$i softfpu.pp}
{$undef fpc_softfpu_interface}

{$endif defined(CPUARM) or defined(CPUM68K) or (defined(CPUSPARC) and defined(VER2_6))}

{*****************************************************************************}
                                 implementation
{*****************************************************************************}

{$if defined(CPUI386) and not defined(FPC_USE_LIBC)}
var
  sysenter_supported: LongInt = 0;
{$endif}

const calculated_cmdline:Pchar=nil;

{$if defined(CPUARM) or defined(CPUM68K) or (defined(CPUSPARC) and defined(VER2_6))}

{$define fpc_softfpu_implementation}
{$i softfpu.pp}
{$undef fpc_softfpu_implementation}

{ we get these functions and types from the softfpu code }
{$define FPC_SYSTEM_HAS_float64}
{$define FPC_SYSTEM_HAS_float32}
{$define FPC_SYSTEM_HAS_flag}
{$define FPC_SYSTEM_HAS_extractFloat64Frac0}
{$define FPC_SYSTEM_HAS_extractFloat64Frac1}
{$define FPC_SYSTEM_HAS_extractFloat64Exp}
{$define FPC_SYSTEM_HAS_extractFloat64Sign}
{$define FPC_SYSTEM_HAS_ExtractFloat32Frac}
{$define FPC_SYSTEM_HAS_extractFloat32Exp}
{$define FPC_SYSTEM_HAS_extractFloat32Sign}

{$endif defined(CPUARM) or defined(CPUM68K) or (defined(CPUSPARC) and defined(VER2_6))}

{$I system.inc}

{$ifdef android}
{$I sysandroid.inc}
{$endif android}

{*****************************************************************************
                       Misc. System Dependent Functions
*****************************************************************************}

{$if defined(CPUARM) and defined(FPC_ABI_EABI)}
procedure haltproc(e:longint);cdecl;external name '_haltproc_eabi';
{$else}
procedure haltproc(e:longint);cdecl;external name '_haltproc';
{$endif}

{$ifdef FPC_USE_LIBC}
function  FpPrCtl(options : cInt; const args : ptruint) : cint; cdecl; external clib name 'prctl';
{$endif}

procedure System_exit;
begin
  haltproc(ExitCode);
End;


Function ParamCount: Longint;
Begin
  Paramcount:=argc-1
End;


{function BackPos(c:char; const s: shortstring): integer;
var
 i: integer;
Begin
  for i:=length(s) downto 0 do
    if s[i] = c then break;
  if i=0 then
    BackPos := 0
  else
    BackPos := i;
end;}


 { variable where full path and filename and executable is stored }
 { is setup by the startup of the system unit.                    }
var
 execpathstr : shortstring;

function paramstr(l: longint) : string;
 begin
   { stricly conforming POSIX applications  }
   { have the executing filename as argv[0] }
   if l=0 then
     begin
       paramstr := execpathstr;
     end
   else if (l < argc) then
     paramstr:=strpas(argv[l])
   else
     paramstr:='';
 end;

Procedure Randomize;
Begin
  randseed:=longint(Fptime(nil));
End;

{*****************************************************************************
                                    cmdline
*****************************************************************************}

procedure SetupCmdLine;
var
  bufsize,
  len,j,
  size,i : longint;
  found  : boolean;
  buf    : pchar;

  procedure AddBuf;
  begin
    reallocmem(calculated_cmdline,size+bufsize);
    move(buf^,calculated_cmdline[size],bufsize);
    inc(size,bufsize);
    bufsize:=0;
  end;

begin
  if argc<=0 then
    exit;
  GetMem(buf,ARG_MAX);
  size:=0;
  bufsize:=0;
  i:=0;
  while (i<argc) do
   begin
     len:=strlen(argv[i]);
     if len>ARG_MAX-2 then
      len:=ARG_MAX-2;
     found:=false;
     for j:=1 to len do
      if argv[i][j]=' ' then
       begin
         found:=true;
         break;
       end;
     found:=found or (len=0); // also quote if len=0, bug 19114
     if bufsize+len>=ARG_MAX-2 then
      AddBuf;
     if found then
      begin
        buf[bufsize]:='"';
        inc(bufsize);
      end;
     if len>0 then
       begin
         move(argv[i]^,buf[bufsize],len);
         inc(bufsize,len);
       end;
     if found then
      begin
        buf[bufsize]:='"';
        inc(bufsize);
      end;
     if i<argc-1 then
      buf[bufsize]:=' '
     else
      buf[bufsize]:=#0;
     inc(bufsize);
     inc(i);
   end;
  AddBuf;
  FreeMem(buf,ARG_MAX);
end;

function get_cmdline:Pchar;

begin
  if calculated_cmdline=nil then
    setupcmdline;
  get_cmdline:=calculated_cmdline;
end;

{*****************************************************************************
                         SystemUnit Initialization
*****************************************************************************}

function  reenable_signal(sig : longint) : boolean;
var
  e : TSigSet;
  i,j : byte;
  olderrno: cint;
begin
  fillchar(e,sizeof(e),#0);
  { set is 1 based PM }
  dec(sig);
  i:=sig mod (sizeof(cuLong) * 8);
  j:=sig div (sizeof(cuLong) * 8);
  e[j]:=1 shl i;
  { this routine is called from a signal handler, so must not change errno }
  olderrno:=geterrno;
  fpsigprocmask(SIG_UNBLOCK,@e,nil);
  reenable_signal:=geterrno=0;
  seterrno(olderrno);
end;

// signal handler is arch dependant due to processorexception to language
// exception translation

{$i sighnd.inc}

procedure InstallDefaultSignalHandler(signum: longint; out oldact: SigActionRec); public name '_FPC_INSTALLDEFAULTSIGHANDLER';
var
  act: SigActionRec;
begin
  { Initialize the sigaction structure }
  { all flags and information set to zero }
  FillChar(act, sizeof(SigActionRec),0);
  { initialize handler                    }
  act.sa_handler := SigActionHandler(@SignalToRunError);
  act.sa_flags:=SA_SIGINFO;
  FpSigAction(signum,@act,@oldact);
end;

var
  oldsigfpe: SigActionRec; public name '_FPC_OLDSIGFPE';
  oldsigsegv: SigActionRec; public name '_FPC_OLDSIGSEGV';
  oldsigbus: SigActionRec; public name '_FPC_OLDSIGBUS';
  oldsigill: SigActionRec; public name '_FPC_OLDSIGILL';

Procedure InstallSignals;
begin
  InstallDefaultSignalHandler(SIGFPE,oldsigfpe);
  InstallDefaultSignalHandler(SIGSEGV,oldsigsegv);
  InstallDefaultSignalHandler(SIGBUS,oldsigbus);
  InstallDefaultSignalHandler(SIGILL,oldsigill);
end;

procedure SysInitStdIO;
begin
  OpenStdIO(Input,fmInput,StdInputHandle);
  OpenStdIO(Output,fmOutput,StdOutputHandle);
  OpenStdIO(ErrOutput,fmOutput,StdErrorHandle);
  OpenStdIO(StdOut,fmOutput,StdOutputHandle);
  OpenStdIO(StdErr,fmOutput,StdErrorHandle);
end;

Procedure RestoreOldSignalHandlers;
begin
  FpSigAction(SIGFPE,@oldsigfpe,nil);
  FpSigAction(SIGSEGV,@oldsigsegv,nil);
  FpSigAction(SIGBUS,@oldsigbus,nil);
  FpSigAction(SIGILL,@oldsigill,nil);
end;


procedure SysInitExecPath;
var
  i    : longint;
begin
  execpathstr[0]:=#0;
  i:=Fpreadlink('/proc/self/exe',@execpathstr[1],high(execpathstr));
  { it must also be an absolute filename, linux 2.0 points to a memory
    location so this will skip that }
  if (i>0) and (execpathstr[1]='/') then
     execpathstr[0]:=char(i);
end;

function GetProcessID: SizeUInt;
begin
 GetProcessID := SizeUInt (fpGetPID);
end;

{$ifdef FPC_USE_LIBC}
{$ifdef HAS_UGETRLIMIT}
    { there is no ugetrlimit libc call, just map it to the getrlimit call in these cases }
function FpUGetRLimit(resource : cInt; rlim : PRLimit) : cInt; cdecl; external clib name 'getrlimit';
{$endif}
{$endif}

function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;
var
  limits : TRLimit;
  success : boolean;
begin
  success := false;
  fillchar(limits, sizeof(limits), 0);
  {$ifdef has_ugetrlimit}
  success := fpugetrlimit(RLIMIT_STACK, @limits)=0;
  {$endif}
  {$ifndef NO_SYSCALL_GETRLIMIT}
  if (not success) then
    success := fpgetrlimit(RLIMIT_STACK, @limits)=0;
  {$endif}
  if (success) and (limits.rlim_cur < stklen) then
    result := limits.rlim_cur
  else
    result := stklen;
end;

var
  initialstkptr : Pointer;external name '__stkptr';
begin
{$if defined(i386) and not defined(FPC_USE_LIBC)}
  InitSyscallIntf;
{$endif}

{$ifndef FPUNONE}
{$if defined(cpupowerpc)}
  // some PPC kernels set the exception bits FE0/FE1 in the MSR to zero,
  // disabling all FPU exceptions. Enable them again.
  fpprctl(PR_SET_FPEXC, PR_FP_EXC_PRECISE);
{$endif}
{$endif}
  IsConsole := TRUE;
  StackLength := CheckInitialStkLen(initialStkLen);
  StackBottom := initialstkptr - StackLength;
  { Set up signals handlers (may be needed by init code to test cpu features) }
  InstallSignals;
{$if defined(cpui386) or defined(cpuarm)}
  fpc_cpucodeinit;
{$endif cpui386}

  { Setup heap }
  InitHeap;
  SysInitExceptions;
  initunicodestringmanager;
  { Setup stdin, stdout and stderr }
  SysInitStdIO;
  { Arguments }
  SysInitExecPath;
  { Reset IO Error }
  InOutRes:=0;
  { threading }
  InitSystemThreads;
  { restore original signal handlers in case this is a library }
  if IsLibrary then
    RestoreOldSignalHandlers;
end.


Вызывает доверие? :)
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624931
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvHommerА если даёте и даже продаёте:
я не понимаю, в чем проблема прочитать этот треклятый пункт 3.2?
Вы же процитировали:
Код: plaintext
1.
2.
3.
4.
5.
3.2. Availability of Source Code.  Any Modification which You create or to
which You contribute must be made available in Source Code form under the
terms of this License either on the same media as an Executable version or via
an accepted Electronic Distribution Mechanism to anyone to whom you made
an Executable version available 

Любые изменения должны быть доступны в исходниках и под той же лицензией.

Например вы переписали свои коммерческие программы с использованием модифицированного firebird.pas и допустим firebird.pas под IDPL.
Если изменения в firebird.pas вносили вы, то должны ли вы предоставлять его исходник тем кто купил у вас программу?
Если изменения в firebird.pas вносил я, выложил где-то в интернете, вы скачали и использовали, то должны ли вы предоставлять его исходник тем кто купил у вас программу?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624944
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
слава богу...

HommerЕсли изменения в firebird.pas вносили вы, то должны ли вы предоставлять его исходник тем кто купил у вас программу?
если firebird.pas под IDPL, то да. Хотя мне не очень понятно, почему он под idpl, если представляет собой просто интерфейс к новому апи fbclient.dll.
По идее, он не должен быть под idpl.

Кроме того, поскольку вы предлагаете изменения firebird.pas, которые касаются только форматирования, и никак не влияют на результат компиляции firebird.pas, то об ИЗМЕНЕНИИ КОДА по факту речь не идет.
HommerЕсли изменения в firebird.pas вносил я, выложил где-то в интернете, вы скачали и использовали, то должны ли вы предоставлять его исходник тем кто купил у вас программу?
да.

Но это только в том случае, если распространяется результат компиляции firebird.pas.
Собственно, здесь та же самая засада, что и у клиентской части mysql. Она была под gpl, и была т.н. sticky, то есть заставляла открывать и публиковать исходники приложения, который использовал клиентскую часть.
В случае firebird.pas он должен быть под лицензией, которая НЕ принуждает распространять свои исходники, если им требуется firebird.pas для компиляции.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624950
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

firebird.pas не является частью исходного кода firebird
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624956
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvВ случае firebird.pas он должен быть под лицензией, которая НЕ принуждает распространять свои исходники, если им требуется firebird.pas для компиляции.
Если можно, то чтобы лицензия не принуждала вообще ни к чему, вроде public domain.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624963
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисfirebird.pas не является частью исходного кода firebird
А cryptDb.pas?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
{
 *	PROGRAM:	Object oriented API samples.
 *	MODULE:		cryptDb.pas
 *	DESCRIPTION:	Sample of how diskcrypt may be written using pascal.
 *					Does XOR 5 for all bytes in passed data.
 *
 *					Run something like this to build:
 *					fpc -Fu<path-to-Firebird.pas> -Mdelphi -fPIC cryptDb.pas
 *
 *  The contents of this file are subject to the Initial
 *  Developer's Public License Version 1.0 (the "License");
 *  you may not use this file except in compliance with the
 *  License. You may obtain a copy of the License at
 *  http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
 *
 *  Software distributed under the License is distributed AS IS,
 *  WITHOUT WARRANTY OF ANY KIND, either express or implied.
 *  See the License for the specific language governing rights
 *  and limitations under the License.
 *
 *  The Original Code was created by Alexander Peshkoff
 *  for the Firebird Open Source RDBMS project.
 *
 *  Copyright (c) 2016 Alexander Peshkoff <peshkoff@mail.ru>;
 *  and all contributors signed below.
 *
 *  All Rights Reserved.
 *  Contributor(s): ______________________________________. }

library cryptDb;

uses
  SysUtils,
  Classes,
  Firebird;
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624972
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

является, потому что он написан руками, а не сгенерирован автоматически. Разницу видишь?

З.Ы. ты можешь написать собственный генератор который создаёт интерфейс для любого другого языка программирования. И вновь генерированный файл не обязан сдержать какую-то лицензию.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624976
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисHommer,

является, потому что он написан руками, а не сгенерирован автоматически. Разницу видишь?

З.Ы. ты можешь написать собственный генератор который создаёт интерфейс для любого другого языка программирования. И вновь генерированный файл не обязан сдержать какую-то лицензию.
А если такой файл набить руками, то обязательно нужно прилеплять к нему IDPL?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624982
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

не ужели ты не видишь разницу между использованием чужого кода с лицензией в который ты вносишь правки и написанием полностью своего (в котором не используются части чужого кода)?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39624997
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисЗ.Ы. ты можешь написать собственный генератор который создаёт интерфейс для любого другого языка программирования. И вновь генерированный файл не обязан сдержать какую-то лицензию.
А если сгенерённый файл будет монолитным cpp файлом в котором будет весь код Firebird? :) Это просто про подумать где проходит грань. Если что-то сгенерено из того что под IDPL, обязано ли сгенерённое тоже быть под IDPL? А если написать конвертор кода из C++ в pascal, то паскалевский код тоже должен стать под IDPL? А базы данных которые генерятся IDPL-ным кодом? :)

Воззможно существует способ перегенерации кода (в рамках лицензии конечно), которым можно уйти от IDPL на что-то попонятней :)
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626749
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу указать правильное выравнивание для структур из firebird.pas
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  ntrace_relation_t = Integer;
  TraceCounts = record
    trc_relation_id: ntrace_relation_t;
    trc_relation_name: PAnsiChar;
    trc_counters: ^Int64;
  end;
  TraceCountsPtr = ^TraceCounts;
  PerformanceInfo = record
    pin_time: Int64;
    pin_counters: ^Int64;
    pin_count: NativeUInt;
    pin_tables: TraceCountsPtr;
    pin_records_fetched: Int64;
  end;

  Dsc = record
    dsc_dtype, dsc_scale: Byte;
    dsc_length, dsc_sub_type, dsc_flags: Int16;
    dsc_address: ^Byte;
  end;


Под 32-бит:
- структура TraceCounts одинакова при любом выравнивании.
- структура PerformanceInfo одинакова при выравниваниях 1,2 и 4. И одинакова при выравниваниях 8 и 16. Т.е при 4 и 8 она разная.
- структура Dsc одинакова при любом выравнивании.

Под 64-бит:
- структура TraceCounts одинакова при выравниваниях 1,2 и 4. И одинакова при выравниваниях 8 и 16. Т.е при 4 и 8 она разная.
- структура PerformanceInfo одинакова при любом выравнивании.
- структура Dsc одинакова при любом выравнивании.

Proof:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
unit Unit8;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs;

type
  TForm8 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form8: TForm8;

implementation

{$R *.dfm}


type
{$IFDEF CPUX64}
  NativeInt = Int64;
{$ELSE}
  NativeInt = Integer;
{$ENDIF}

  ntrace_relation_t = Integer;

{$A1}
  TTraceCounts1 = record
    trc_relation_id: ntrace_relation_t;
    trc_relation_name: PAnsiChar;
    trc_counters: ^Int64;
  end;
  TraceCountsPtr1 = ^TTraceCounts1;

  TPerformanceInfo1 = record
    pin_time: Int64;
    pin_counters: ^Int64;
    pin_count: NativeUInt;
    pin_tables: TraceCountsPtr1;
    pin_records_fetched: Int64;
  end;

  TDsc1 = record
    dsc_dtype, dsc_scale: Byte;
    dsc_length, dsc_sub_type, dsc_flags: Int16;
    dsc_address: ^Byte;
  end;

{$A2}
  TTraceCounts2 = record
    trc_relation_id: ntrace_relation_t;
    trc_relation_name: PAnsiChar;
    trc_counters: ^Int64;
  end;
  TraceCountsPtr2 = ^TTraceCounts2;

  TPerformanceInfo2 = record
    pin_time: Int64;
    pin_counters: ^Int64;
    pin_count: NativeUInt;
    pin_tables: TraceCountsPtr2;
    pin_records_fetched: Int64;
  end;

  TDsc2 = record
    dsc_dtype, dsc_scale: Byte;
    dsc_length, dsc_sub_type, dsc_flags: Int16;
    dsc_address: ^Byte;
  end;

{$A4}
  TTraceCounts4 = record
    trc_relation_id: ntrace_relation_t;
    trc_relation_name: PAnsiChar;
    trc_counters: ^Int64;
  end;
  TraceCountsPtr4 = ^TTraceCounts4;

  TPerformanceInfo4 = record
    pin_time: Int64;
    pin_counters: ^Int64;
    pin_count: NativeUInt;
    pin_tables: TraceCountsPtr4;
    pin_records_fetched: Int64;
  end;

  TDsc4 = record
    dsc_dtype, dsc_scale: Byte;
    dsc_length, dsc_sub_type, dsc_flags: Int16;
    dsc_address: ^Byte;
  end;

{$A8}
  TTraceCounts8 = record
    trc_relation_id: ntrace_relation_t;
    trc_relation_name: PAnsiChar;
    trc_counters: ^Int64;
  end;
  TraceCountsPtr8 = ^TTraceCounts8;

  TPerformanceInfo8 = record
    pin_time: Int64;
    pin_counters: ^Int64;
    pin_count: NativeUInt;
    pin_tables: TraceCountsPtr8;
    pin_records_fetched: Int64;
  end;

  TDsc8 = record
    dsc_dtype, dsc_scale: Byte;
    dsc_length, dsc_sub_type, dsc_flags: Int16;
    dsc_address: ^Byte;
  end;

{$A16}
  TTraceCounts16 = record
    trc_relation_id: ntrace_relation_t;
    trc_relation_name: PAnsiChar;
    trc_counters: ^Int64;
  end;
  TraceCountsPtr16 = ^TTraceCounts16;

  TPerformanceInfo16 = record
    pin_time: Int64;
    pin_counters: ^Int64;
    pin_count: NativeUInt;
    pin_tables: TraceCountsPtr16;
    pin_records_fetched: Int64;
  end;

  TDsc16 = record
    dsc_dtype, dsc_scale: Byte;
    dsc_length, dsc_sub_type, dsc_flags: Int16;
    dsc_address: ^Byte;
  end;

{$A1}
  TBlobCallback1 = record
    GetSegment         : Pointer;
    BlobHandle         : Pointer;
    SegmentCount       : Integer;
    MaxSegmentLength   : Integer;
    TotalSize          : Integer;
    PutSegment         : Pointer;
    Seek               : Pointer;
  end;

{$A2}
  TBlobCallback2 = record
    GetSegment         : Pointer;
    BlobHandle         : Pointer;
    SegmentCount       : Integer;
    MaxSegmentLength   : Integer;
    TotalSize          : Integer;
    PutSegment         : Pointer;
    Seek               : Pointer;
  end;

{$A4}
  TBlobCallback4 = record
    GetSegment         : Pointer;
    BlobHandle         : Pointer;
    SegmentCount       : Integer;
    MaxSegmentLength   : Integer;
    TotalSize          : Integer;
    PutSegment         : Pointer;
    Seek               : Pointer;
  end;

{$A8}
  TBlobCallback8 = record
    GetSegment         : Pointer;
    BlobHandle         : Pointer;
    SegmentCount       : Integer;
    MaxSegmentLength   : Integer;
    TotalSize          : Integer;
    PutSegment         : Pointer;
    Seek               : Pointer;
  end;

{$A16}
  TBlobCallback16 = record
    GetSegment         : Pointer;
    BlobHandle         : Pointer;
    SegmentCount       : Integer;
    MaxSegmentLength   : Integer;
    TotalSize          : Integer;
    PutSegment         : Pointer;
    Seek               : Pointer;
  end;



function BlobCallback1: string;
var
  Rec: TBlobCallback1;
begin
  Result := Format('1  - BlobHandle: %d, SegmentCount: %d, MaxSegmentLength: %d, TotalSize: %d, PutSegment: %d, Seek: %d', [
    NativeInt(@Rec.BlobHandle) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.SegmentCount) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.MaxSegmentLength) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.TotalSize) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.PutSegment) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.Seek) - NativeInt(@Rec.GetSegment)
  ]);
end;

function BlobCallback2: string;
var
  Rec: TBlobCallback2;
begin
  Result := Format('2  - BlobHandle: %d, SegmentCount: %d, MaxSegmentLength: %d, TotalSize: %d, PutSegment: %d, Seek: %d', [
    NativeInt(@Rec.BlobHandle) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.SegmentCount) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.MaxSegmentLength) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.TotalSize) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.PutSegment) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.Seek) - NativeInt(@Rec.GetSegment)
  ]);
end;

function BlobCallback4: string;
var
  Rec: TBlobCallback4;
begin
  Result := Format('4  - BlobHandle: %d, SegmentCount: %d, MaxSegmentLength: %d, TotalSize: %d, PutSegment: %d, Seek: %d', [
    NativeInt(@Rec.BlobHandle) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.SegmentCount) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.MaxSegmentLength) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.TotalSize) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.PutSegment) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.Seek) - NativeInt(@Rec.GetSegment)
  ]);
end;

function BlobCallback8: string;
var
  Rec: TBlobCallback8;
begin
  Result := Format('8  - BlobHandle: %d, SegmentCount: %d, MaxSegmentLength: %d, TotalSize: %d, PutSegment: %d, Seek: %d', [
    NativeInt(@Rec.BlobHandle) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.SegmentCount) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.MaxSegmentLength) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.TotalSize) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.PutSegment) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.Seek) - NativeInt(@Rec.GetSegment)
  ]);
end;

function BlobCallback16: string;
var
  Rec: TBlobCallback16;
begin
  Result := Format('16  - BlobHandle: %d, SegmentCount: %d, MaxSegmentLength: %d, TotalSize: %d, PutSegment: %d, Seek: %d', [
    NativeInt(@Rec.BlobHandle) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.SegmentCount) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.MaxSegmentLength) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.TotalSize) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.PutSegment) - NativeInt(@Rec.GetSegment),
    NativeInt(@Rec.Seek) - NativeInt(@Rec.GetSegment)
  ]);
end;


function TraceCountsStr1: string;
var
  Rec: TTraceCounts1;
begin
  Result := Format('1  - trc_relation_name: %d, trc_counters: %d', [
    NativeInt(@Rec.trc_relation_name) - NativeInt(@Rec.trc_relation_id),
    NativeInt(@Rec.trc_counters) - NativeInt(@Rec.trc_relation_id)
  ]);
end;

function PerformanceInfo1: string;
var
  Rec: TPerformanceInfo1;
begin
  Result := Format('1  - pin_counters: %d, pin_count: %d, pin_tables: %d, pin_records_fetched: %d', [
    NativeInt(@Rec.pin_counters) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_count) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_tables) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_records_fetched) - NativeInt(@Rec.pin_time)
  ]);
end;

function Dsc1: string;
var
  Rec: TDsc1;
begin
  Result := Format('1  - dsc_scale: %d, dsc_length: %d, dsc_sub_type: %d, dsc_flags: %d, dsc_address: %d', [
    NativeInt(@Rec.dsc_scale) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_length) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_sub_type) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_flags) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_address) - NativeInt(@Rec.dsc_dtype)
  ]);
end;

function TraceCountsStr2: string;
var
  Rec: TTraceCounts2;
begin
  Result := Format('2  - trc_relation_name: %d, trc_counters: %d', [
    NativeInt(@Rec.trc_relation_name) - NativeInt(@Rec.trc_relation_id),
    NativeInt(@Rec.trc_counters) - NativeInt(@Rec.trc_relation_id)
  ]);
end;

function PerformanceInfo2: string;
var
  Rec: TPerformanceInfo2;
begin
  Result := Format('2  - pin_counters: %d, pin_count: %d, pin_tables: %d, pin_records_fetched: %d', [
    NativeInt(@Rec.pin_counters) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_count) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_tables) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_records_fetched) - NativeInt(@Rec.pin_time)
  ]);
end;

function Dsc2: string;
var
  Rec: TDsc2;
begin
  Result := Format('2  - dsc_scale: %d, dsc_length: %d, dsc_sub_type: %d, dsc_flags: %d, dsc_address: %d', [
    NativeInt(@Rec.dsc_scale) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_length) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_sub_type) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_flags) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_address) - NativeInt(@Rec.dsc_dtype)
  ]);
end;

function TraceCountsStr4: string;
var
  Rec: TTraceCounts4;
begin
  Result := Format('4  - trc_relation_name: %d, trc_counters: %d', [
    NativeInt(@Rec.trc_relation_name) - NativeInt(@Rec.trc_relation_id),
    NativeInt(@Rec.trc_counters) - NativeInt(@Rec.trc_relation_id)
  ]);
end;

function PerformanceInfo4: string;
var
  Rec: TPerformanceInfo4;
begin
  Result := Format('4  - pin_counters: %d, pin_count: %d, pin_tables: %d, pin_records_fetched: %d', [
    NativeInt(@Rec.pin_counters) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_count) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_tables) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_records_fetched) - NativeInt(@Rec.pin_time)
  ]);
end;

function Dsc4: string;
var
  Rec: TDsc4;
begin
  Result := Format('4  - dsc_scale: %d, dsc_length: %d, dsc_sub_type: %d, dsc_flags: %d, dsc_address: %d', [
    NativeInt(@Rec.dsc_scale) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_length) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_sub_type) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_flags) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_address) - NativeInt(@Rec.dsc_dtype)
  ]);
end;

function TraceCountsStr8: string;
var
  Rec: TTraceCounts8;
begin
  Result := Format('8  - trc_relation_name: %d, trc_counters: %d', [
    NativeInt(@Rec.trc_relation_name) - NativeInt(@Rec.trc_relation_id),
    NativeInt(@Rec.trc_counters) - NativeInt(@Rec.trc_relation_id)
  ]);
end;

function PerformanceInfo8: string;
var
  Rec: TPerformanceInfo8;
begin
  Result := Format('8  - pin_counters: %d, pin_count: %d, pin_tables: %d, pin_records_fetched: %d', [
    NativeInt(@Rec.pin_counters) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_count) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_tables) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_records_fetched) - NativeInt(@Rec.pin_time)
  ]);
end;

function Dsc8: string;
var
  Rec: TDsc8;
begin
  Result := Format('8  - dsc_scale: %d, dsc_length: %d, dsc_sub_type: %d, dsc_flags: %d, dsc_address: %d', [
    NativeInt(@Rec.dsc_scale) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_length) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_sub_type) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_flags) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_address) - NativeInt(@Rec.dsc_dtype)
  ]);
end;


function TraceCountsStr16: string;
var
  Rec: TTraceCounts16;
begin
  Result := Format('16 - trc_relation_name: %d, trc_counters: %d', [
    NativeInt(@Rec.trc_relation_name) - NativeInt(@Rec.trc_relation_id),
    NativeInt(@Rec.trc_counters) - NativeInt(@Rec.trc_relation_id)
  ]);
end;

function PerformanceInfo16: string;
var
  Rec: TPerformanceInfo16;
begin
  Result := Format('16 - pin_counters: %d, pin_count: %d, pin_tables: %d, pin_records_fetched: %d', [
    NativeInt(@Rec.pin_counters) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_count) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_tables) - NativeInt(@Rec.pin_time),
    NativeInt(@Rec.pin_records_fetched) - NativeInt(@Rec.pin_time)
  ]);
end;

function Dsc16: string;
var
  Rec: TDsc16;
begin
  Result := Format('16 - dsc_scale: %d, dsc_length: %d, dsc_sub_type: %d, dsc_flags: %d, dsc_address: %d', [
    NativeInt(@Rec.dsc_scale) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_length) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_sub_type) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_flags) - NativeInt(@Rec.dsc_dtype),
    NativeInt(@Rec.dsc_address) - NativeInt(@Rec.dsc_dtype)
  ]);
end;


procedure TForm8.FormCreate(Sender: TObject);
begin
  ShowMessage(TraceCountsStr1 + #13#10 + TraceCountsStr2 + #13#10 + TraceCountsStr4 + #13#10 + TraceCountsStr8 + #13#10 + TraceCountsStr16);
  ShowMessage(PerformanceInfo1 + #13#10 + PerformanceInfo2 + #13#10 + PerformanceInfo4 + #13#10 + PerformanceInfo8 + #13#10 + PerformanceInfo16);
  ShowMessage(Dsc1 + #13#10 + Dsc2 + #13#10 + Dsc4 + #13#10 + Dsc8 + #13#10 + Dsc16);
  ShowMessage(BlobCallback1 + #13#10 + BlobCallback2 + #13#10 + BlobCallback4 + #13#10 + BlobCallback8 + #13#10 + BlobCallback16);
end;

end.


Можно ли исходить из того, что в бинарниках Firebird в структурах для 32-битных платформ выравнивание 8 байт, а для 64-битных - 16? Зависит ли это от компилятора?
Если выравнивание зависит от компилятора, или может быть изменено в последующих их версиях, то тогда нужно прописывать выравнивания в коде Firebird. Или сделать функцию в Firebird API, которая бы возвращала выравнивание. И тогда хоть будет возможность использовать соответствующую ему структуру или кидать исключение если выравнивание не может быть обработано. Или предложите свой вариант :)
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626755
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerМожно ли исходить из того, что в бинарниках Firebird в структурах для 32-битных платформ
выравнивание 8 байт, а для 64-битных - 16? Зависит ли это от компилятора?

Нельзя. Вероятнее всего - да, но авторы компиляторов Си вступили в сговор.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626760
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не проще ли написать свой враппер , чем патчить интерфейсную библиотеку или тем более ее генератор?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626762
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AS. вопрос ещё, является ли декларация типов и констант, без единственнйо выполнимой строчки, кодом.
Как в Turbo Pascal были *.int файлы - юниты у которых было отрезано всё, начиная со строчки implementation.

Симонов Денисявляется, потому что он написан руками, а не сгенерирован автоматически. Разницу видишь?

Не вижу.

Вариант 1: берём исходник интерфейса на каком-нибудь IDL, запускаем какой-нибудь clop, получаем "сгенерированый автоматически" исходник на Паскале
Вариант 2: берём исходник интерфейса на каком-нибудь C (*.h), запускаем какой-нибудь H2P, получаем "сгенерированый автоматически" исходник на Паскале
Вариант 3: берём исходник на Паскале, запускаем какой-нибудь Smart Mobile Studio, получаем "сгенерированый автоматически" исходник на JavaScript
http://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-js

Ну и где грань? Во всех случаях у нас есть транслятор, который получает исходник на одном языке и автоматически по нему создает исходник на другом языке.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626765
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

Проще. Один раз.

....но интерфейс продолжает развиваться и меняться.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626766
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochинтерфейс продолжает развиваться и меняться.

Ага. Причём обычно это происходит внезапно, без предупреждения и без описания "назачем".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626781
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovHommerМожно ли исходить из того, что в бинарниках Firebird в структурах для 32-битных платформ
выравнивание 8 байт, а для 64-битных - 16?

Нельзя.

И как же тогда писать обёртки? Кто об этом должен задумываться?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626785
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerИ как же тогда писать обёртки? Кто об этом должен задумываться?

В идеале - разработчик интерфейса. На практике - автор обёртки, который должен методично
сравнить размеры структур и смещения их мемберов у своей обёртки и оригинала. В данном
конкретном случае - я бы вообще забил на это "новое API", поскольку старое проверено
годами и, надо сказать, удобнее в использовании.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626800
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerИ как же тогда писать обёртки? Кто об этом должен задумываться?Об этом лучше бы задумываться до релиза.
Раз 3-ку пропустил, сосредоточься на 4-ке - общими усилиями сделаем лучше, чем первый блин.

Ну, или можно как Сибиряков - срать на всё и всех
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626802
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

это смотря для каких целей. Если для взаимодействия с приложениями, то может и старого API достаточно, а вот если плагины свои писать или UDR, то так и сяк придётся разбираться с новым API
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626812
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисЕсли для взаимодействия с приложениями, то может и старого API достаточно, а вот если
плагины свои писать или UDR, то так и сяк придётся разбираться с новым API

Да. Но не пришлось бы, если бы некоторые, придумав гениальную идею со структурами
указателей на обычные функции, довели её до логического завершения и сделали всего одну
структуру с указателями на функции старого API.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626816
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovСимонов ДенисЕсли для взаимодействия с приложениями, то может и старого API достаточно, а вот если
плагины свои писать или UDR, то так и сяк придётся разбираться с новым API

Да. Но не пришлось бы, если бы некоторые, придумав гениальную идею со структурами
указателей на обычные функции, довели её до логического завершения и сделали всего одну
структуру с указателями на функции старого API.Не вижу гениального тикета в трекере.
Не вижу связи между старым ISC API и написанием плагинов\UDR.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626846
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladНе вижу связи между старым ISC API и написанием плагинов\UDR.

Понимаю, меня тоже склероз иногда одолевает. Ну так я напомню историю: "новое API"
изначально создавалось чтобы передавать в плагины (включая UDR) указатели по которым можно
было бы вызывать функции движка для выполнения (в том числе) запросов к базе в контексте
текущего коннекта и транзакции. Поскольку, по понятным причинам, загружать в плагине новый
инстанс fbclient было бы неудачной идеей.

И это новое API тогда было действительно ОО, базирующимся на абстрактных классах (так же
известных как COM-интерфейсы). Но потом внезапно обнаружилось, что в FPC (и Дельфи) есть
баг, не позволяющий вернуть интерфейс из функции. И понеслась...

Результатом было текущее состояние: структуры указателей. Что забавно, это то же самое,
что использовалось ещё с Джимовском коде, только тогда оно было без автогенерации. Была
там структура с указателями на все функции GDS API. Казалось бы, сделай аналогичную
структуру и изначальная проблема решена, но нет, тогда пришлось бы не писать новый код, а
избавляться от уже написанного, на который потрачены два года жизни. "На энто я пойтить не
могу!" (с)

А оптимисты, думающие, что их идеи могут найти отклик в сердцах разработчиков - могут
писать в трекер или рассылку. Я, к счастью, этим уже переболел.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626856
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКазалось бы, сделай аналогичную
структуру и изначальная проблема решена, но нет, тогда пришлось бы не писать новый код, а
избавляться от уже написанного, на который потрачены два года жизниКакая изначальная проблема ?
Какой уже написанный код для UDR\плагинов ?

Dimitry SibiryakovЯ, к счастью, этим уже переболел.Это твои проблемы.
Плюс неумение и нежелание сотрудничать и принимать общие правила.

PS Гадить же я тебе не разрешаю, пинал и буду пинать по мере сил.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626878
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladКакая изначальная проблема ?

Повторяю медленно: нужен был способ передавать в плагины (включая UDR) указатели по
которым можно было бы вызывать функции движка для выполнения (в том числе) запросов к базе
в контексте текущего коннекта и транзакции.

hvladКакой уже написанный код для UDR\плагинов ?
Весь код, включая CLOOP, интерфейсы и так называемое "новое API" в полном составе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626882
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovв FPC (и Дельфи) есть баг, не позволяющий вернуть интерфейс из функции

?????

не знаю как там в FPC, а в Delphi это стандартная возможность.

или речь про ABI, что такие функции реализованы компилятором, как процедуры с дополнительным by reference out-параметром ?
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626934
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochили речь про ABI, что такие функции реализованы компилятором, как процедуры с
дополнительным by reference out-параметром ?

Они так реализованы для соглашения safecall. Проблема в том, что для остальных соглашений
это не работает, хотя должно бы. Дебаркадер умеет ловко избавляться от старого мусора и
ссылка http://qc.embarcadero.com/wc/qcmain.aspx?d=51313 уже не работает, но проблема
выглядит в точности как https://bugs.freepascal.org/view.php?id=26593 вплоть до
порождаемого ассемблера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626974
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Хммм... похоже вы нашли какой-то цзкоспецифический случай, который никем практически на практике не использовался (за все время обсуждения кроме FB не было названо других практических примеров).

И тут дело именно в том, что в Delphi/FPC всеми автоматическими объектами (со счетчиками ссылок то есть) занимается компилятор.

> Standard C++ library provides a template for interface smart pointer.

Можешь считать, что вот такой template и является типом interface в Delphi/FPC
И счетчики ссылок автоматически прорабатывать компилятор обязан.

А как именно и кем именно в случае передачи такого темплейте через EAX/RAX должны вызываться _AddRef и _Release вы договориться даже не пытались.

Можно ли _любую_ структуру одного языка в 2-3 слова описать на другом языке? видимо не всегда.

Собственно, когда я читал описание нового FB3 API, там был целый раздел, почему это свой собственный API, а не COM/XPCOM, и там прямо было написано, что FB3 API экономит время исполнения потому что не занимается подсчётом ссылок. Т.е. этот тип не является COM-интерфейсом и как следствие не является Delphi-интерфейсом.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626981
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochпохоже вы нашли какой-то цзкоспецифический случай, который никем практически на практике
не использовался (за все время обсуждения кроме FB не было названо других практических
примеров).

Правда? Погугли "Delphi Direct3dCreate9".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39626989
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochкогда я читал описание нового FB3 API, там был целый раздел, почему это свой собственный
API, а не COM/XPCOM, и там прямо было написано, что FB3 API экономит время исполнения
потому что не занимается подсчётом ссылок. Т.е. этот тип не является COM-интерфейсом и как
следствие не является Delphi-интерфейсом.

Уже после одного этого наглядного примера как люди путают COM и IUnknown можно было
отправлять описание в печь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39627001
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

а что останется от COM, если из него убрать IUnknown?

это из серии "люди путают C++ и классы. Классы для C++ не обязательны."

в любом случае, interface в Object Pascal - это именно iUnknown для этого и вводился (аналогично, как справеливо указали, Visual Basic'y). Со всеми плюсами и минусами этого (например весьма проблемно делать наследуемые интерфейсы без GUIDов, как классы наследуются)/

если FB3 интерфейс отказывается от iUnknown - то он отказывается от Delphi/FPC interface

Dimitry SibiryakovИ это новое API тогда было действительно ОО, базирующимся на абстрактных классах (так же известных как COM-интерфейсы). Но потом внезапно обнаружилось, что в FPC (и Дельфи) есть баг, не позволяющий вернуть интерфейс из функции. И понеслась...

Ну не поддерживается такой тип, не-IUnknown-интерфейс в языке. Это факт. Java-объекты тоже напрямую в язык не встроены, например.

Я правда как-то с трудом верю, что когда делали API FB3 совместимость с Delphi была первостепенной задачей. Скорее всего во втором десятке где-то.

В любом случае, с точки зрения Delphi эти интерфейсы FB3 ничем не отличаются.
Ни некий COM-без-IUnknown, о котором ты говоришь, ни то, что сдели в итоге вместо него.
Оба эти типа одинаково не являются паскалевскими интерфейсами.
Поэтому я не понимаю, что именно "понеслось".

Если бы Delphi нативно поддерживал один из двух конкурирующих предендентов на FB3 API, то чисто гипотетически это как-то могло повлиять на выбор Firebird Team.
Но поскольку он одинаково не поддерживает их оба - то Delphi просто остаётся за скобками.

Какие бы причины ни были у них сделать именно такой API - Delphi к этому отношения не имело.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39627006
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAriochпохоже вы нашли какой-то цзкоспецифический случай, который никем практически на практике
не использовался (за все время обсуждения кроме FB не было названо других практических
примеров).

Правда? Погугли "Delphi Direct3dCreate9".

Ну значит два случая.

Причём MSDNThe IDirect3D9 interface inherits from the IUnknown interface

То есть счётчик ссылок не так сильно затормаживает процесс, чтобы мешать писать 3D-стрелялки.

А потом я смотрю на d3d9->CreateDevice - и кажется мне я там вижу safecall.
https://msdn.microsoft.com/en-us/library/windows/desktop/bb204867.aspx
http://gamesmaker.ru/programming/directx/directx-api-inicializaciya-direct3d/

И я вообще перестаю понимать, почему накладные расходы, вполне терпимые для 3D-стрелялок, оказываются нетерпимыми для RDBMS, которая зачастую утыкается или в диск (если запросов мало, но у каждого огромные данные), или в парсинг и препарирование (если запросы мелкие, но их мнооого)

Но, что выросло - то выросло.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39627009
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

до кучи, в новом API избавились от некоторых int16 полей и связанных с ними ограничений типа "не более 32 KB в одни руки"

Насколько это было критично я не могу судить.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39627034
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochдо кучи, в новом API избавились от некоторых int16 полей и связанных с ними ограниченийЧестно говоря, лучше б в старом апи добавили функции-дубликаты с каким-нибудь суффиксом типа Ex, в котором увеличили бы эти int16, где надо.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39627035
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, и структуры.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39627037
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AriochСобственно, когда я читал описание нового FB3 API, там был целый раздел, почему это свой собственный API, а не COM/XPCOM, и там прямо было написано, что FB3 API экономит время исполнения потому что не занимается подсчётом ссылок. Т.е. этот тип не является COM-интерфейсом и как следствие не является Delphi-интерфейсом.
У 7zip.dll интерфейсное API.
Вот как используется на Delphi (это jcl library): https://github.com/project-jedi/jcl/blob/master/jcl/source/windows/sevenzip.pas
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
729.
730.
731.
732.
733.
734.
735.
736.
737.
738.
739.
740.
741.
742.
743.
744.
745.
746.
747.
748.
749.
750.
751.
752.
753.
754.
755.
756.
757.
758.
759.
760.
761.
762.
763.
764.
765.
766.
767.
768.
769.
770.
{**************************************************************************************************}
{                                                                                                  }
{ Project JEDI Code Library (JCL)                                                                  }
{                                                                                                  }
{ interface of the 'sevenzip' (http://sourceforge.net/projects/sevenzip/) compression library      }
{ version 4.62, December 2th, 2008                                                                 }
{                                                                                                  }
{ Copyright (C) 1999-2008 Igor Pavlov                                                              }
{                                                                                                  }
{ GNU LGPL information                                                                             }
{ --------------------                                                                             }
{                                                                                                  }
{    This library is free software; you can redistribute it and/or modify it under the terms of    }
{    the GNU Lesser General Public License as published by the Free Software Foundation; either    }
{    version 2.1 of the License, or (at your option) any later version.                            }
{                                                                                                  }
{    This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;     }
{    without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     }
{    See the GNU Lesser General Public License for more details.                                   }
{                                                                                                  }
{    You should have received a copy of the GNU Lesser General Public License along with this      }
{    library; if not, write to                                                                     }
{    the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   }
{                                                                                                  }
{ unRAR restriction                                                                                }
{ -----------------                                                                                }
{                                                                                                  }
{    The decompression engine for RAR archives was developed using source code of unRAR program.   }
{    All copyrights to original unRAR code are owned by Alexander Roshal.                          }
{                                                                                                  }
{    The license for original unRAR code has the following restriction:                            }
{                                                                                                  }
{      The unRAR sources cannot be used to re-create the RAR compression algorithm,                }
{      which is proprietary. Distribution of modified unRAR sources in separate form               }
{      or as a part of other software is permitted, provided that it is clearly                    }
{      stated in the documentation and source comments that the code may                           }
{      not be used to develop a RAR (WinRAR) compatible archiver.                                  }
{                                                                                                  }
{**************************************************************************************************}
{                                                                                                  }
{ Translation 2007-2008 Florent Ouchet for the JEDI Code Library                                   }
{ Contributors:                                                                                    }
{   Uwe Schuster (uschuster)                                                                       }
{   Jan Goyvaerts (jgsoft)                                                                         }
{                                                                                                  }
{**************************************************************************************************}
{                                                                                                  }
{ Last modified: $Date::                                                                         $ }
{ Revision:      $Rev::                                                                          $ }
{ Author:        $Author::                                                                       $ }
{                                                                                                  }
{**************************************************************************************************}

unit sevenzip;

interface

{$I jcl.inc}
{$I windowsonly.inc}

uses
  {$IFDEF HAS_UNITSCOPE}
  Winapi.ActiveX, Winapi.Windows,
  {$ELSE ~HAS_UNITSCOPE}
  ActiveX, Windows,
  {$ENDIF ~HAS_UNITSCOPE}
  {$IFDEF UNITVERSIONING}
  JclUnitVersioning,
  {$ENDIF UNITVERSIONING}
  JclBase,
  JclSysUtils;

//DOM-IGNORE-BEGIN

// Guid.txt  
const
  CLSID_CCodec : TGUID = '{23170F69-40C1-2790-0000-000000000000}';
  CLSID_CCodecBCJ2    : TGUID = '{23170F69-40C1-2790-1B01-030300000000}'; // BCJ2 0303011B
  CLSID_CCodecBCJ     : TGUID = '{23170F69-40C1-2790-0301-030300000000}'; // BCJ  03030103
  CLSID_CCodecSWAP2   : TGUID = '{23170F69-40C1-2790-0203-030000000000}'; // swap2 020302
  CLSID_CCodecSWAP4   : TGUID = '{23170F69-40C1-2790-0403-020000000000}'; // swap4 020304
  CLSID_CCodecBPPC    : TGUID = '{23170F69-40C1-2790-0502-030300000000}'; // branch ppc 03030205
  CLSID_CCodecBIA64   : TGUID = '{23170F69-40C1-2790-0104-030300000000}'; // branch IA64 03030401
  CLSID_CCodecBARM    : TGUID = '{23170F69-40C1-2790-0105-030300000000}'; // branch ARM  03030501
  CLSID_CCodecBARMT   : TGUID = '{23170F69-40C1-2790-0107-030300000000}'; // branch ARM Thumb 03030701
  CLSID_CCodecBARMS   : TGUID = '{23170F69-40C1-2790-0508-030300000000}'; // branch ARM Sparc 03030805
  CLSID_CCodecBZIP    : TGUID = '{23170F69-40C1-2790-0202-040000000000}'; // bzip2 040202
  CLSID_CCodecCOPY    : TGUID = '{23170F69-40C1-2790-0000-000000000000}'; // copy 0
  CLSID_CCodecDEF64   : TGUID = '{23170F69-40C1-2790-0901-040000000000}'; // deflate64 040109
  CLSID_CCodecDEFNSIS : TGUID = '{23170F69-40C1-2790-0109-040000000000}'; // deflate nsis 040901
  CLSID_CCodecDEFREG  : TGUID = '{23170F69-40C1-2790-0801-040000000000}'; // deflate register 040108
  CLSID_CCodecLZMA    : TGUID = '{23170F69-40C1-2790-0101-030000000000}'; // lzma 030101
  CLSID_CCodecPPMD    : TGUID = '{23170F69-40C1-2790-0104-030000000000}'; // ppmd 030401
  CLSID_CCodecRAR1    : TGUID = '{23170F69-40C1-2790-0103-040000000000}'; // rar1 040301
  CLSID_CCodecRAR2    : TGUID = '{23170F69-40C1-2790-0203-040000000000}'; // rar2 040302
  CLSID_CCodecRAR3    : TGUID = '{23170F69-40C1-2790-0303-040000000000}'; // rar3 040303
  CLSID_CAESCodec     : TGUID = '{23170F69-40C1-2790-0107-F10600000000}'; // AES 06F10701

  CLSID_CArchiveHandler : TGUID = '{23170F69-40C1-278A-1000-000110000000}';
  CLSID_CFormatZip      : TGUID = '{23170F69-40C1-278A-1000-000110010000}';
  CLSID_CFormatBZ2      : TGUID = '{23170F69-40C1-278A-1000-000110020000}';
  CLSID_CFormatRar      : TGUID = '{23170F69-40C1-278A-1000-000110030000}';
  CLSID_CFormatArj      : TGUID = '{23170F69-40C1-278A-1000-000110040000}';
  CLSID_CFormatZ        : TGUID = '{23170F69-40C1-278A-1000-000110050000}';
  CLSID_CFormatLzh      : TGUID = '{23170F69-40C1-278A-1000-000110060000}';
  CLSID_CFormat7z       : TGUID = '{23170F69-40C1-278A-1000-000110070000}';
  CLSID_CFormatCab      : TGUID = '{23170F69-40C1-278A-1000-000110080000}';
  CLSID_CFormatNsis     : TGUID = '{23170F69-40C1-278A-1000-000110090000}';
  CLSID_CFormatLzma     : TGUID = '{23170F69-40C1-278A-1000-0001100A0000}';
  CLSID_CFormatLzma86   : TGUID = '{23170F69-40C1-278A-1000-0001100B0000}';
  CLSID_CFormatXz       : TGUID = '{23170F69-40C1-278A-1000-0001100C0000}';
  CLSID_CFormatPpmd     : TGUID = '{23170F69-40C1-278A-1000-0001100D0000}';
  CLSID_CFormatExt      : TGUID = '{23170F69-40C1-278A-1000-000110C70000}';
  CLSID_CFormatVMDK     : TGUID = '{23170F69-40C1-278A-1000-000110C80000}';
  CLSID_CFormatVDI      : TGUID = '{23170F69-40C1-278A-1000-000110C90000}';
  CLSID_CFormatQcow     : TGUID = '{23170F69-40C1-278A-1000-000110CA0000}';
  CLSID_CFormatGPT      : TGUID = '{23170F69-40C1-278A-1000-000110CB0000}';
  CLSID_CFormatRar5     : TGUID = '{23170F69-40C1-278A-1000-000110CC0000}';
  CLSID_CFormatIHex     : TGUID = '{23170F69-40C1-278A-1000-000110CD0000}';
  CLSID_CFormatHxs      : TGUID = '{23170F69-40C1-278A-1000-000110CE0000}';
  CLSID_CFormatTE       : TGUID = '{23170F69-40C1-278A-1000-000110CF0000}';
  CLSID_CFormatUEFIc    : TGUID = '{23170F69-40C1-278A-1000-000110D00000}';
  CLSID_CFormatUEFIs    : TGUID = '{23170F69-40C1-278A-1000-000110D10000}';
  CLSID_CFormatSquashFS : TGUID = '{23170F69-40C1-278A-1000-000110D20000}';
  CLSID_CFormatCramFS   : TGUID = '{23170F69-40C1-278A-1000-000110D30000}';
  CLSID_CFormatAPM      : TGUID = '{23170F69-40C1-278A-1000-000110D40000}';
  CLSID_CFormatMslz     : TGUID = '{23170F69-40C1-278A-1000-000110D50000}';
  CLSID_CFormatFlv      : TGUID = '{23170F69-40C1-278A-1000-000110D60000}';
  CLSID_CFormatSwf      : TGUID = '{23170F69-40C1-278A-1000-000110D70000}';
  CLSID_CFormatSwfc     : TGUID = '{23170F69-40C1-278A-1000-000110D80000}';
  CLSID_CFormatNtfs     : TGUID = '{23170F69-40C1-278A-1000-000110D90000}';
  CLSID_CFormatFat      : TGUID = '{23170F69-40C1-278A-1000-000110DA0000}';
  CLSID_CFormatMbr      : TGUID = '{23170F69-40C1-278A-1000-000110DB0000}';
  CLSID_CFormatVhd      : TGUID = '{23170F69-40C1-278A-1000-000110DC0000}';
  CLSID_CFormatPe       : TGUID = '{23170F69-40C1-278A-1000-000110DD0000}';
  CLSID_CFormatElf      : TGUID = '{23170F69-40C1-278A-1000-000110DE0000}';
  CLSID_CFormatMacho    : TGUID = '{23170F69-40C1-278A-1000-000110DF0000}';
  CLSID_CFormatUdf      : TGUID = '{23170F69-40C1-278A-1000-000110E00000}';
  CLSID_CFormatXar      : TGUID = '{23170F69-40C1-278A-1000-000110E10000}';
  CLSID_CFormatMub      : TGUID = '{23170F69-40C1-278A-1000-000110E20000}';
  CLSID_CFormatHfs      : TGUID = '{23170F69-40C1-278A-1000-000110E30000}';
  CLSID_CFormatDmg      : TGUID = '{23170F69-40C1-278A-1000-000110E40000}';
  CLSID_CFormatCompound : TGUID = '{23170F69-40C1-278A-1000-000110E50000}';
  CLSID_CFormatWim      : TGUID = '{23170F69-40C1-278A-1000-000110E60000}';
  CLSID_CFormatIso      : TGUID = '{23170F69-40C1-278A-1000-000110E70000}';
  //CLSID_CFormatBkf      : TGUID = '{23170F69-40C1-278A-1000-000110E80000}';  not in 4.57
  CLSID_CFormatChm      : TGUID = '{23170F69-40C1-278A-1000-000110E90000}';
  CLSID_CFormatSplit    : TGUID = '{23170F69-40C1-278A-1000-000110EA0000}';
  CLSID_CFormatRpm      : TGUID = '{23170F69-40C1-278A-1000-000110EB0000}';
  CLSID_CFormatDeb      : TGUID = '{23170F69-40C1-278A-1000-000110EC0000}';
  CLSID_CFormatCpio     : TGUID = '{23170F69-40C1-278A-1000-000110ED0000}';
  CLSID_CFormatTar      : TGUID = '{23170F69-40C1-278A-1000-000110EE0000}';
  CLSID_CFormatGZip     : TGUID = '{23170F69-40C1-278A-1000-000110EF0000}';

// IStream.h
type
  // "23170F69-40C1-278A-0000-000300xx0000"
  ISequentialInStream = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000300010000}']
    procedure Read(Data: Pointer; Size: Cardinal; ProcessedSize: PCardinal); safecall;
    {Out: if size != 0, return_value = S_OK and (*processedSize == 0),
     then there are no more bytes in stream.
     if (size > 0) && there are bytes in stream,
     this function must read at least 1 byte.
     This function is allowed to read less than number of remaining bytes in stream.
     You must call Read function in loop, if you need exact amount of data}
  end;

  ISequentialOutStream = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000300020000}']
    procedure Write(Data: Pointer; Size: Cardinal; ProcessedSize: PCardinal); safecall;
    {if (size > 0) this function must write at least 1 byte.
     This function is allowed to write less than "size".
     You must call Write function in loop, if you need to write exact amount of data}
  end;

  IInStream = interface(ISequentialInStream)
    ['{23170F69-40C1-278A-0000-000300030000}']
    procedure Seek(Offset: Int64; SeekOrigin: Cardinal; NewPosition: PInt64); safecall;
  end;

  IOutStream = interface(ISequentialOutStream)
    ['{23170F69-40C1-278A-0000-000300040000}']
    procedure Seek(Offset: Int64; SeekOrigin: Cardinal; NewPosition: PInt64); safecall;
    procedure SetSize(NewSize: Int64); safecall;
  end;

  IStreamGetSize = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000300060000}']
    procedure GetSize(out Size: Int64); safecall;
  end;

  IOutStreamFlush = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000300070000}']
    procedure Flush; safecall;
  end;

// PropID.h
const
  kpidNoProperty = 0;
  kpidMainSubfile = 1;
  kpidHandlerItemIndex = 2;
  kpidPath = 3;
  kpidName = 4;
  kpidExtension = 5;
  kpidIsFolder = 6 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidIsDir' {$ENDIF} {$ENDIF};
  kpidIsDir = 6;
  kpidSize = 7;
  kpidPackedSize = 8 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidPackSize' {$ENDIF} {$ENDIF};
  kpidPackSize = 8;
  kpidAttributes = 9 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidAttrib' {$ENDIF} {$ENDIF};
  kpidAttrib = 9;
  kpidCreationTime = 10 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidCTime' {$ENDIF} {$ENDIF};
  kpidCTime = 10;
  kpidLastAccessTime = 11 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidATime' {$ENDIF} {$ENDIF};
  kpidATime = 11;
  kpidLastWriteTime = 12 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kpidMTime' {$ENDIF} {$ENDIF};
  kpidMTime = 12;
  kpidSolid = 13;
  kpidCommented = 14;
  kpidEncrypted = 15;
  kpidSplitBefore = 16;
  kpidSplitAfter = 17;
  kpidDictionarySize = 18;
  kpidCRC = 19;
  kpidType = 20;
  kpidIsAnti = 21;
  kpidMethod = 22;
  kpidHostOS = 23;
  kpidFileSystem = 24;
  kpidUser = 25;
  kpidGroup = 26;
  kpidBlock = 27;
  kpidComment = 28;
  kpidPosition = 29;
  kpidPrefix = 30;
  kpidNumSubDirs = 31;
  kpidNumSubFiles = 32;
  kpidUnpackVer = 33;
  kpidVolume = 34;
  kpidIsVolume = 35;
  kpidOffset = 36;
  kpidLinks = 37;
  kpidNumBlocks = 38;
  kpidNumVolumes = 39;
  kpidTimeType = 40;
  kpidBit64 = 41;
  kpidBigEndian = 42;
  kpidCpu = 43;
  kpidPhySize = 44;
  kpidHeadersSize = 45;
  kpidChecksum = 46;
  kpidCharacts = 47;
  kpidVa = 48;
  kpidId = 49;
  kpidShortName = 50;
  kpidCreatorApp = 51;
  kpidSectorSize = 52;
  kpidPosixAttrib = 53;
  kpidLink = 54;

  kpidTotalSize = $1100;
  kpidFreeSpace = $1101;
  kpidClusterSize = $1102;
  kpidVolumeName = $1103;

  kpidLocalName = $1200;
  kpidProvider = $1201;

  kpidUserDefined = $10000;

// HandlerOut.cpp

  kCopyMethodName = WideString('Copy');
  kLZMAMethodName = WideString('LZMA');
  kLZMA2MethodName = WideString('LZMA2');
  kBZip2MethodName = WideString('BZip2');
  kPpmdMethodName = WideString('PPMd');
  kDeflateMethodName = WideString('Deflate');
  kDeflate64MethodName = WideString('Deflate64');

  kAES128MethodName = WideString('AES128');
  kAES192MethodName = WideString('AES192');
  kAES256MethodName = WideString('AES256');
  kZipCryptoMethodName = WideString('ZIPCRYPTO');

// ICoder.h
type
  ICompressProgressInfo = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400040000}']
    procedure SetRatioInfo(InSize: PInt64; OutSize: PInt64); safecall;
  end;

  ICompressCoder = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400050000}']
    procedure Code(InStream: ISequentialInStream; OutStream: ISequentialOutStream;
      InSize, OutSize: PInt64; Progress: ICompressProgressInfo); safecall;
  end;

  PISequentialInStream = ^ISequentialInStream;
  PISequentialOutStream = ^ISequentialOutStream;

  ICompressCoder2 = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400180000}']
    procedure Code(InStreams: PISequentialInStream; InSizes: JclBase.PPInt64; NumInStreams: Cardinal;
      OutStreams: PISequentialOutStream; OutSizes: JclBase.PPInt64; NumOutStreams: Cardinal;
      Progress: ICompressProgressInfo); safecall;
  end;

const
  kDictionarySize = $400;
  kUsedMemorySize = $401;
  kOrder = $402;
  kBlockSize = $403;
  kPosStateBits = $440;
  kLitContextBits = $441;
  kLitPosBits = $442;
  kNumFastBytes = $450;
  kMatchFinder = $451;
  kMatchFinderCycles = $452;
  kNumPasses = $460;
  kAlgorithm = $470;
  kMultiThread = $480;
  kNumThreads = $481;
  kEndMarker = $490;

type
  ICompressSetCoderProperties = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400200000}']
    procedure SetCoderProperties(PropIDs: PPropID; Properties: PPropVariant;
      NumProperties: Cardinal); safecall;
  end;

  ICompressSetDecoderProperties2 = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400220000}']
    procedure SetDecoderProperties2(Data: PByte; Size: Cardinal); safecall;
  end;

  ICompressWriteCoderProperties = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400230000}']
    procedure WriteCoderProperties(OutStream: ISequentialOutStream); safecall;
  end;

  ICompressGetInStreamProcessedSize = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400240000}']
    procedure GetInStreamProcessedSize(out Value: Int64); safecall;
  end;

  ICompressSetCoderMt = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400250000}']
    procedure SetNumberOfThreads(NumThreads: Cardinal); safecall;
  end;

  ICompressGetSubStreamSize = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400300000}']
    procedure GetSubStreamSize(SubStream: Int64; out Value: Int64); safecall;
  end;

  ICompressSetInStream = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400310000}']
    procedure SetInStream(InStream: ISequentialInStream); safecall;
    procedure ReleaseInStream; safecall;
  end;

  ICompressSetOutStream = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400320000}']
    procedure SetOutStream(OutStream: ISequentialOutStream); safecall;
    procedure ReleaseOutStream; safecall;
  end;

  ICompressSetInStreamSize = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400330000}']
    procedure SetInStreamSize(InSize: PInt64); safecall;
  end;

  ICompressSetOutStreamSize = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400340000}']
    procedure SetOutStreamSize(OutSize: PInt64); safecall;
  end;

  ICompressFilter = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400400000}']
    procedure Init; safecall;
    function Filter(Data: PByte; Size: Cardinal): Cardinal; stdcall;
    // Filter return outSize (UInt32)
    // if (outSize <= size): Filter have converted outSize bytes
    // if (outSize > size): Filter have not converted anything.
    //      and it needs at least outSize bytes to convert one block
    //      (it's for crypto block algorithms).
  end;

  ICompressCodecsInfo = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400600000}']
    procedure GetNumberOfMethods(out NumMethods: Cardinal); safecall;
    procedure GetProperty(Index: Cardinal; PropID: TPropID; out Value: TPropVariant); safecall;
    procedure CreateDecoder(Index: Cardinal; IID: PGUID; out Decoder); safecall;
    procedure CreateEncoder(Index: Cardinal; IID: PGUID; out Coder); safecall;
  end;

  ISetCompressCodecsInfo = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400610000}']
    procedure SetCompressCodecsInfo(CompressCodecsInfo: ICompressCodecsInfo); safecall;
  end;

  ICryptoProperties = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400800000}']
    procedure SetKey(Data: PByte; Size: Cardinal); safecall;
    procedure SetInitVector(Data: PByte; Size: Cardinal); safecall;
  end;

  ICryptoSetPassword = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400900000}']
    procedure CryptoSetPassword(Data: PByte; Size: Cardinal); safecall;
  end;

  ICryptoSetCRC = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000400A00000}']
    procedure CryptoSetCRC(crc: Cardinal); safecall;
  end;

const
  kID = 0;
  kName = 1;
  kDecoder = 2;
  kEncoder = 3;
  kInStreams = 4;
  kOutStreams = 5;
  kDescription = 6;
  kDecoderIsAssigned = 7;
  kEncoderIsAssigned = 8;

// IProgress.h
type
  IProgress = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000000050000}']
    procedure SetTotal(Total: Int64); safecall;
    procedure SetCompleted(CompleteValue: PInt64); safecall;
  end;
  
// IArchive.h
const
  // file time type
  kWindows = 0;
  kUnix = 1;
  kDOS = 2;

  // archive
  kArchiveName = 0;
  kClassID = 1;
  kExtension = 2;
  kAddExtension = 3;
  kUpdate = 4;
  kKeepName = 5;
  kStartSignature = 6;
  kFinishSignature = 7;
  kAssociate = 8;

  // ask mode
  kExtract = 0;
  kTest = 1;
  kSkip = 2;

  // operation result
  kOK = 0;
  kUnSupportedMethod = 1;
  kDataError = 2;
  kCRCError = 3;

  kError = 1;

type
  // "23170F69-40C1-278A-0000-000600xx0000"
  IArchiveOpenCallback = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000600100000}']
    procedure SetTotal(Files: PInt64; Bytes: PInt64); safecall;
    procedure SetCompleted(Files: PInt64; Bytes: PInt64); safecall;
  end;

  IArchiveExtractCallback = interface(IProgress)
    ['{23170F69-40C1-278A-0000-000600200000}']
    function GetStream(Index: Cardinal; out OutStream: ISequentialOutStream;
      askExtractMode: Cardinal): HRESULT; stdcall;
    // GetStream OUT: S_OK - OK, S_FALSE - skip this file
    procedure PrepareOperation(askExtractMode: Cardinal); safecall;
    procedure SetOperationResult(resultEOperationResult: Integer); safecall;
  end;

  IArchiveOpenVolumeCallback = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000600300000}']
    procedure GetProperty(PropID: TPropID; out Value: TPropVariant); safecall;
    procedure GetStream(Name: PWideChar; out InStream: IInStream); safecall;
  end;

  IInArchiveGetStream = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000600400000}']
    procedure GetStream(Index: Cardinal; out Stream: ISequentialInStream);
  end;

  IArchiveOpenSetSubArchiveName = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000600500000}']
    procedure SetSubArchiveName(Name: PWideChar); safecall;
  end;

  IInArchive = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000600600000}']
    function Open(Stream: IInStream; MaxCheckStartPosition: PInt64;
       OpenArchiveCallback: IArchiveOpenCallback): HRESULT; stdcall;
    procedure Close; safecall;
    procedure GetNumberOfItems(out NumItems: Cardinal); safecall;
    procedure GetProperty(Index: Cardinal; PropID: TPropID;
      var Value: TPropVariant); safecall;
    procedure Extract(Indices: PCardinal; NumItems: Cardinal;
      TestMode: Integer; ExtractCallback: IArchiveExtractCallback); safecall;
    // indices must be sorted
    // numItems = 0xFFFFFFFF means all files
    // testMode != 0 means "test files operation"
    procedure GetArchiveProperty(PropID: TPropID; out Value: TPropVariant); safecall;

    procedure GetNumberOfProperties(out NumProperties: Cardinal); safecall;
    procedure GetPropertyInfo(Index: Cardinal; out Name: TBStr; out PropID: TPropID;
      out VarType: TVarType); safecall;

    procedure GetNumberOfArchiveProperties(out NumProperties: Cardinal); safecall;
    procedure GetArchivePropertyInfo(Index: Cardinal; out Name: TBStr; out PropID: TPropID;
      out VarType: TVarType); safecall;
  end;

  IArchiveUpdateCallback = interface(IProgress)
    ['{23170F69-40C1-278A-0000-000600800000}']
    procedure GetUpdateItemInfo(Index: Cardinal;
      NewData: PInteger;        // 1 - new data, 0 - old data
      NewProperties: PInteger;  // 1 - new properties, 0 - old properties
      IndexInArchive: PCardinal // -1 if there is no in archive, or if doesn't matter
      ); safecall;
    procedure GetProperty(Index: Cardinal; PropID: TPropID; out Value: TPropVariant); safecall;
    procedure GetStream(Index: Cardinal; out InStream: ISequentialInStream); safecall; //TODO: property
    procedure SetOperationResult(OperationResult: Integer); safecall;
  end;

  IArchiveUpdateCallback2 = interface(IArchiveUpdateCallback)
    ['{23170F69-40C1-278A-0000-000600820000}']
    function GetVolumeSize(Index: Cardinal; out Size: Int64): HRESULT;
    // GetVolumeSize OUT: S_OK - Size is valid, S_FALSE - don't split
    procedure GetVolumeStream(Index: Cardinal; out VolumeStream: ISequentialOutStream); safecall;
  end;

  IOutArchive = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000600A00000}']
    procedure UpdateItems(OutStream: ISequentialOutStream; NumItems: Cardinal;
      UpdateCallback: IArchiveUpdateCallback); safecall;
    procedure GetFileTimeType(out Type_: Cardinal); safecall;
  end;

  ISetProperties = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000600030000}']
    procedure SetProperties(Names: PPWideChar; Values: PPropVariant; NumProperties: Integer); safecall;
  end;

// IPassword.h
type
  ICryptoGetTextPassword = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000500100000}']
    procedure CryptoGetTextPassword(out Password: TBStr); safecall;
  end;

  ICryptoGetTextPassword2 = interface(IUnknown)
    ['{23170F69-40C1-278A-0000-000500110000}']
    procedure CryptoGetTextPassword2(out PasswordIsDefined: LongBool;
      out Password: TBStr); safecall;
  end;

// ZipHandlerOut.cpp
const
  kDeflateAlgoX1 = 0 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kLzAlgoX1' {$ENDIF} {$ENDIF};
  kLzAlgoX1 = 0;
  kDeflateAlgoX5 = 1 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kLzAlgoX5' {$ENDIF} {$ENDIF};
  kLzAlgoX5 = 1;

  kDeflateNumPassesX1  = 1;
  kDeflateNumPassesX7  = 3;
  kDeflateNumPassesX9  = 10;

  kNumFastBytesX1 = 32 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kDeflateNumFastBytesX1' {$ENDIF} {$ENDIF};
  kDeflateNumFastBytesX1 = 32;
  kNumFastBytesX7 = 64 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kDeflateNumFastBytesX7' {$ENDIF} {$ENDIF};
  kDeflateNumFastBytesX7 = 64;
  kNumFastBytesX9 = 128 {$IFDEF SUPPORTS_DEPRECATED} deprecated {$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use kDeflateNumFastBytesX9' {$ENDIF} {$ENDIF};
  kDeflateNumFastBytesX9 = 128;

  kLzmaNumFastBytesX1 = 32;
  kLzmaNumFastBytesX7 = 64;

  kBZip2NumPassesX1 = 1;
  kBZip2NumPassesX7 = 2;
  kBZip2NumPassesX9 = 7;

  kBZip2DicSizeX1 = 100000;
  kBZip2DicSizeX3 = 500000;
  kBZip2DicSizeX5 = 900000;

// HandlerOut.cpp
const
  kLzmaAlgoX1 = 0;
  kLzmaAlgoX5 = 1;

  kLzmaDicSizeX1 = 1 shl 16;
  kLzmaDicSizeX3 = 1 shl 20;
  kLzmaDicSizeX5 = 1 shl 24;
  kLzmaDicSizeX7 = 1 shl 25;
  kLzmaDicSizeX9 = 1 shl 26;

  kLzmaFastBytesX1 = 32;
  kLzmaFastBytesX7 = 64;

  kPpmdMemSizeX1 = (1 shl 22);
  kPpmdMemSizeX5 = (1 shl 24);
  kPpmdMemSizeX7 = (1 shl 26);
  kPpmdMemSizeX9 = (192 shl 20);

  kPpmdOrderX1 = 4;
  kPpmdOrderX5 = 6;
  kPpmdOrderX7 = 16;
  kPpmdOrderX9 = 32;

  kDeflateFastBytesX1 = 32;
  kDeflateFastBytesX7 = 64;
  kDeflateFastBytesX9 = 128;

{$IFDEF 7ZIP_LINKONREQUEST}
type
  TCreateObjectFunc = function (ClsID: PGUID; IID: PGUID; out Obj): HRESULT; stdcall;
  TGetHandlerProperty2 = function (FormatIndex: Cardinal; PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
  TGetHandlerProperty = function (PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
  TGetMethodProperty = function (CodecIndex: Cardinal; PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
  TGetNumberOfFormatsFunc = function (NumFormats: PCardinal): HRESULT; stdcall;
  TGetNumberOfMethodsFunc = function (NumMethods: PCardinal): HRESULT; stdcall;
  TSetLargePageMode = function: HRESULT; stdcall;

var
  CreateObject: TCreateObjectFunc = nil;
  GetHandlerProperty2: TGetHandlerProperty2 = nil;
  GetHandlerProperty: TGetHandlerProperty = nil;
  GetMethodProperty: TGetMethodProperty = nil;
  GetNumberOfFormats: TGetNumberOfFormatsFunc = nil;
  GetNumberOfMethods: TGetNumberOfMethodsFunc = nil;
  SetLargePageMode: TSetLargePageMode = nil;
{$ELSE ~7ZIP_LINKONREQUEST}
function CreateObject(ClsID: PGUID; IID: PGUID; out Obj): HRESULT; stdcall;
function GetHandlerProperty2(FormatIndex: Cardinal; PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
function GetHandlerProperty(PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
function GetMethodProperty(CodecIndex: Cardinal; PropID: TPropID; out Value: TPropVariant): HRESULT; stdcall;
function GetNumberOfFormats(NumFormats: PCardinal): HRESULT; stdcall;
function GetNumberOfMethods(NumMethods: PCardinal): HRESULT; stdcall;
function SetLargePageMode: HRESULT; stdcall;
{$ENDIF ~7ZIP_LINKONREQUEST}

//DOM-IGNORE-END

const
  SevenzipDefaultLibraryName = '7z.dll';
  CreateObjectDefaultExportName = 'CreateObject';
  GetHandlerProperty2DefaultExportName = 'GetHandlerProperty2';
  GetHandlerPropertyDefaultExportName = 'GetHandlerProperty';
  GetMethodPropertyDefaultExportName = 'GetMethodProperty';
  GetNumberOfFormatsDefaultExportName = 'GetNumberOfFormats';
  GetNumberOfMethodsDefaultExportName = 'GetNumberOfMethods';
  SetLargePageModeDefaultExportName = 'SetLargePageMode';

{$IFDEF 7ZIP_LINKONREQUEST}
var
  SevenzipLibraryName: string = SevenzipDefaultLibraryName;
  CreateObjectExportName: string = CreateObjectDefaultExportName;
  GetHandlerProperty2ExportName: string = GetHandlerProperty2DefaultExportName;
  GetHandlerPropertyExportName: string = GetHandlerPropertyDefaultExportName;
  GetMethodPropertyExportName: string = GetMethodPropertyDefaultExportName;
  GetNumberOfFormatsExportName: string = GetNumberOfFormatsDefaultExportName;
  GetNumberOfMethodsExportName: string = GetNumberOfMethodsDefaultExportName;
  SetLargePageModeExportName: string = SetLargePageModeDefaultExportName;
  SevenzipLibraryHandle: TModuleHandle = INVALID_MODULEHANDLE_VALUE;
{$ENDIF 7ZIP_LINKONREQUEST}

function Load7Zip: Boolean;
function Is7ZipLoaded: Boolean;
procedure Unload7Zip;

{$IFDEF UNITVERSIONING}
const
  UnitVersioning: TUnitVersionInfo = (
    RCSfile: '$URL$';
    Revision: '$Revision$';
    Date: '$Date$';
    LogPath: 'JCL\source\windows';
    Extra: '';
    Data: nil
    );
{$ENDIF UNITVERSIONING}

implementation

{$IFDEF 7ZIP_LINKDLL}
function CreateObject; external SevenzipDefaultLibraryName name CreateObjectDefaultExportName;
function GetHandlerProperty2; external SevenzipDefaultLibraryName name GetHandlerProperty2DefaultExportName;
function GetHandlerProperty; external SevenzipDefaultLibraryName name GetHandlerPropertyDefaultExportName;
function GetMethodProperty; external SevenzipDefaultLibraryName name GetMethodPropertyDefaultExportName;
function GetNumberOfFormats; external SevenzipDefaultLibraryName name GetNumberOfFormatsDefaultExportName;
function GetNumberOfMethods; external SevenzipDefaultLibraryName name GetNumberOfMethodsDefaultExportName;
function SetLargePageMode; external SevenzipDefaultLibraryName name SetLargePageModeDefaultExportName;
{$ENDIF 7ZIP_LINKDLL}

function Load7Zip: Boolean;
{$IFDEF 7ZIP_LINKONREQUEST}
begin
  Result := SevenzipLibraryHandle <> INVALID_MODULEHANDLE_VALUE;
  if Result then
    Exit;

  Result := JclSysUtils.LoadModule(SevenzipLibraryHandle, SevenzipLibraryName);
  if Result then
  begin
    @CreateObject := GetModuleSymbol(SevenzipLibraryHandle, CreateObjectExportName);
    @GetHandlerProperty2 := GetModuleSymbol(SevenzipLibraryHandle, GetHandlerProperty2ExportName);
    @GetHandlerProperty := GetModuleSymbol(SevenzipLibraryHandle, GetHandlerPropertyExportName);
    @GetMethodProperty := GetModuleSymbol(SevenzipLibraryHandle, GetMethodPropertyExportName);
    @GetNumberOfFormats := GetModuleSymbol(SevenzipLibraryHandle, GetNumberOfFormatsExportName);
    @GetNumberOfMethods := GetModuleSymbol(SevenzipLibraryHandle, GetNumberOfMethodsExportName);
    @SetLargePageMode := GetModuleSymbol(SevenzipLibraryHandle, SetLargePageModeExportName);
    Result := Assigned(@CreateObject) and Assigned(@GetHandlerProperty2) and
      Assigned(@GetHandlerProperty) and Assigned(@GetMethodProperty) and
      Assigned(@GetNumberOfFormats) and Assigned(@GetNumberOfMethods) and
      Assigned(@SetLargePageMode);
  end;
end;
{$ELSE ~7ZIP_LINKONREQUEST}
begin
  Result := True;
end;
{$ENDIF ~7ZIP_LINKONREQUEST}

function Is7ZipLoaded: Boolean;
begin
  {$IFDEF 7ZIP_LINKONREQUEST}
  Result := SevenzipLibraryHandle <> INVALID_MODULEHANDLE_VALUE;
  {$ELSE ~7ZIP_LINKONREQUEST}
  Result := True;
  {$ENDIF ~7ZIP_LINKONREQUEST}
end;

procedure Unload7Zip;
begin
  {$IFDEF 7ZIP_LINKONREQUEST}
  @CreateObject := nil;
  @GetHandlerProperty2 := nil;
  @GetHandlerProperty := nil;
  @GetMethodProperty := nil;
  @GetNumberOfFormats := nil;
  @GetNumberOfMethods := nil;
  @SetLargePageMode := nil;
  JclSysUtils.UnloadModule(SevenzipLibraryHandle);
  {$ENDIF 7ZIP_LINKONREQUEST}
end;

{$IFDEF UNITVERSIONING}
initialization
  RegisterUnitVersion(HInstance, UnitVersioning);

finalization
  UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}

end.


И один из соответсвующий ему h-файлов (IStream.h): https://github.com/kornelski/7z/blob/master/CPP/7zip/IStream.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
// IStream.h

#ifndef __ISTREAM_H
#define __ISTREAM_H

#include "../Common/MyTypes.h"
#include "../Common/MyWindows.h"

#include "IDecl.h"

#define STREAM_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 3, x)
#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x)

STREAM_INTERFACE(ISequentialInStream, 0x01)
{
  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE;
  
  /*
  The requirement for caller: (processedSize != NULL).
  The callee can allow (processedSize == NULL) for compatibility reasons.
    
  if (size == 0), this function returns S_OK and (*processedSize) is set to 0.
  if (size != 0)
  {
    Partial read is allowed: (*processedSize <= avail_size && *processedSize <= size),
      where (avail_size) is the size of remaining bytes in stream.
    If (avail_size != 0), this function must read at least 1 byte: (*processedSize > 0).
    You must call Read() in loop, if you need to read exact amount of data.
  }
  If seek pointer before Read() call was changed to position past the end of stream:
    if (seek_pointer >= stream_size), this function returns S_OK and (*processedSize) is set to 0.
  
  ERROR CASES:
    If the function returns error code, then (*processedSize) is size of
    data written to (data) buffer (it can be data before error or data with errors).
    The recommended way for callee to work with reading errors:
      1) write part of data before error to (data) buffer and return S_OK.
      2) return error code for further calls of Read().
  */
};

STREAM_INTERFACE(ISequentialOutStream, 0x02)
{
  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE;
  
  /*
  The requirement for caller: (processedSize != NULL).
  The callee can allow (processedSize == NULL) for compatibility reasons.
  if (size != 0)
  {
    Partial write is allowed: (*processedSize <= size),
    but this function must write at least 1 byte: (*processedSize > 0).
    You must call Write() in loop, if you need to write exact amount of data.
  }
  ERROR CASES:
    If the function returns error code, then (*processedSize) is size of
    data written from (data) buffer.
  */
};

#ifdef __HRESULT_FROM_WIN32
#define HRESULT_WIN32_ERROR_NEGATIVE_SEEK __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK)
#else
#define HRESULT_WIN32_ERROR_NEGATIVE_SEEK   HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK)
#endif

/*  Seek() Function
  If you seek before the beginning of the stream, Seek() function returns error code:
      Recommended error code is __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK).
      or STG_E_INVALIDFUNCTION
      
  It is allowed to seek past the end of the stream.
  if Seek() returns error, then the value of *newPosition is undefined.
*/

STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03)
{
  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
};

STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04)
{
  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
  STDMETHOD(SetSize)(UInt64 newSize) PURE;
};

STREAM_INTERFACE(IStreamGetSize, 0x06)
{
  STDMETHOD(GetSize)(UInt64 *size) PURE;
};

STREAM_INTERFACE(IOutStreamFinish, 0x07)
{
  STDMETHOD(OutStreamFinish)() PURE;
};


STREAM_INTERFACE(IStreamGetProps, 0x08)
{
  STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib) PURE;
};

struct CStreamFileProps
{
  UInt64 Size;
  UInt64 VolID;
  UInt64 FileID_Low;
  UInt64 FileID_High;
  UInt32 NumLinks;
  UInt32 Attrib;
  FILETIME CTime;
  FILETIME ATime;
  FILETIME MTime;
};

STREAM_INTERFACE(IStreamGetProps2, 0x09)
{
  STDMETHOD(GetProps2)(CStreamFileProps *props) PURE;
};

#endif


Никаких com-интерфейсов.
Только под FPC распаковка почему-то не работает. Не разобрался пока почему. А в Delphi работает.
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39627038
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа что останется от COM, если из него убрать IUnknown?

Именно то, что из него делает Common Object Model : двоичная раскладка VMT.

Ariochв любом случае, interface в Object Pascal - это именно iUnknown

Опять же RTFM Corba Interfaces в FPC.

В Дельфи да, это очень жёстко IUnknown. И в своё время я таки говорил, "ну так давайте и
сделаем IUnknown, зато получим прямую совместимость со всем, включая 1С", на что мне как
раз и отвечали "подсчёт ссылок это медленно", а потом внезапно засунули подсчёт не просто
ссылок, а вызовов в каждую функцию каждого объекта. И уже я говорил "да вы что, это же
тормозит", а мне отвечали "да фигня, там всего пара ассемблерных команд". Ну а когда на
сцену вышел клоп с его обёртками и вовсе пошёл сюр.

PS: Что-то я как Дед мемуарами начал растекаться по древу, надо завязывать, пусть и пятница.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39627039
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovа потом внезапно засунули подсчёт не просто
ссылок, а вызовов в каждую функцию каждого объектаВыпей водички холодной
...
Рейтинг: 0 / 0
Под какой лицензией firebird.pas?
    #39627056
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovPS: Что-то я как Дед мемуарами начал растекаться по древу, надо завязывать, пусть и пятница.


Пенсионное сначала предъяви, а потом растекайся
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Под какой лицензией firebird.pas?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]