Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:41.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025