Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> компиляция DLL, выдает ошибку 
:(
    Опции темы
kent
  Дата 6.12.2005, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 6.5.2005
Где: Russia

Репутация: нет
Всего: 1



Вобщем при компиляции DLL в Delphi 7 вылетает вот такая вот ошибка:

Цитата
Cannot debug unless a host is defined. Use the Run|Parameters... dialog box.


Невозможно отладить... Используйте диалоговое окно Run|Parameters...

Вот код dll - ки:
Код

library DLLProject;

uses
    ShareMem, SysUtils, Classes;

{$R *.res}

Function AddIntegers(a, b : Integer) : Integer;
begin
     Result := a + b;
end;

Function AddReals(c, d : Real) : Real;
begin
     Result := c + d;
end;

Function AddStrings(e, f : String) : String; 
begin
     Result := e + f;
end;

exports
   AddIntegers,
   AddReals,
   AddStrings  name 'AddStringFromDLL';

begin
end.


Вопрос компилировать только в этом диалоговом окне можно или это ошибка в коде?
PM MAIL ICQ   Вверх
Alexeis
Дата 6.12.2005, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Я думаю что ее нужно ЗАПУСКАТЬ вместе с программой

Это сообщение отредактировал(а) alexeis1 - 6.12.2005, 13:06


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kent
Дата 6.12.2005, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 6.5.2005
Где: Russia

Репутация: нет
Всего: 1



Да я пробовал запускать...
Программа то в принципе работает, только вот когда закрываешь программу вылетает исключение 'Invalid Pointer Operation...'
Я думаю это из за неправильной компиляции dll, или нет?
Вот код программы:
Код

unit uCallDLL;

interface

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

type
  TForm1 = class(TForm)
    edtInteger1: TEdit;
    edtInteger2: TEdit;
    btnAddIntegers: TButton;
    edtIntegerResult: TEdit;
    edtReal1: TEdit;
    edtReal2: TEdit;
    btnAddReals: TButton;
    edtRealResult: TEdit;
    edtString1: TEdit;
    edtString2: TEdit;
    btnAddStrings: TButton;
    edtStringResult: TEdit;
    procedure btnAddIntegersClick(Sender: TObject);
    procedure btnAddRealsClick(Sender: TObject);
    procedure btnAddStringsClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Function AddIntegers(a, b : Integer) : Integer;
         external 'DLLProject.dll';

Function AddReals(c, d : Real) : Real;
         external 'DLLProject.dll';

Function AddStringFromDLL(e,f : String) : String;
         external 'DLLProject.dll';



procedure TForm1.btnAddIntegersClick(Sender: TObject);
begin
     edtIntegerResult.Text := IntToStr(AddIntegers(StrToInt(edtInteger1.Text),StrToInt(edtInteger2.Text)));
end;

procedure TForm1.btnAddRealsClick(Sender: TObject);
begin
     edtRealResult.Text := FloatToStr(AddReals(StrToFloat(edtReal1.Text),StrToFloat(edtReal2.Text)));
end;

procedure TForm1.btnAddStringsClick(Sender: TObject);
begin
     edtStringResult.Text := AddStringFromDLL(edtString1.Text,edtString2.Text);
end;

end.

PM MAIL ICQ   Вверх
Alexeis
Дата 6.12.2005, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата
Я думаю это из за неправильной компиляции dll, или нет?

Наврядли - при компиляции ошибки не выдаются


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kent
Дата 6.12.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 6.5.2005
Где: Russia

Репутация: нет
Всего: 1



Цитата
Наврядли - при компиляции ошибки не выдаются


А в чем же тогда дело???
В принципе этот пример взят из книги но там про то как их компилировать ничего не сказано...
PM MAIL ICQ   Вверх
Alexeis
Дата 6.12.2005, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата
как их компилировать ничего не сказано...

CTRL+F9


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 6.12.2005, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

library DLLProject;    
uses    
    ShareMem, SysUtils, Classes;    
{$R *.res}    
Function AddIntegers(a, b : Integer) : Integer;    
begin    
     Result := a + b;    
end;    
Function AddReals(c, d : Real) : Real;    
begin    
     Result := c + d;    
end;    
Function AddStrings(e, f : String) : String;    
begin    
SetLength(Result,Length(e)+Length(f)+1);     
Result := e + f;    
end;    
exports    
   AddIntegers,    
   AddReals,    
   AddStrings  name 'AddStringFromDLL';    
begin    
end.

Мож так?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
kent
Дата 6.12.2005, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 6.5.2005
Где: Russia

Репутация: нет
Всего: 1



Romikgy, попробовал с SetLength все равно при закрытии программы вылетает... smile
PM MAIL ICQ   Вверх
Bose
Дата 6.12.2005, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(kent @ 6.12.2005, 12:51)
Cannot debug unless a host is defined. Use the Run|Parameters... dialog box

эта не ошибка. Просто Дельфи говорит, что файл который Вы пытаетесь запустить, запустить невозможно. Это же dll, a dll ки сами по себе не являются исполняемым файлом. Для того, чтобы по нажатию F9 запускалась программа, которая будет работать с этой dll, её нужно определить в Run->Parameters->Host Application

Цитата(kent @ 6.12.2005, 13:14)
Я думаю это из за неправильной компиляции dll, или нет?

нет

Цитата(kent @ 6.12.2005, 13:14)
вылетает исключение 'Invalid Pointer Operation...'

в какой строке?

PM MAIL WWW Skype   Вверх
Alexeis
Дата 6.12.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Может попробовать загрузить библиотеку динамически
так будут видны все проблемы

пример
Код

var
  DLLInstance : THandle;
  HelloWorld : THelloWorld;
begin
  { загружаем DLL }
  DLLInstance := LoadLibrary(myfirstdll.dll');
  { получаем указатель }
  @HelloWorld := GetProcAddress(DLLInstance, HelloWorld');
  { вызываем процедуру на выполнение }
  HelloWorld(Self);
  { выгружаем DLL из оперативной памяти }
  FreeLibrary(DLLInstance);
end;






Это сообщение отредактировал(а) alexeis1 - 6.12.2005, 13:50


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kent
Дата 6.12.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 6.5.2005
Где: Russia

Репутация: нет
Всего: 1



To Bose, когда закрываешь программу оно и возникает только там не написано в какой строке...

To alexeis1, спасибо щас попробую...
PM MAIL ICQ   Вверх
kent
Дата 6.12.2005, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 6.5.2005
Где: Russia

Репутация: нет
Всего: 1



Попробовал загружать динамически, все равно при закрытии возникает то же самое исключение...
И еще вылетает Runtime error 217 at 00413B48

Вот код:
Код

unit uCallDLL;

interface

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

type
    TAddIntegers = function(a, b : Integer) : Integer;
    TAddReals = function(c, d : Real) : Real;
    TAddStrings = function(e, f : String) : String;

type
  TForm1 = class(TForm)
    edtInteger1: TEdit;
    edtInteger2: TEdit;
    btnAddIntegers: TButton;
    edtIntegerResult: TEdit;
    edtReal1: TEdit;
    edtReal2: TEdit;
    btnAddReals: TButton;
    edtRealResult: TEdit;
    edtString1: TEdit;
    edtString2: TEdit;
    btnAddStrings: TButton;
    edtStringResult: TEdit;
    procedure btnAddIntegersClick(Sender: TObject);
    procedure btnAddRealsClick(Sender: TObject);
    procedure btnAddStringsClick(Sender: TObject);
  private
     DLLHandle : THandle;
     ExternalFunctionAddIntegers : TAddIntegers;
     ExternalFunctionAddReals : TAddReals;
     ExternalFunctionAddStrings : TAddStrings;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.btnAddIntegersClick(Sender: TObject);
begin
     DLLHandle := LoadLibrary('DLLProject');
     if (DLLHandle = 0) then begin
       ShowMessage('Ошибка загрузки библиотеки!');
       Exit;
     end;
     try
       @ExternalFunctionAddIntegers := GetProcAddress(DLLHandle,PChar('AddIntegers'));
       edtIntegerResult.Text := IntToStr(ExternalFunctionAddIntegers(StrToInt(edtInteger1.Text),StrToInt(edtInteger2.Text)));
     finally
       FreeLibrary(DLLHandle);
     end;
end;

procedure TForm1.btnAddRealsClick(Sender: TObject);
begin
     DLLHandle := LoadLibrary('DLLProject');
     if (DLLHandle = 0) then begin
       ShowMessage('Ошибка загрузки библиотеки!');
       Exit;
     end;
     try
       @ExternalFunctionAddReals := GetProcAddress(DLLHandle,PChar('AddReals'));
       edtRealResult.Text := FloatToStr(ExternalFunctionAddReals(StrToFloat(edtReal1.Text),StrToFloat(edtReal2.Text)));
     finally
       FreeLibrary(DLLHandle)
     end;
end;

procedure TForm1.btnAddStringsClick(Sender: TObject);
begin
     DLLHandle := LoadLibrary('DLLProject');
     if (DLLHandle = 0) then begin
       ShowMessage('Ошибка загрузки библиотеки!');
       Exit;
     end;
     try
       @ExternalFunctionAddStrings := GetProcAddress(DLLHandle,PChar('AddStringFromDLL'));
       edtStringResult.Text := ExternalFunctionAddStrings(edtString1.Text,edtString2.Text);
     except
       FreeLibrary(DLLHandle);
     end;
end;

end.

PM MAIL ICQ   Вверх
kent
Дата 6.12.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 6.5.2005
Где: Russia

Репутация: нет
Всего: 1



Теперь кажется понял что глючит... Отключил ShareMem из списка подключаемых модулей и ошибка исчезла... Но присоздании DLL есть комментарий что если есть функции используют значения типа String то его необходимо подключать... Но при отключенном модуле программа перестаёт работать, но закрывается нормально???
PM MAIL ICQ   Вверх
kent
Дата 6.12.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 6.5.2005
Где: Russia

Репутация: нет
Всего: 1



Вобщем сделал вывод что при использовании dll лучше вместо String использовать PChar... С PChar работает и при статической и при динамической загрузке dll без всяких глюков и не надо подключать этот глючный ShareMem...

Рабочий проект:

Код dll:
Код

library DLLProject;

uses
    SysUtils, Classes;

{$R *.res}

Function AddIntegers(a, b : Integer) : Integer;
begin
     Result := a + b;
end;

Function AddReals(c, d : Real) : Real;
begin
     Result := c + d;
end;

Function AddStrings(e, f : String) : PChar;
begin
     Result := PChar(e + f);
end;

exports
   AddIntegers,
   AddReals,
   AddStrings  name 'AddStringFromDLL';

begin
end.


Код юнита:
Код

unit uCallDLL;

interface

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

type
    TAddIntegers = function(a, b : Integer) : Integer;
    TAddReals = function(c, d : Real) : Real;
    TAddStrings = function(e, f : String) : PChar;

type
  TForm1 = class(TForm)
    edtInteger1: TEdit;
    edtInteger2: TEdit;
    btnAddIntegers: TButton;
    edtIntegerResult: TEdit;
    edtReal1: TEdit;
    edtReal2: TEdit;
    btnAddReals: TButton;
    edtRealResult: TEdit;
    edtString1: TEdit;
    edtString2: TEdit;
    btnAddStrings: TButton;
    edtStringResult: TEdit;
    procedure btnAddIntegersClick(Sender: TObject);
    procedure btnAddRealsClick(Sender: TObject);
    procedure btnAddStringsClick(Sender: TObject);
  private
     DLLHandle : THandle;
     ExternalFunctionAddIntegers : TAddIntegers;
     ExternalFunctionAddReals : TAddReals;
     ExternalFunctionAddStrings : TAddStrings;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.btnAddIntegersClick(Sender: TObject);
begin
     DLLHandle := LoadLibrary('DLLProject');
     if (DLLHandle = 0) then begin
       ShowMessage('Ошибка загрузки библиотеки!');
       Exit;
     end;
     try
       @ExternalFunctionAddIntegers := GetProcAddress(DLLHandle,PChar('AddIntegers'));
       edtIntegerResult.Text := IntToStr(ExternalFunctionAddIntegers(StrToInt(edtInteger1.Text),StrToInt(edtInteger2.Text)));
     finally
       FreeLibrary(DLLHandle);
     end;
end;

procedure TForm1.btnAddRealsClick(Sender: TObject);
begin
     DLLHandle := LoadLibrary('DLLProject');
     if (DLLHandle = 0) then begin
       ShowMessage('Ошибка загрузки библиотеки!');
       Exit;
     end;
     try
       @ExternalFunctionAddReals := GetProcAddress(DLLHandle,PChar('AddReals'));
       edtRealResult.Text := FloatToStr(ExternalFunctionAddReals(StrToFloat(edtReal1.Text),StrToFloat(edtReal2.Text)));
     finally
       FreeLibrary(DLLHandle)
     end;
end;

procedure TForm1.btnAddStringsClick(Sender: TObject);
begin
     DLLHandle := LoadLibrary('DLLProject');
     if (DLLHandle = 0) then begin
       ShowMessage('Ошибка загрузки библиотеки!');
       Exit;
     end;
     try
       @ExternalFunctionAddStrings := GetProcAddress(DLLHandle,PChar('AddStringFromDLL'));
       edtStringResult.Text := ExternalFunctionAddStrings(edtString1.Text,edtString2.Text);
     finally
       FreeLibrary(DLLHandle);
     end;
end;

end.




PM MAIL ICQ   Вверх
Romikgy
Дата 6.12.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

Function AddStrings(e, f : String) : String;     
begin     
Result:=Concat(e,f);    
end; 

А так?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.