Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-3275
diww
2002-08-09 19:41
2002.09.02
как сделать запрос?


4-3660
guliver
2002-06-26 06:00
2002.09.02
System Trey


8-3525
Fredericco
2002-04-18 10:48
2002.09.02
Вопрос по DireckX


3-3244
sndanil
2002-08-09 14:00
2002.09.02
Проблема с базой InterBase


14-3596
Sergo
2002-08-07 10:48
2002.09.02
Окно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский