Общие данных в динамической библиотеке
Добавлено: 01.10.2020 11:54:17
Хотел с помощью библиотеки реализовать доступ нескольких приложений к одной плате, доступ к которой открывается в монопольном режиме, но у меня каждое приложение похоже создаёт свою копию. Упрощенно, задачу можно свести к передаче переменной
Библиотека
Код программы:
Если запустить несколько экземпляром программы, то все они начнут отсчет от 0. А хотелось бы чтобы счет был общий для всех. Как это сделать? Тестировал только на linux
Библиотека
- Код: Выделить всё
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