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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2015, 00:01   #1
tito tarantula
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 24
Вопрос Загрузка функции из dll библиотеки

Программа для ввода пароля должна вывести в Label1 сообщение о корректности введенного пароля. Проверяю работу dll библиотеки. Оба файла проектов скомпилировались без проблем, а вот Label1.Caption не отображается(не изменяется)
Вот код первого проекта:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

function checkPassword(password: string): string;
external 'Project2.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption:= checkPassword(Edit1.Text);
end;

end.
Вот код второго проекта(библиотеки):
Код:
library Project2;

uses
  SysUtils,
  Classes;

{$R *.res}
function checkPassword(password: string): string;
begin
  if password = 'admin' then
    begin
      result:= 'correct'
    end
  else
    begin
      result:= 'incorrect'
    end;
end;
exports checkPassword;

begin
end.
Попутно задаю вопрос №2:
После открытия .dll файла через WordPad(по глупости), не заметив галочки "использовать выбранную программу для всех файлов такого типа", все файлы этого типа по умолчанию стали открываться через WordPad. Можно ли вернуть "никакую" программу по умолчанию? И может ли это повлиять на работу программ, использующих эти библиотеки(Пока не обнаружил)?
tito tarantula вне форума Ответить с цитированием
Старый 12.01.2015, 01:27   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

1. Строки:
Код:
function checkPassword(password: string): string;
external 'Project2.dll';
следует перенести выше, до слова implementation

Выделенное голубеньким обычно не указывается...

2. В редакторе реестра найдите (поиском) параметр .dll (слева), у которого среди значений (справа) будет WordPad и смело удалите такие значения (справа).

Последний раз редактировалось kropotkina-alice; 12.01.2015 в 01:34.
kropotkina-alice вне форума Ответить с цитированием
Старый 12.01.2015, 05:23   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Когда создавали проект длл, там был большой такой комментарий, его следует прочесть, понять и сделать рекомендованное.
Если же и тут сложности, то ключевое слово для гугления ShareMem
phomm вне форума Ответить с цитированием
Старый 12.01.2015, 21:46   #4
tito tarantula
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 24
По умолчанию

1)Все сделал как говорите - ничего не помогло(
ShareMem добавил в оба файла, использовал, даже ShortString -нифига.
2)Зашел в редактор реестра, но там программы не отображаются.
Зашел "сопоставление типов файлов или протоколов конкретным программам", но там редактировать (удалить выбранную программу) нельзя, только заменить другой.
tito tarantula вне форума Ответить с цитированием
Старый 13.01.2015, 00:11   #5
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Не поленилась - проверила. С моими поправками ваш код работает, но вылетает ошибка Invalid pointer operation.
Дело в том, что обмен строковыми переменными с DLL в дельфи реализован с ошибкой, поэтому нужно использовать не string, а PChar, тогда всё будет работать как нужно.
Вот ваш изменённый код, проверенный - работает без ошибок...
Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

function checkPassword(password: string): PChar; external 'Project4';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=StrPas(checkPassword(Edit1.Text));
end;

end.

DLL:

library Project4;

uses
  SysUtils,
  Classes;

{$R *.res}
function checkPassword(password: string): PChar;
begin
  if password = 'admin' then
    begin
      result:= 'correct'
    end
  else
    begin
      result:= 'incorrect'
    end;
end;

exports checkPassword;

begin
end.

Последний раз редактировалось kropotkina-alice; 13.01.2015 в 00:14.
kropotkina-alice вне форума Ответить с цитированием
Старый 13.01.2015, 02:06   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
Дело в том, что обмен строковыми переменными с DLL в дельфи реализован с ошибкой
Сильно сказано. И с какой именно ошибкой? Вы это выяснили?
И кстати. Шаблон для DLL создаваемый Delphi при выборе New->DLL вы когда-нибудь видели?
P.S. То что ТС утверждает что он якобы
Цитата:
ShareMem добавил в оба файла
ещё ничего не значит. Измененный код он не показал.
northener вне форума Ответить с цитированием
Старый 13.01.2015, 02:34   #7
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Сильно сказано. И с какой именно ошибкой? Вы это выяснили?
Это известно уже давно, в своём неведении вы, наверное, одиноки...
Попытайтесь освоить приёмы поиска информации в интернете - узнаете много нового и неизведанного...
kropotkina-alice вне форума Ответить с цитированием
Старый 13.01.2015, 11:20   #8
tito tarantula
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 24
По умолчанию

Странно, но у меня та же ситуация как и прежде, плюс еще получаю предупреждение от компилятора: [Warning]Unit1.pas(25): Unsave tipe ‘Pchar’ и переодически ошибка с Invalid pointer operation дополняется ошибкой:Runtime error 217 at 00413E30
Код:
unit Unit1;

interface

uses
  ShareMem,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  function checkPassword(password: string): Pchar;
  external 'Project2';

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption:= StrPas(checkPassword(Edit1.Text));
end;

end.

DLL:
library Project2;

uses
  ShareMem,
  SysUtils,
  Classes;

{$R *.res}
function checkPassword(password: String): Pchar;
begin
  if password = 'admin' then
    begin
      result:= 'correct'
    end
  else
    begin
      result:= 'incorrect'
    end;
end;
exports checkPassword;

begin
end.
tito tarantula вне форума Ответить с цитированием
Старый 13.01.2015, 11:24   #9
tito tarantula
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 24
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Когда создавали проект длл, там был большой такой комментарий, его следует прочесть, понять и сделать рекомендованное.
Если же и тут сложности, то ключевое слово для гугления ShareMem
Вот комент, правда мне он никак не помог
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
tito tarantula вне форума Ответить с цитированием
Старый 13.01.2015, 11:47   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Для результата используйте Boolean, вместо string, используйте WideString.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка функции из dll, как победить RunTime Winexcel Общие вопросы Delphi 4 01.07.2014 13:40
Загрузка Библиотеки в exe и интервал на выполнение Excellion Общие вопросы Delphi 2 20.01.2011 03:39
[DLL] Загрузка и выгрузка dll в/из чужого процесса Человек_Борща Win Api 4 28.02.2010 17:47
загрузка библиотеки DLL s2dentishe Помощь студентам 7 10.01.2010 17:48