![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение значения локальных переменных извне [D6, WinXP]
Ajax © (2004-09-09 21:15:00)Все, товарищи, я сдаюсь. Прошу помощи. Ситуация следующая. Есть процедура, в которой объявлена некоторая переменная (integer). В теле процедуры есть вызов некой функции. Так вот, после возврата в нашу процедуру, меняется значение локальной переменной, хотя ни присваивания, ни передачи в виде var параметра нет... Я понимаю, что "код в студию" и "ошибка в 17 строке", но все же если есть какие-то мысли, а то код долго приводить к виду, когда не будет ничего лишнего.
Ajax (2004-09-11 00:03:00) [1]>PS: Код более чем странный. Как вы прокоментируете это:
>Procedure Script(const Command, Params : string);
>if Script(Input.Actions[x].Command,Input.Actions[x].Param) then
Да, неудобно получилось... Сей казус закрался при адаптировании кода для засылки сюда. Естественно это следует читать как Function.
Все. Проблема решена.
type
TPluginProc = procedure (Param:pchar); stdcall;
В библиотеке же процедуры без stdcall
Всем спасибо!
Defunct (2004-09-10 22:57:00) [2]Карта стека на момент входа в функцию Script:
....
00000000 - x (integer)
???????? - Result (результат функции Script)
???????? - Input.Actions[x].Command (Pointer)
???????? - Input.Actions[x].Param (Pointer)
???????? - IP (Адрес возврата)
Вершина стека
Как видите не так уж и трудно промазать и перетереть значение пременной X. Протрассируйте функцию Script с открытым CPU Windows и найдите, что именно промазывает и затирает переменную X в стеке.
PS: Код более чем странный. Как вы прокоментируете это:
Procedure Script(const Command, Params : string);
if Script (Input.Actions[x].Command,Input.Actions[x].Param) then
DiamondShark (2004-09-10 22:45:00) [3]Проверить соглашения вызовов TPluginProc и процедуры в библиотеке.
Ajax (2004-09-10 22:23:00) [4]Код примерно такой:
TAction = record
Command : string;
Param : string;
...
end;
TSomeComplexType = record
Name : string;
...
Actions : array of TAction;
end;
Procedure Script(const Command, Params : string);
var
Lib : THandle;
PlugProc : TPluginProc;
i : integer;
DllName : string;
begin
DllName:=SearchForDllName(Command);
if DllName<>'' then
begin
Lib := LoadLibrary(pchar(DllName));
if Lib>0 then
begin
@PlugProc := GetProcAddress(Lib,pchar(Command));
if @PlugProc <> nil then
PlugProc(pchar(Params))
else
ShowMessage('Procedure entry point is not found');
end
else
ShowMessage('Can not load DLL');
FreeLibrary(Lib);
end
else
ShowMessage('Not found script');
end;
Procedure Execute(const Input : TSomeComplexType);
var
x : integer;
...
begin
...
x:=0;
while x<length(Input.Actions) do
begin
//Значение x пока еще ноль
if Script(Input.Actions[x].Command,Input.Actions[x].Param) then
DoSomeThing;
//А здесь уже черте что, независимо от выполнения или нет DoSomeThing
inc(x);
end;
...
end;
Как можно понять, код - часть системы загрузки плагинов.
Rouse_ (2004-09-09 21:36:00) [5]По любому придется код приводить...
Хотя есть один вариант (если читать "передачи в виде var параметра нет" как "есть передача в виде параметра" :)
var
I: Integer;
begin
SomeFunc(@I);
если так, то может и поменяться...
wl (2004-09-09 21:27:00) [6]похоже на то, что чем-то портится стек
wl (2004-09-09 21:26:00) [7]напиши новый, покороче