Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
maximusRS
3 / 3 / 2
Регистрация: 01.06.2011
Сообщений: 90
1

DLL в делфи

13.12.2015, 01:02. Просмотров 211. Ответов 5
Метки нет (Все метки)

Вечер добрый! Может кто сталкивался с похожей проблемой: пытаюсь подключить в проект написанный на Delphi2006, библиотеку которая сделана в XE6, но значение функция возвращает неверное значение и далее вылетает ошибка связанная с access violation. Т.е. к примеру если функция должна вернуть 'one' она возвращает 'o'. Реализовано на мой взгляд все правильно, потому что если я пытаюсь подключить эту библиотеку в проекте на XE6 то все возвращается корректно. Решил проверить все на простеньком примере и все равно то же самое. Как быть?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2015, 01:02
Ответы с готовыми решениями:

Делфи 7. Не видит dll
В папке проекта лежит SciLexer.dll, нужна она для компонента "Delphi Scintilla...

Компоненты из делфи в DLL?
Сразу скажу не шарю в делфи вообще , но видел в делфи гору готовых полезных...

Как правильно использовать функцию из DLL в Делфи?
Здравствуйте! Имеется датчик RF603, с интерфейсом Ethernet, а так же dll к...

Как в Делфи выполнить код, написанный на Делфи, например в поле ввода?
Есть способ в Делфи выполнить код, написанный на Делфи, например в поле ввода?

Здр, пожалуйста попробуйте запутсить .exe написанное на делфи 10 у себя, те у кого делфи 7
и скиньте скрин пожалуйста срочно http://www.fayloobmennik.net/4874373 перед...

5
cotseec
Пишу на Delphi...иногда
1408 / 1267 / 285
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
13.12.2015, 01:14 2
Цитата Сообщение от maximusRS Посмотреть сообщение
функция должна вернуть 'one' она возвращает 'o'
используется PChar?
какой прототип и как происходит вызов функции (код)?

Добавлено через 9 минут
Цитата Сообщение от maximusRS Посмотреть сообщение
в проект написанный на Delphi2006, библиотеку которая сделана в XE6
скорее всего: вызов в Ansi (SIzeOf(Char) == 1), возврат в Unicode (SizeOf(Char) == 2)
0
maximusRS
3 / 3 / 2
Регистрация: 01.06.2011
Сообщений: 90
13.12.2015, 01:16  [ТС] 3
Delphi
1
2
3
4
5
6
7
function MyFunc(Value: integer): string; register;
begin
  if value = 1 then Result := 'one';
  if value = 2 then Result := 'two';
end;
 
Exports MyFunc;
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TMyClass = class
  private
    function CallMyFunction(value: integer): string;
  end;
 
var
  MyFunction: function(value:integer): string;
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
function TMyClass.CallMyFunction;
var LibHandle: THandle;
begin
  try
    @MyFunction := nil;
    LibHandle := LoadLibrary('Fuck.dll');
    if LibHandle >= 32 then
    begin
    @MyFunction := GetProcAddress(LibHandle,'MyFunc');
    if @MyFunction <> nil then Result := MyFunction(Value);
    end
    else ShowMessage('Не удалось найти Fuck.dll');
  except
    on E: Exception do
      ShowMessage('Ошибка запуска библиотеки');
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var d: TMyClass;
begin
  d := TMyClass.Create;
  ShowMessage(d.CallMyFunction(1));
end;
 
end.
Ну вот последний пример который пробовал. Пробовал и через статический вызов разницы никакой
0
cotseec
Пишу на Delphi...иногда
1408 / 1267 / 285
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
13.12.2015, 01:21 4
Цитата Сообщение от maximusRS Посмотреть сообщение
Пробовал и через статический вызов разницы никакой
суть не в вызове, а в возвращаемом значении (о различных менеджерах памяти в хосте и в библиотеке также стоит задуматься), в библиотеке string юникодный, в хосте string - анси
или в библиотеке function MyFunc(Value: integer): AnsiString; register;
или в хосте function MyFunc(Value: integer): WideString; или делать приведение типов
1
maximusRS
3 / 3 / 2
Регистрация: 01.06.2011
Сообщений: 90
13.12.2015, 01:51  [ТС] 5
Спасибо объявление в библиотеке AnsiString помогло

Добавлено через 20 минут
не подскажете еще кое-что. с простыми типами данных все понятно, а если я буду использовать record?
0
northener
пофигист широкого профиля
3429 / 2328 / 631
Регистрация: 15.07.2013
Сообщений: 13,796
13.12.2015, 02:06 6
Цитата Сообщение от maximusRS Посмотреть сообщение
не подскажете еще кое-что. с простыми типами данных все понятно, а если я буду использовать record?
Для record есть опция компилятора $A
Прочитай по ней информацию.
0
13.12.2015, 02:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2015, 02:06

У меня стоит Делфи 5, возможно еще поставить и Делфи 7, или будут проблемы?!
Где можно скачать Делфи 7, дайте ссылку! У меня стоит Делфи 5, возможно еще...

Как открыть doc в делфи? Или как можно написать огромный текст в делфи?
Думаю поймете. Я решил сделать сборник книг. И в Delphi добавил список книг (в...

Пытаюсь сделать динамическую загрузку dll. Dll-библиотека не подает признаков жизни
Здравствуйте. У меня такое дело, я пытаюсь создать в своей программе...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru