Главная страница
    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.011 c
4-97075
valmont
2002-12-15 15:11
2003.01.30
Функции WinAPI


1-96830
Kair
2003-01-20 20:16
2003.01.30
То, сё


1-96874
Mihas
2003-01-21 12:49
2003.01.30
Изменение размера элемента во время выполнения приложе


1-96715
Magic
2003-01-20 14:13
2003.01.30
Проблемы с сохранением рисунков


3-96532
qwerty2
2003-01-14 23:46
2003.01.30
Изменить текст в DBLookupComboBox





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