Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизИзменение значения локальных переменных извне Найти похожие ветки
← →
Ajax © (2004-09-09 21:15) [0]Все, товарищи, я сдаюсь. Прошу помощи. Ситуация следующая. Есть процедура, в которой объявлена некоторая переменная (integer). В теле процедуры есть вызов некой функции. Так вот, после возврата в нашу процедуру, меняется значение локальной переменной, хотя ни присваивания, ни передачи в виде var параметра нет... Я понимаю, что "код в студию" и "ошибка в 17 строке", но все же если есть какие-то мысли, а то код долго приводить к виду, когда не будет ничего лишнего.
← →
wl (2004-09-09 21:26) [1]напиши новый, покороче
← →
wl (2004-09-09 21:27) [2]похоже на то, что чем-то портится стек
← →
Rouse_ © (2004-09-09 21:36) [3]По любому придется код приводить...
Хотя есть один вариант (если читать "передачи в виде var параметра нет" как "есть передача в виде параметра" :)
var
I: Integer;
begin
SomeFunc(@I);
если так, то может и поменяться...
← →
Ajax © (2004-09-10 22:23) [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;
Как можно понять, код - часть системы загрузки плагинов.
← →
DiamondShark © (2004-09-10 22:45) [5]Проверить соглашения вызовов TPluginProc и процедуры в библиотеке.
← →
Defunct © (2004-09-10 22:57) [6]Карта стека на момент входа в функцию 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
← →
Ajax © (2004-09-11 00:03) [7]>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
Всем спасибо!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.056 c