Форум: "Основная";
Текущий архив: 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