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

Вниз

Как сделать dll   Найти похожие ветки 

 
alexnmsk   (2003-01-22 15:40) [0]

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

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

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


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


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


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

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


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

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


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

> alexnmsk © (22.01.03 15:40)

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

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

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


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

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


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

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


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


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


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


 
alexnmsk   (2003-01-23 08:01) [7]

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

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

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


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

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


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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.009 c
14-97015
Юров Владимир
2003-01-13 12:23
2003.01.30
Господа Линуксоиды


1-96875
Виталик
2003-01-16 11:17
2003.01.30
Персонифицированный учет


1-96648
nomshar
2003-01-21 13:47
2003.01.30
Поиск и удаление повторяющихся слов.


1-96765
tulen
2003-01-22 17:31
2003.01.30
Отключение кнопки Delete


14-97013
Anatoly Podgoretsky
2003-01-13 18:33
2003.01.30
W2K3





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский