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