Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2015, 07:49   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Вызов функции из DLL

Доброе утро!
Создал библиотеку и написал в ней, для примера, так:
Код:
library Test;
uses SysUtils,Classes,Dialogs;
{$R *.res}
function ExecTest(tempStr: string): string; export;
var
 s: STringList;
begin
 s:=TStringList.Create;
 s.Add('1');
 s.Add('2');
 tempStr:=s.Text;
 s.Free;
end;

exports ExecTest;

begin
end.
Потом в своем проекте написал, из которого вызываю свою функцию:
Код:
...
function ExecTest: string; external 'Test.dll'; //подключил свою dll
...
procedure TForm1.Button(Sender: TObject);
begin
 ShowMessage(ExecTest);
end;
Мне нужно, чтобы появилось сообщение с текстом
1
2
но оно появляется пустым.
Что не так я делаю? Раньше как-то не заморачивался с библиотеками, а сейчас решил разделить проект на библиотеки.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.06.2015, 08:20   #2
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

а что возвращает функция ExecTest?
добавь
Код:
result := s.text;
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 03.06.2015, 08:58   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Toxa Посмотреть сообщение
а что возвращает функция ExecTest?
добавь
Код:
result := s.text;
В какое именно место добавить?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.06.2015, 09:01   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В uses sharemem пропиши для начала, раз уж string используешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2015, 09:15   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
В uses sharemem пропиши для начала, раз уж string используешь.
В uses библиотеки прописать? Сделал, все равно пустое сообщение отображается.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.06.2015, 09:17   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
library Test;
uses ShareMem,SysUtils,Classes,Dialogs;
{$R *.res}
function ExecTest(tempStr: string): string; export;
var
 s: STringList;
begin
 s:=TStringList.Create;
 s.Add('1');
 s.Add('2');
 Result:=s.Text;
 s.Free;
end;

exports ExecTest;

begin
end.
Увидел?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2015, 09:24   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
library Test;
uses ShareMem,SysUtils,Classes,Dialogs;
{$R *.res}
function ExecTest(tempStr: string): string; export;
var
 s: STringList;
begin
 s:=TStringList.Create;
 s.Add('1');
 s.Add('2');
 Result:=s.Text;
 s.Free;
end;

exports ExecTest;

begin
end.
Увидел?
Ага, увидел
Написал и в вместо сообщения появилась такая ошибка:
Цитата:
Access violation at address 00A374E8 in module 'Test.dll'. Read of address FFFFFFFA
Это же ничего, что я проект в одной среде разработке пишу, а библиотеку в другой?) В смысле она одна, просто два окна делфи открыто и проект и библиотека по-разному пишутся.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 03.06.2015 в 09:28.
artemavd вне форума Ответить с цитированием
Старый 03.06.2015, 09:31   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вот это проблема стрингов. Они плохо натягиваются на ножки библиотек
В таком случае я делаю так:
1) использую TStringList, передавая его в процедуру. В процедуре в библе его наполняю.
Код:
function ExecTest(tempStr: TStrings): Boolean; export;
Далее просто использую то, что передал в параметр
2) Возвращаю PChar а не стринг.
Сам предпочитаю первое, глюков меньше.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2015, 10:27   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,786
По умолчанию

В современных версиях Delphi использование ShareMem уже спорно, поскольку у FastMM есть свой механизм разделяемых указателей. А FastMM, как известно, является системным диспетчером памяти, начиная с Delphi 2005.

Самый простой способ -- обмениваться WideString-ами, которые сами по себе межмодульны, ShareMem им не нужен (в теории).
Vapaamies вне форума Ответить с цитированием
Старый 03.06.2015, 11:24   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну в современных Делфи да. Тут я не скажу как они там уже сделали.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов в Lazarus функции из dll на C. Son Lazarus, Free Pascal, CodeTyphon 6 27.08.2013 19:24
Вызов функции dll из программы на C. 8Observer8 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 04.11.2012 23:01
Вызов функции из DLL Vegas C# (си шарп) 2 19.12.2011 00:57
Вызов функции из DLL(C#) ZverSS88 Помощь студентам 0 25.11.2010 11:27
Вызов функции из dll-ки VVVadim Общие вопросы Delphi 2 28.04.2009 10:37