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

Поиск:

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


Бывалый
*


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

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



Пытаюсь создать DLL и использовать ее функцию.
ДРКБ читал, листал,но как обычноничего не получилось.
Вобщем, чего наваял (т.е. скопипастил):
Код

library MyFirstDll;

uses
  SysUtils,
  Classes,
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

  procedure HelloWorld(AForm : TForm);   
begin  
  MessageBox(AForm.Handle, 'Hello world!', 'DLL Message Box',   
  MB_OK or MB_ICONEXCLAMATION);
end;   
    
exports  
  HelloWorld;   

begin
end.


Код

unit Unit1;

interface

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

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

var
  Form1: TForm1;
 procedure HelloWorld(AForm : TForm);external 'myfirstdll.dll';
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   helloworld(self);
end;

end.


Вроде, все как по учебнику, но при компиляции:
user posted image

Это сообщение отредактировал(а) Mach3 - 17.3.2011, 17:51
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
MetalFan
Дата 17.3.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



что-то я не понял, ты форму засунул в dll?
или unit1 из отдельного приложения все-таки?

Цитата(Mach3 @  17.3.2011,  17:51 Найти цитируемый пост)
но при компиляции

Это не при компиляции выдается, а при попытке запуска dll.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Mach3
Дата 17.3.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нет. В длл должна быть просто процедура HelloWorld.
Вроде сообразил.. Сейчас проверим..
А чего за ошибка-то? Чего говорит?

Это сообщение отредактировал(а) Mach3 - 17.3.2011, 18:14
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
cat512
Дата 17.3.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 15



Она говорит о том, что ты пытаешься запустить dll файл в качестве исполняемого модуля. Это физически сделать не возможно. Однако возможно написать клиента этой dll (т.е. exe приложение которая использует интерфейс экспортируемых методов), прописать путь к нему в RUN->PARAMETERS->HOST APPLICATION, тогда среда может запускать твоё приложение и длл по F9
PM MAIL   Вверх
Mach3
Дата 17.3.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не расскажите, что за предупреждение?
Код

{ 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. }

В ДЛЛ хочу засунуть функции парсеров.
Возвращать должны переменные типа TStringlist.
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
MetalFan
Дата 17.3.2011, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Mach3, А почитать, что написано - не? Вкратце: Если хочешь передавать строки, будь добр, пользуй ShareMem. Это же вроде бы касается и передачи экземпляров классов в/из длл.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Mach3
Дата 17.3.2011, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Так я и почитал.. =))
Увидел предупреждение насчет строковых переменных, вот и спросил. (Английский не на уровне..)
Только что передал функции ДЛЛ string, вернуло TStringList..
Все отлично.
В чем подвох-то?
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
MetalFan
Дата 17.3.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Mach3, у тебя еще все впереди ;) Но если не добавил ShareMem, то уже совсем скоро будет это "впереди". А вообще советую сходить на популярные ресурсы и почитать статейки про DLL, чтобы не задавать глупых вопросов.

Это сообщение отредактировал(а) MetalFan - 17.3.2011, 19:30


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
cat512
Дата 17.3.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 15



Вкратце объясню:
Если не использовать ShareMem, то как  в клиента так и в dll вкомпиливается стандартный мэнеджер памяти. Т.е. в контексте основного процесса будет два мэнеджера памяти, определяющих свои адресные подпространства. Но код RTL, генерируемый компилятором, при работе с объектами с управляемым временем жизни, универсален. Он ничего не знает о наличие двух разных мэнеджеров памяти (предполагает, что  работает с одним), потому может честно попросить какой - то из мэнеджеров, освободить объект, созданный другим мэнеджером, в связи с чем первый не сможет этого сделать. В этом случае могут иметь место, как исключительные ситуации, так и утечки памяти
PM MAIL   Вверх
Mach3
Дата 17.3.2011, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(MetalFan @  17.3.2011,  19:22 Найти цитируемый пост)
чтобы не задавать глупых вопросов

Страшнее НЕ задать этот глупый вопрос, ибо может сложиться неверное понимание у таких новичков как я.
А данный ресурс, думаю, ориентирован не только на продвинутых гуру.
Спасибо.

--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
MetalFan
Дата 17.3.2011, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Mach3, зачем задавать ЭЛЕМЕНТАРНЫЕ вопросы на темы, по которым уже есть ПОДРОБНЫЕ статьи, в которых ВСЕ расжевано?
Или влом искать/читать, типа "нафиг надо, лучше пусть знающие еще раз статью мне тут быстренько перескажут, им же больше заняться нечем"


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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