![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. Если первый вариант не возможен, как сделать эту процедуру мультипоточной, что бы строковая переменная одного потока не "затиралась" другим потоком? |
|
#2
|
|||
|
|||
|
А в чём смысл такого кода?
Код:
DLL_PROCESS_ATTACH: // DLL присоединена к процессу;
// выделение памяти
Buffer:=AllocMem(255);
//decision:=DoThings;
DLL_PROCESS_DETACH: // DLL отсоединена от процесса;
// освобождение памяти
FreeMem(Buffer); например 1-й поток выполнил Buffer:=AllocMem(255); - всё нормально 2-й поток выполнил Buffer:=AllocMem(255); - будет затёрто предыдущее значение Buffer и утечка памяти. И оба потока будут параллельно использовать этот буфер с непредсказуемым результатом. 1-й поток выполнил FreeMem(Buffer); при этом унитожится массив, но ссылка на него останется в переменной Buffer, и второй поток будет пользоваться этой битой ссылкой. Для начала попробуйте описать так Код:
threadvar Buffer: PWideChar; threadvar decision: integer; |
| Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
одинадцатый (12.08.2013)
| ||
|
#3
|
||||
|
||||
|
DLL_PROCESS_ATTACH != DLL_THREAD_ATTACH && DLL_PROCESS_DETACH != DLL_THREAD_DETACH
|
|
#4
|
|||
|
|||
|
Спасибо большое за ответ.
Buffer - это вообще атавизм, она не используется. И decision не используется. Но сама идея объявления через threadvar - наверно то что мне нужно. Только имеет смысл объявлять так переменную tStr. Т.к. именно она страдает. Но она локальная. Так имеет ли смысл? ) И так как тут используется поточность не надо ли мне как-то указать что эта DLL многопоточная? |
|
#5
|
|||
|
|||
|
И можно ли все таки сделать глобальную переменную в DLL на все потоки, что бы один раз посчитать значение этой функции?
И не надо будет разбираться с памятью... |
|
#6
|
||||
|
||||
|
а нужна ли вообще dll?
|
|
#7
|
|||
|
|||
|
Цитата:
Ну так и вызывай один раз. А как определяешь, что Цитата:
|
|
#8
|
|||
|
|||
|
DLL очень нужна! )
Определяю что ошибка там через MessageBox ) |