Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.02;
Скачать: CL | DM;

Вниз

Передача строки в ДЛЛ   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
3-3287
battar
2002-08-12 21:05
2002.09.02
QReport


14-3618
MBo
2002-08-07 12:35
2002.09.02
Еще задачки ;)


7-3643
HowTo
2002-06-19 17:32
2002.09.02
При клике на кнопку изменить частоту обновления экрана на 85 Hz?


8-3529
DmitryM
2002-04-23 15:46
2002.09.02
ico в bmp


1-3424
blazze
2002-08-22 23:02
2002.09.02
Модули