Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.036 c
3-1077394738
Yermek
2004-02-21 23:18
2004.03.28
Чтение из BLOB поля Paradox a


7-1073569477
Яша
2004-01-08 16:44
2004.03.28
чтение файла по секторам


3-1077005842
Igor_P
2004-02-17 11:17
2004.03.28
Отказ от Paradox


1-1078775266
xobbit
2004-03-08 22:47
2004.03.28
Окно в качестве фона


3-1077192498
sherminator
2004-02-19 15:08
2004.03.28
множественный поиск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский