Показать сообщение отдельно
  #1  
Старый 12.08.2013, 08:41
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию Работа со строками в DLL

Добрый день.

Код длл:

Код:
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. Если первый вариант не возможен, как сделать эту процедуру мультипоточной, что бы строковая переменная одного потока не "затиралась" другим потоком?
Ответить с цитированием