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

Вниз

Параметр в библиотечной процедуре...   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-77843
edicon
2003-07-12 17:03
2003.07.24
Еще про защиту...


1-77963
Micke
2003-07-11 08:30
2003.07.24
Запуск нескольких копий приложения средствами Delphi


14-78128
Igorexa
2003-07-09 07:20
2003.07.24
DELPHI Help


1-77839
Алексей А.
2003-07-11 12:31
2003.07.24
Resize формы при при bsNone


1-77866
Chadnov
2003-07-13 17:09
2003.07.24
[MDI]Как из дочернего окна узнать общее количество дочерних окон?