Форум: "Основная";
Текущий архив: 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