Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизПараметр в библиотечной процедуре... Найти похожие ветки
← →
olookin (2003-07-11 23:31) [0]Мой вопрос таков - можно ли передавать в библиотечную процедуру параметр как var? И если да - то как это делается? А то у меня ошибка возникает.
Пример вызова подобной процедуры следующий:
//in dll
procedure MyProc(var s: string); register;
begin
s:="DLL";
end;
//in application
procedure MyProc(var s: string); external "mylib.dll"; register;
//пример вызова (сокращено немного)
procedure ButtonClick();
var s: string;
begin
MyProc(s);
//в отладчике s="DLL" - т.е. как и надо
showmessage(s); //здесь возникает ошибка EInvalidPointer
end;
Заранее спасибо...
← →
Armen (2003-07-12 02:17) [1]Во первых string можно передавать толко если uses sharemem;
а так вместо var можно передавать указатель, это же тоже ссылка.
← →
Германн (2003-07-12 02:51) [2]Я бы посоветовал, в меру сил и возможностей, избегать применения паскалевского типа string в dll. Если нет противопоказаний, используй тип PChar.
← →
panov (2003-07-12 03:35) [3]При использовангии Sharemem строки можно совершенно спокойно использовать в проектах Delphi.
← →
olookin (2003-07-12 08:06) [4]Так вот, во-первых (to Armen) ShareMem ставлю только в библиотеку... Когда я ставлю ShareMem и в проект тоже - возникает ошибка уже просто при запуске программы.
Во вторых - (to Германн и panov) ошибка EInvalidPointer возникает только тогда, когда я вызываю процедуру с параметром типа var (неважно, string это или integer например). Вызов процедуры вида MyProc(s: string); не вызывает ошибки вообще (но, понятно, и результата тоже нет).
← →
Armen (2003-07-12 17:38) [5]>Когда я ставлю ShareMem и в проект тоже - возникает ошибка уже просто при запуске программы.
Это от того что у тебя var s: string, нужно без var-а.
Если хочешь передавать как var, то передай pointer!
← →
Ihor Osov'yak (2003-07-12 18:42) [6]1. Можно
2. Как сказал Панов - при передачи var s:string - использование Sharemem обязательно.
3. Идиологически более правильно Германн © (12.07.03 02:51) - почему, это совсем отделный разговор. Хотя и при использовани PChar можно получить определенные проблемы, если не совсем осознавать, что делаем..
> ошибка EInvalidPointer возникает только тогда, когда я вызываю процедуру с параметром типа var (неважно, string это или integer например).
> Когда я ставлю ShareMem и в проект тоже - возникает ошибка уже просто при запуске программы.
Это наводит на мысль, что у тебя ошибка совершенно где-то в ином месте. И мы наблюдаешь последствия этой ошибки..
← →
olookin (2003-07-12 19:10) [7]to Ihor Osov"yak - весь код приведен в примере. Есть там ошибка?
← →
Cr@zy-EyE (2003-07-12 19:17) [8]У меня ошибка EInvalidPointer возникала только потому, что не было ШарМема в программе. Как сказал Armen (12.07.03 17:38), ты var убери, а ShareMem в проге все-таки поставь.
← →
Ihor Osov'yak (2003-07-12 19:24) [9]Нет, не весь код. Непонятно, декларируешь ли ты sharemem.. Непонятно, какие опции компилятора, можно поставить ведь такие опции, что string в программе будет интерпритироваться как shortstring {$H–}.. А в dll будет по умолчанию, то есть {$H+}, и тогда string интерпритируется как AnsiString..
Да мало ли какие еще у тебя фортеля могут быть.. Посмотри отладчиком по
Ctrl_Alt_C - может чего и сообразишь..
← →
Ihor Osov'yak (2003-07-12 19:26) [10]
> ты var убери, а ShareMem в проге все-таки поставь
Вот ShareMem в программе и в длл поставь поначалу, а var - уже думай сам. Тебе, кажется, значение возвращать нужно? Так как ты без var обойдешся?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c