Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Изменение значения локальных переменных извне   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
4-1092538906
nika_ufc
2004-08-15 07:01
2004.09.26
извлечение информаций из фонта


14-1093937222
Knight
2004-08-31 11:27
2004.09.26
Вопрос к знатокам Корл...


3-1093420285
andrey__
2004-08-25 11:51
2004.09.26
TADOQuery редактир. уже изменённой записи!


4-1092898162
Sergiant
2004-08-19 10:49
2004.09.26
Обои


3-1094021617
NewDelpher
2004-09-01 10:53
2004.09.26
Используемые объекты