Главная страница
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.025 c
3-1093254733
Kraj
2004-08-23 13:52
2004.09.26
jpg в базу данных


1-1094620803
StarCon
2004-09-08 09:20
2004.09.26
порядковый номер строки в дб гриде


1-1094122110
DreadAngel
2004-09-02 14:48
2004.09.26
HTML.links+DELPHI


4-1092832619
lightix
2004-08-18 16:36
2004.09.26
Получить имя пользователя Win2k


14-1094326705
Knight
2004-09-04 23:38
2004.09.26
Есть функция для перекодировки русской темы письма...