Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.30;
Скачать: 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 вся ветка

Текущий архив: 2003.01.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
6-96900
Groove
2002-12-02 07:02
2003.01.30
Пример проги типа ICQ, только для локалки


14-97031
khov
2003-01-13 19:17
2003.01.30
Компонент для работы с DBF


1-96723
asafr
2003-01-21 16:36
2003.01.30
COM сервер MICROSOFT OFICE.....


3-96565
Леша
2003-01-10 14:45
2003.01.30
Помогите с поиском в базе данных


6-96924
dimonf
2002-12-06 03:06
2003.01.30
Как узнать IP адрес по доменному имени?