![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача строки в ДЛЛ [D6, Win95/98]
c0pyc@t © (2002-08-22 09:24:00)У меня такая проблема как правильно передать строчку в длл. В длл я использую тип PChar
вот так:
function SetText(str: PChar): PcHAR; stdcall;
var st: string;
begin
st := StrPas(str);
DllForm.ListBox1.Items.Append(st);
end;
В программе записано следущее
s := "Эту строку хочю отправить";
if @SetText <> nil then
SetText(PChar(s));
но на этом месте позникает ошибка :(
помогите
Alx2 (2002-08-22 10:20:00) [1]>c0pyc@t © (22.08.02 10:07)
Ну это несерьезно :) remote debug какой-то.
c0pyc@t (2002-08-22 10:07:00) [2]
> Alx2 ©
Ух спасибо, я пытался вызвать функцию раньше создания формы, теперь не глючит,
Всем спасибо
Юрий Зотов (2002-08-22 10:01:00) [3]Похоже, Ваша DLL предназначена работать только с Delphi-программами. В этом случае самое простое - работать не с PChar, а со string и не иметь головной боли. Только в обоих DPR (и EXE, и DLL) в uses пропишите ShareMem (строго самым первым).
Если же нужно работать только с PChar, то без изучения темы "указатели и динамическая память" обойтись вряд ли удастся.
А строчку в DLL передать просто. Выделяете память, заполняете ее, адрес (тот самый PChar) передаете в DLL, получаете результат, что-то с ним делаете, освобождаете память.
Получить строку из DLL - точно так же, только память можно не заполнять, она заполнится в DLL.
Это общая схема, возможны ее варианты. Но при любых вариантах есть одно железное правило - память, на которую указывает PChar ОБЯЗАНА быть тем или иным способом выделена. Иначе - Access Violation (причем это правило относится даже не к DLL, а вообще ко всем указателям, включая и PChar).
Скорее всего, это у Вас и происходит, но для точного ответа Вы привели недостаточно кода. Могу сказать, что функция типа PChar в DLL очень мне не нравится, но Вы не указали, что Вы делаете с ее Result (если ничего, то зачем функция?).
Digitman (2002-08-22 10:00:00) [4]Та-а-ак) ... игра в разгаре) ..
ошибка видимо так и называется "че-то глючит"...
Alx2 (2002-08-22 09:58:00) [5]Как проявляется глюк?
Приведи обновленное описание SetText.
Приведи секции uses dll и хоста.
Вот это место:
DllForm.ListBox1.Items.Append(st);
Тут точно все проинициализировано? DllForm создана была?
c0pyc@t (2002-08-22 09:55:00) [6]
> Alx2 ©
поставил как и просили всё равно глючит не хочет
выполнять
SetText(PChar("Проверка проверка"));
Alx2 (2002-08-22 09:49:00) [7]>c0pyc@t © (22.08.02 09:46)
SetText: function(str: PChar): PChar; stdcall//Установка строки
...
Третий раз просим уже воткнуть stdcall :)
c0pyc@t (2002-08-22 09:46:00) [8]MBo © нет
вот как у меня в коде
var
SetText: function(str: PChar): PChar; //Установка строки
...
далее
@SetText := nil;
LibHandle := LoadLibrary(PChar(DLLpath));
@SetText := GetProcAddress(LibHandle,"SetText");
и всё
MBo (2002-08-22 09:40:00) [9]>Я вызываю функцию settext динамически
какая разница, все равно она как-то описана - есть stdcall?
c0pyc@t (2002-08-22 09:39:00) [10]
> MBo ©
Дык это хорошо , но так даже не передает
MBo (2002-08-22 09:38:00) [11]добавление - в Items можно Add и PChar, не обязательно конвертировать в string
c0pyc@t (2002-08-22 09:38:00) [12]
> Alx2 ©
Я вызываю функцию settext динамически
Alx2 (2002-08-22 09:35:00) [13]Сначала проверь наличие sharemem в uses-секциях dll и хоста.
Потом нужно, чтобы описание settext в хосте содержало спецификатор stdcall.
c0pyc@t (2002-08-22 09:32:00) [14]
> Digitman ©
ну хоть расскажите как правильно передать строчку в длл
Digitman (2002-08-22 09:30:00) [15]>>но на этом месте позникает ошибка
Сейчас будем играть в любимую игру под названием "угадайте, люди, с 3-х раз, что у меня за ошибка"