![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день.
Код длл: Код:
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. Если первый вариант не возможен, как сделать эту процедуру мультипоточной, что бы строковая переменная одного потока не "затиралась" другим потоком? |