Вниз
Скачать: CL | DM;

Как сделать 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.013 c
14-96969
Paul 'Spawn' Rysevets
2003-01-12 23:18
2003.01.30
Где взять статью различий мижду 7 и 6 Дэльфой.


1-96679
Mihas
2003-01-21 19:02
2003.01.30
Как распечатать элементы формы


14-97041
zolotov
2003-01-14 13:15
2003.01.30
Upgrade компонента.


1-96758
boby_g
2003-01-22 16:33
2003.01.30
Как собирать стринг в С++ Builder


6-96902
Repeater
2002-12-03 15:43
2003.01.30
Протокол UDP




   Наверх