Библиотека
- Код: Выделить всё
- library DynLibProject;
 {$mode objfpc}{$H+}
 uses
 Classes
 { you can add units after this };
 var
 I:Integer;
 CriticalSection:TRTLCriticalSection;
 function Value:Integer;
 begin
 Result:=I;
 end;
 Procedure SetValue(_NewValue:Integer);
 begin
 EnterCriticalsection(CriticalSection);
 I:=_NewValue;
 WriteLn('SetValue. Addr=', PtrUInt(@i), ' Value=', i);
 LeaveCriticalsection(CriticalSection);
 end;
 exports Value, SetValue;
 initialization
 begin
 InitCriticalSection(CriticalSection{%H-});
 WriteLn('Init. Addr=', PtrUInt(@i), ' Value=', i);
 end;
 finalization
 begin
 DoneCriticalsection(CriticalSection);
 end;
 end.
Код программы:
- Код: Выделить всё
- program Connect;
 uses dynlibs, sysutils;
 type
 TValue=function:Integer;
 TSetValue=procedure(_NewValue:Integer);
 var
 LibHndl:TLibHandle;
 Value:TValue;
 SetValue:TSetValue;
 i:Integer;
 begin
 LibHndl:=SafeLoadLibrary('./libdynlibproject.so');
 if LibHndl>0 then
 begin
 Value:=TValue(GetProcedureAddress(LibHndl, 'Value'));
 SetValue:=TSetValue(GetProcedureAddress(LibHndl, 'SetValue'));
 end;
 if Assigned(Value) and Assigned(SetValue) then
 begin
 while True do
 begin
 i:=Value();
 WriteLn(i);
 Inc(i);
 SetValue(i);
 Sleep(500);
 end;
 end;
 end.
Если запустить несколько экземпляром программы, то все они начнут отсчет от 0. А хотелось бы чтобы счет был общий для всех. Как это сделать? Тестировал только на linux



