Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать dll


alexnmsk ©   (2003-01-22 15:40:00) 

Помогите неучу, создаю dll, где описываю функцию:

function Probe (var MyString:PChar):Integer; stdcall
begin
Showmessage(PChar(MyString));
Probe:=1;
end;

Вызываю и FoxPro
получаю ошибку: Dll cause exception
Если в описании параметра функции убираю var - все нормально...
А ОЧЧЕНЬ нужно передать в dll строковый параметр с var
Помогите кто чем сможет..


alexnmsk   (2003-01-23 08:53:00) [1]

Ладно, придется предварительно создавать в Фоксе строку максимальной длины


Digitman   (2003-01-23 08:25:00) [2]

Здесь можно оч просто на ступить на "грабли".
Возвращенная из ф-ции строка вполне может иметь иной адрес начала буфера, если в ф-ция возвратила строку длинней входной.
Это раз.
Второе. Менеджер памяти, используемый в FoxPro, несовместим с менеджером памяти Борланда.


alexnmsk   (2003-01-23 08:01:00) [3]

В FoxPro описание и вызов выглядит как:

declare Integer Probe in MyDll.dll String @MyString
MyString="строка"
n=0
n=Probe(@MyString)

@ - указавает, что вызов функции по ссылке...
После этого другие функции (например WinAPI) могут вернуть строку любой длины.


Digitman   (2003-01-22 16:38:00) [4]


> А как вернуть в MyString другое значение, большее по длине,
> например "Возвращаемое значение строки"


А FoxPro ожидает это от тебя ? Как в FoxPro выглядит описание параметров/результата вызова DLL-ф-ции в этом случае ?


REA   (2003-01-22 16:30:00) [5]

1) Выделить память. (Проще всего глобальный MyString: String)
2) Вернуть PChar(MyString) в Var PStr: PChar;


alexnmsk   (2003-01-22 16:24:00) [6]

А как вернуть в MyString другое значение, большее по длине, например "Возвращаемое значение строки"


Юрий Зотов   (2003-01-22 16:18:00) [7]

> alexnmsk © (22.01.03 15:40)

Как сделать dll? Очень просто - научиться работать с указателями (в частности, с PChar). И понять, что такое передача параметров по ссылке и по значению.

Если Вы поместите эту функцию не в DLL, а в обычный дельфишный проект, то будет та же самая ошибка (только с другим сообщением). Поэтому DLL здесь абсолютно ни при чем, и вопрос надо задавать не "как сделать dll", а "как работать с PChar".

А ответ на вопрос "как работать с указателями и динамической памятью" ищите в книгах. Поскольку PChar - это тоже указатель.


REA   (2003-01-22 16:04:00) [8]

1) В var передается указатель, поэтому в данном случае передается указатель на указатель на 0 терминированную строку.
2) При передаче PChar нужно осторожно преобразовывать к String и наоборот (я на всякий случай использую SetString, чтобы избежать конфликтов), следить за тем что память выделена.
3) Если передаются строки, классы, динамические массивы, не забывать использовать sharemem.


Digitman   (2003-01-22 15:48:00) [9]


> нужно передать в dll строковый параметр с var


Зачем ?
Если тебе нужно изменить, к примеру, 1-й символ в переданной строке, то ты и так (скорее всего) его изменишь, безо всяких там VAR))

function Probe (MyString:PChar):Integer; stdcall;
begin
MyString[0] := "!";
Showmessage(string(MyString));
Result:=1;
end


Наверх

Титульная страница Поиск, карта сайта Написать письмо