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

Вниз

Как передать строку из пакета основному приложению?   Найти похожие ветки 

 
AlexanderSK   (2004-03-11 13:33) [0]

Есть приложение, есть пакет. Приложение загружает этот пакет, получает алрес функции Х из этого пакета и вызывает ее. Подскажите, пожалуйста, как из функции Х вернуть или передать строку в главное приложение?

Заранее спасибо!


 
Юрий Зотов ©   (2004-03-11 14:07) [1]

Как обычно - через результат или var-параметр. Какие проблемы?


 
AlexanderSK   (2004-03-11 14:22) [2]

В пакете есть следующая функция:

function GetStr: String; stdcall;
begin
 Result := "TEXT";
end;

В основном приложении такой вот код:

 fPack := LoadPackage(.....);
 @F := GetProcAddress(fPack, "GetStr");
 if @ErrMes <> nil then S := F; - возникает есключение "access violation"

Подскажите, с чем это может быть связано?


 
Юрий Зотов ©   (2004-03-11 14:31) [3]

1. Зачем stdcall ?
2. Как объявлена переменная F в EXE ?
3. Посмотрите BPL любым просморщиком PE-файлов. Совпадает ли экспортируемое имя функции GetStr с ее внутренним именем? Имеется в виду - нет ли там на самом деле чего-нибудь вроде такого: @имя_модуля@GetStr$qqrv


 
KSergey ©   (2004-03-11 14:42) [4]

>  [2] AlexanderSK   (11.03.04 14:22)
>  if @ErrMes <> nil then S := F; - возникает есключение "access
> violation"

Конечно, ЮЗ правее в идейном смысле ;), но может проверочку иначе организовать?

if @F <> nil then S := F;


 
AlexanderSK   (2004-03-11 14:46) [5]

>KSergey ©  (11.03.04 14:42) [4]
На самом деле в коде все правильно проверяется! Там вместо F везде - ErrMes!


 
AlexanderSK   (2004-03-11 14:49) [6]

>Юрий Зотов ©  (11.03.04 14:31) [3]
1. а как правильнее? без stdcall? изачем он вообще нужен?
2. вот так вот:
type
 TGetStr = function: String;
var
 F: TGetStr;
3.Скорее всего совпадает потому что другие функции (не возвращающие строк) из этого пакета работают.


 
KSergey ©   (2004-03-11 14:57) [7]

А почему в пакете

function GetStr: String; stdcall;

а в программе

TGetStr = function: String;

???


 
AlexanderSK   (2004-03-11 15:12) [8]

>KSergey ©  (11.03.04 14:57) [7]
Т.е.? в каком смысле почему?
что конкретно не так?


 
AlexanderSK   (2004-03-11 15:19) [9]

>Юрий Зотов ©  (11.03.04 14:31) [3]
Убрал stdcall все заработало!
А чем собственно он мешал?


 
panov ©   (2004-03-11 15:47) [10]

AlexanderSK   (11.03.04 15:19) [9]

stdcall не просто для красоты пишется. Это соглашение о способе передачи параметров при вызове функции.


 
AlexanderSK   (2004-03-11 16:07) [11]

>panov ©  (11.03.04 15:47) [10]
Плнимаю, что не для красоты, понимаю, что соглашение о способе передачи параметров.

Одного не понимаю почему в примерах "Вудзрш 6" - С.Тейксейра К.Пачеко везде написано stdcall и от чего зависит когда надо писать stdcall, а когда не надо? Думал что всегда когда есть экспорт, он видимо ошибся. Так когда же все таки нужно применять stdcall? а когда нет?


 
AlexanderSK   (2004-03-11 16:08) [12]

прошу прощения - "Одного не понимаю почему в примерах "Delphi 6" -
С.Тейксейра К.Пачеко"


 
evvcom   (2004-03-11 16:18) [13]

Соглашение о вызовах - это то, как передаются параметры в функцию/процедуру. Если используется "обычное" для Дельфи декларирование, т.е. без stdcall, safecall, cdecl, то принимается соглашение fastcall, т.е. передача до 3-х параметров через регистры, остальные через стек, для остальных вышеупомянутых соглашений все параметры передаются через стек, поэтому, когда делается возврат из функции указатель стека увеличивается на количество параметров двойных слов. Соответственно (рано или поздно) возврат осуществляется не туда, откуда был вызов, могут прочитаться не те значения в регистры, которые были сохранены и прочие глюки.


 
Юрий Зотов ©   (2004-03-11 16:27) [14]

> AlexanderSK   (11.03.04 16:08) [12]

Проще говоря, если в пакете функция имеет (или НЕ имеет) stdcall, то и в EXE она тоже обязана иметь (или НЕ иметь) stdcall. А у Вас было не так - в пакете функция была объявлена С stdcall, а в EXE переменная F была описана БЕЗ stdcall. И получилось рассогласование соглашений о вызове.


 
Amoeba ©   (2004-03-11 16:47) [15]

В пакетах использование stdcall вместо принятого по умолчению fastcall абсолютно бессмысленно. Это же не обычная DLL, которая может использоваться приложениями, написанными на других языках программирования.


 
AlexanderSK   (2004-03-11 17:00) [16]

Всем огромное СПАСИБО! Разобрался!



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
14-1077793338
Vik_Mix
2004-02-26 14:02
2004.03.28
Где скачать эмулятор К580


1-1078830187
Katt
2004-03-09 14:03
2004.03.28
dll


8-1069108895
Morg
2003-11-18 01:41
2004.03.28
как показать image во весь экран


3-1077708878
Vlad40
2004-02-25 14:34
2004.03.28
Не могу поймать EDatabaseError


11-1057079896
mox
2003-07-01 21:18
2004.03.28
Timer