Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 15
1

DLL динамические библиотеки

18.03.2011, 08:51. Показов 1685. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
{так выглядит библиотека с библиотечной функцией}
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
library bible;
 
uses Sharemem, windows, sysutiles, classes;
 
 
function infoStr(s:pchar):pchar;export;stdCall;
begin
      result:=s; 
end;
     
     exports 
       infoStr;
 
begin
end.
 
 
{так выглядит вызывающая функция}
 
..
function infoStr(s:pchar):pchar; far; external 'bible';
 
..
var s:pchar;
begin
       s:='Привет';
       showMessage(strPas(infStr(s)));
end;
..
1."Привет" не возвращается, возвращается чепуха.
2.Возвращается сообщение : access violation at <adress> :write of adress <adress>
3.Пробовались другие варианты со строками все безуспешно.
4.Создание других, например, математич. функций и их использование вызывающими функциями успешно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2011, 08:51
Ответы с готовыми решениями:

Dll библиотеки
Необходимо реализовать стек через Статическую и Динамическую загрузку Dll

Создание библиотеки dll
Есть исходные коды некоторого windows приложения и exe файл. Как мне на основе этих файлов создать...

Посмотреть библиотеки dll
Как посмотреть что там внутри libeay32.dll ssleay32.dll, вернее даже где найти от этих файлов...

Не работает функция из dll библиотеки
Здравствуйте. Помогите, пожалуйста, найти неполадки. В приложении нужно ввести в один Edit число, а...

5
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
18.03.2011, 09:30 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
uses [B]Sharemem[/B], windows, sysutiles, classes;
 
 
function infoStr(s:Pchar):Pchar;[B]export;stdCall[/B]; // зачем ты указал соглашение о вызове ?
begin
result:=s;
end;
 
exports
infoStr;
 
begin
end.
 
 
{так выглядит вызывающая функция}
 
..
function infoStr(s:Pchar):Pchar; [B]far;[/B] external 'bible'; // где соглашение о вызове stdcall, коль скоро ты его указал в библиотечной ф-ции ?
 
..
var s:Pchar;
begin
s:='Привет';
showMessage(strPas(infStr(s)));
end;
Выделенное жирным - зачем ?
Вразумительно можешь прокомментировать осмысленность своих действий ?
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
18.03.2011, 12:14 3
Dll:
Delphi
1
2
3
4
5
6
7
8
9
function InfoStr(const aPCh : PChar) : PChar; stdcall;
begin
  Result := aPCh;
end;
 
exports InfoStr;
 
begin
end.
Клиент:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function InfoStr(const aPCh : PChar) : PChar; stdcall;
  external 'bible.dll' name 'InfoStr';
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  S : String;
begin
  S := 'Это пример строки.';
  S := InfoStr(PChar(S));
  ShowMessage(S);
end;
Всё правильно отрабатывает.
0
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 15
18.03.2011, 15:25  [ТС] 4
export;stdCall- export(экспортирую) stdCall(соглашение о стандартном вызове)
ShareMem- так рекомендует Borland
Far- директива дальнего вызова
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
18.03.2011, 15:39 5
Вот цитатные выдержки из стандартной справки:

The directives near, far, and export refer to calling conventions in 16-bit Windows programming. They have no effect in 32-bit applications and are maintained for backward compatibility only.

..

stdcall and safecall are recommended, in general, for calls to external code

..

if a DLL exports routines that pass long strings or dynamic arrays as parameters or function results (whether directly or nested in records or objects), then the DLL and its client applications (or DLLs) must all use the ShareMem unit.


Назови хотя бы одну причину, по которой ты не придерживаешься эти условных рекомендаций)
0
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 15
21.03.2011, 15:13  [ТС] 6
спасибо за разъяснения

Добавлено через 40 минут
следующая проблема:
вот библиотечная функция:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
..
function FFFF(s,s1:pchar):boolean;stdcall;
var adoq:TADOQuery; 
begin
      adoq:=TADOQuery.Create(nil);
      try
       connectiongString:=strPas(s);
       sql.add('insert into nameTableDbf');
       sql.add('nameField1,nameField2');
       sql.add(':nameField1,:nameField2');
       parametrs[0].value:=strPas(s1);
       parametrs[1].value:=now;
       try
        execSql;
        result:=true;
       except
        result:=false;
       end;
      finally
       freeAndNil(adoq);
      end;
end;
     exports FFFF;
 
 
begin
end.
 
вот вызывающая функция:
 
..
function FFFF(s,s1:pchar):boolean;stdcall;external 'bible.dll' name 'FFFF';
..
 
var vs,vs1:string;
begin
       vs:=Provider=MSDASQL.1 ...;
       vs1:='Некоторая строка';
       FFFF(pchar(vs),pchar(vs1));
end;
возникает ошибка: не был произведен вызов CoInitialize

не подскажете ли, что это означает и как следует производить инициализацию СПАСИБО
 Комментарий модератора 
vyach, не забывай оформлять код тегами.


Добавлено через 4 часа 43 минуты
да, верно, следует вставить в блок

Delphi
1
2
3
4
5
begin
       CoInitialize(nil);
        ..
       CoUnInitialize();
end;
0
21.03.2011, 15:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2011, 15:13
Помогаю со студенческими работами здесь

Библиотеки dll
Всем привет, как зделать вывод процедуры из длл на нажатие кнопки код длл library cal; uses...

Создание Dll библиотеки
проблема с выводом результата на экран. Библиотку нужно создать для функции nalichie Function...

DLL библиотеки и тип String
Подскажите кто-нибудь как из DLL библиотеки передавать в программу данные типа String

Инжектирование DLL-Библиотеки в процесс
В прошлый раз создал тему &quot;Как в Delphi перехватывать обращения к реестру?&quot;, там мне один умный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru