Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вроде ничего сложного, а ошибка вылетает :(


Новенький в Делфи ©   (2002-07-03 20:37:00) 

Всё просто, подгружаю dll-ку, запускаю процедуру от туда, процедура делает своё дело, и через пол минуты мне вылетает ошибка, что программа выполнела не допустимую операцию, обратитесь к разроботчику :(

вот unit, к стати ... на всякий случай добавлю, что запускаю процедуру из unit2.

procedure Proccess(s: string);
var i:integer;
Executing: procedure (par:pChar);
begin
for i:=0 to high(unit1.com) do
if s=Unit1.Com[i].ComKeys then
begin
@Executing:=nil;
@Executing:= GetProcAddress(HandCom,"pShowMessage");
Executing("-");
exit;
end;
end;

вот DLL-ка


procedure pShowMessage(par: pChar);stdcall;
begin
MessageBox(0,"1","1",0);
end;

exports pShowMessage;


Новенький в Делфи   (2002-07-04 11:35:00) [1]

%)))) Баааальоше пасибо! :)
работает всё


Fellomena   (2002-07-04 11:23:00) [2]

2 Виктор Щербаков © (04.07.02 11:18):
8)
Вот уж воистину, в чужом глазу соринку ищем, а в своём бревно не замечаем :)



Alx2   (2002-07-04 11:22:00) [3]

>Виктор Щербаков © (04.07.02 11:18)
Слоны, которых не сразу видно :))


Виктор Щербаков   (2002-07-04 11:18:00) [4]

procedure Proccess(s: string);
var i:integer;
Executing: procedure (par:pChar); stdcall;
begin
for i:=0 to high(unit1.com) do
if s=Unit1.Com[i].ComKeys then
begin
@Executing:=nil;
@Executing:= GetProcAddress(HandCom,"pShowMessage");
Executing("-");
exit;
end;
end;


Alx2   (2002-07-04 11:16:00) [5]

Убедился. Не использует :( Просто подставляет константные адреса, что и следовало ожидать.

Можно еще попробовать выкинуть Executing и погонять на предмет ошибки. Может, и не в DLL дело...


Alx2   (2002-07-04 11:12:00) [6]

>Fellomena (04.07.02 11:00)

Привет!

>Единственное, может нам приведён не полный код dll
>и там есть ф-ии, которые используют string...

Сказал в расчете на это. Хотя, бог его знает :)
Вызов MessageBox(0,"1","1",0) может неявно использовать строки при подготовке параметров. Но надо убедиться.


Fellomena   (2002-07-04 11:00:00) [7]

2 Alx2 © (04.07.02 10:53):
Привет!
А где ты тут увидел необходимость в sharemem?
Я думаю, если сделать Executing(PChar("-")); то ничего не изменится.
Единственное, может нам приведён не полный код dll и там есть ф-ии, которые используют string...


Alx2   (2002-07-04 10:53:00) [8]

sharemem используем?


Fellomena   (2002-07-04 10:36:00) [9]

Что-то не поняла... Зачем в
procedure pShowMessage
передаёшь что-то, если выводишь:
MessageBox(0,"1","1",0);
... ну да это детали

>> процедура делает своё дело, и через пол минуты мне вылетает ошибка, что программа выполнела не допустимую операцию, обратитесь к разроботчику

Где в программе FreeLibrary? Возможно в главной программе происходит повторный вызов процедуры procedure Proccess(s: string); и возможно, отсюда и ошибка.


Игорь Шевченко   (2002-07-04 10:23:00) [10]

Отладчик, естественно, позабыт-позаброшен ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо