Добрый день.
Код длл:
Код:
library MYDLL;
uses
SysUtils, Registry,
Windows;
var Buffer: PWideChar;
decision: integer;
function DoThings: integer;
var
MemoryStatus : TMemoryStatus;
SysInfo: TSystemInfo;
i, sdviger, sdvig, ggd, ssum, tRes:integer;
reg: TRegistry;
mas, mas2, key, tStr, s: WideString;
begin
sdviger:=2;
sdvig:=3;
mas:= '22222rrrrrllllldddddkkkkcccccoooooqqqqqpppppbbbbbjjjjjmmmmmaaa';
mas2:='nnnnnmmmmmsssspppppqqqqqkkkkkgggggglllllbbbbbxxxxxyyyyyaaaaann';
key:='';
try
reg:=tregistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey('\hardware\description\system',true);
key:=reg.readString('SystemBiosdate');
reg.Free;
except
on exception do sdvig:=sdvig;
end;
//if key<>'02/04/10' then MessageBox(0,PWideChar(key+' 02/04/10'), 'terminal', MB_OK);
MemoryStatus.dwLength := SizeOf(MemoryStatus);
GlobalMemoryStatus(MemoryStatus);
With MemoryStatus do
Begin
dwTotalPhys := dwTotalPhys DIV 1024;
ssum:=dwTotalPhys;
tStr:=IntToStr(dwTotalPhys)+key;
End;
//вот здесь tStr принимает чужие значения
.
.
.
end;
function MainFunc: integer; stdcall;
begin
result:=DoThings;
end;
//----------------------------------------------------------+
exports
GetStringBuffer, BenefitEAFunc;
procedure DLLEntryPoint(dwReason: DWord); // обработчик событий
begin
case dwReason of
DLL_PROCESS_ATTACH: // DLL присоединена к процессу;
// выделение памяти
Buffer:=AllocMem(255);
//decision:=DoThings;
DLL_PROCESS_DETACH: // DLL отсоединена от процесса;
// освобождение памяти
FreeMem(Buffer);
end;
end;
begin
IsMultiThread := True;
DllProc := @DLLEntryPoint; //Назначение процедуры обработки событий
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Эта библиотека используется в разных потоках одной программы. Из этих потоков вызывается одна и та же ф-я библиотека, которая всегда для любого потока возвращает одно и то же значение.
Но в коде, в месте которое я пометил комментарием "вот здесь tStr принимает чужие значения" иногда эта строка принимает посторонние значения. При чем не значение этой переменной соседнего потока.
Подскажите пожалуйста решение.
1. Как сделать глобальную переменную в DLL что бы запускать эту функцию всего лишь раз для всех потоков?
2. Если первый вариант не возможен, как сделать эту процедуру мультипоточной, что бы строковая переменная одного потока не "затиралась" другим потоком?