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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание библиотеки 
:(
    Опции темы
golfV
Дата 22.4.2010, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброго времени суток!

Появился такой вопрос. Есть маленькое приложение из 1 метода.
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
    { Private declarations }
    procedure WMDeviceChange(var Message: TMessage); message WM_DEVICECHANGE;

  public
    { Public declarations }
  end;

var
 Form1: TForm1;

 unique_number_in:boolean=false;
 unique_number_out:boolean=false;
 count_of_7_message:byte=0;

implementation

{$R *.dfm}

procedure TForm1.WMDeviceChange(var Message: TMessage);
begin
 if (Message.wParam=7) then inc(count_of_7_message);
 if (Message.wParam=32772) then unique_number_out:=true;
 if (Message.wParam=32768) then unique_number_in:=true;
 if (unique_number_out) and (count_of_7_message=3) then
 begin
  unique_number_out:=false;
  count_of_7_message:=0;
  ShowMessage('Флешка была отключена');
 end;
 
 if (unique_number_in) and (count_of_7_message=6) then
 begin
  unique_number_in:=false;
  count_of_7_message:=0;
  ShowMessage('Флешка была включена');
 end;

 Memo1.Lines.Add('Пришло сообщение с кодом '+IntToStr(Message.wParam));
 Inherited;
end;
end.

Хочу сделать из нее DLL подскажите как это сделать. Пробовал по примерам найденым в интернэте ничего неполучается. Может кто поможет? или даст ссылку на хорошие материалы по этому поводу?
Заранее большое спасибо!
PM MAIL   Вверх
bems
Дата 22.4.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 31
Всего: 88



что конкретно не получается?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
golfV
Дата 22.4.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а неполучается. вернее незнаю как этот метод переписать чтоб он работал в DLL  и чтобы его можно было вызывать.
PM MAIL   Вверх
bems
Дата 22.4.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 31
Всего: 88



ну тебе нужна форма в длл. А для данного случая - лучше просто окошно 0х0, на winapi без всякой формы.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
golfV
Дата 22.4.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а можеш показать какой нить маленький примерчик с формой чтоб я по нему сделал и как обьявить функцию а то я в дельфи совсем несилён?
PM MAIL   Вверх
golfV
Дата 22.4.2010, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



никак немогу понять как в библиотеке обьявить
Код

    { Private declarations }
    procedure WMDeviceChange(var Message: TMessage); message WM_DEVICECHANGE;

и как обьявить потом метод
Код

procedure TForm1.WMDeviceChange(var Message: TMessage);

подскажите пожалуйста как это сделать

Это сообщение отредактировал(а) golfV - 22.4.2010, 20:35
PM MAIL   Вверх
golfV
Дата 23.4.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



сделал так 
Код

library Project2;


uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}
type
  Form2 = class(TForm2)
   
  private
    { Private declarations }
    procedure WMDeviceChange(var Message: TMessage); message WM_DEVICECHANGE;

  public
    { Public declarations }
  end;


var
unique_number_in:boolean=false;
 unique_number_out:boolean=false;
 count_of_7_message: integer=0;


procedure WMDeviceChange(var Message: TMessage);

begin
if (Message.wParam=7) then inc(count_of_7_message);

   if (count_of_7_message=4) then unique_number_out:=true;

 if(unique_number_out=true)and(count_of_7_message=4)  then
  begin
  unique_number_in:= true;
  count_of_7_message:=0;
  ShowMessage('usb device connected');
  end else


 if (unique_number_in=true) and (count_of_7_message=1) then
  begin
  unique_number_in:=false;
  count_of_7_message:=0;
  ShowMessage('usb device disconnected');
  end;

end;


exports WMDeviceChange;
begin
end.




но ничего неполучается компилятору ненравятся вот эта часть.
Код

private
    { Private declarations }
    procedure WMDeviceChange(var Message: TMessage); message WM_DEVICECHANGE;

  public
    { Public declarations }
  end;


подскажите пожалуйста в чем проблема почему неработает. Очень надо сделать эту Dll 
PM MAIL   Вверх
Rennigth
Дата 23.4.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



golfV, 
Не понимаю, что длл должна экспортировать...
Если включить телепатию то как я понимаю тебе длл с возможностью опционально включать и выключать перехват WM_DEVICECHANGE. Так?

Это сообщение отредактировал(а) Rennigth - 23.4.2010, 12:14


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
golfV
Дата 23.4.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



да именно так. подскажи пожалуйста как это реализовать

Это сообщение отредактировал(а) golfV - 23.4.2010, 13:10
PM MAIL   Вверх
Rennigth
Дата 23.4.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



хм... ну к длл добавь свою форму, потом создавай динамически по желанию.
Код

var
  HookDCWindow: TForm4;

procedure HookWMDeviceChange;
begin
  if not Assigned(HookDCWindow) then
  begin
    HookDCWindow := TForm4.Create(nil);
    HookDCWindow.Show;
  end;
end;

procedure UnHookWMDeviceChange;
begin
  if Assigned(HookDCWindow) then
  begin
    FreeAndNil(HookDCWindow);
  end;
end;

exports HookWMDeviceChange, UnHookWMDeviceChange;


Добавлено через 3 минуты и 9 секунд
Но лучше апишное окно создать и проверять wndproc.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
golfV
Дата 23.4.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



если это будет несовсем нагло. можеш поконткретней расказать что делать. Так как мне эту библиотеку надо в LabView запускать и чтобы выскакивало сообщение о том что подключили устроиство или отключили. 
PM MAIL   Вверх
Rennigth
Дата 23.4.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Код

library testdll;

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

uses
  SysUtils,
  Classes,
  ShareMem,
  ufTSWindow in 'ufTSWindow.pas' {Form4};

{$R *.res}

var
  HookDCWindow: TForm4;

procedure HookWMDeviceChange;
begin
  if not Assigned(HookDCWindow) then
  begin
    HookDCWindow := TForm4.Create(nil);
    HookDCWindow.Show;
    //
  end;
end;

procedure UnHookWMDeviceChange;
begin
  if Assigned(HookDCWindow) then
  begin
    FreeAndNil(HookDCWindow);
    //
  end;
end;

exports HookWMDeviceChange, UnHookWMDeviceChange;

begin
end.


Код

unit ufTSWindow;

interface

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

type
  TForm4 = class(TForm)
  private
    procedure WMDeviceChange(var Message: TMessage); message WM_DEVICECHANGE;
  end;

var
  Form4: TForm4;

  unique_number_in: boolean=false;
  unique_number_out: boolean=false;
  count_of_7_message: byte=0;

implementation

{$R *.dfm}

{ TForm4 }

procedure TForm4.WMDeviceChange(var Message: TMessage);
begin
 if (Message.wParam=7) then inc(count_of_7_message);
 if (Message.wParam=32772) then unique_number_out:=true;
 if (Message.wParam=32768) then unique_number_in:=true;
 if (unique_number_out) and (count_of_7_message=3) then
 begin
  unique_number_out:=false;
  count_of_7_message:=0;
  ShowMessage('Флешка была отключена');
 end;

 if (unique_number_in) and (count_of_7_message=6) then
 begin
  unique_number_in:=false;
  count_of_7_message:=0;
  ShowMessage('Флешка была включена');
 end;

// Memo1.Lines.Add('Пришло сообщение с кодом '+IntToStr(Message.wParam));
 Inherited;
end;



Что-то вроде, не проверял т.к. ничего флешового нету под рукой.



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
golfV
Дата 23.4.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



огромное спасибо. Все вроде работает. Сам бы еще долго голову ломал
PM MAIL   Вверх
golfV
Дата 23.4.2010, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



появился еще 1 вопросик. как сделать чтоб процедура из библиотеки возвращала результат получный в форме? Если такое возможно. Подскажите пожалуйста новичку
PM MAIL   Вверх
Rennigth
Дата 23.4.2010, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Ну можно передавать в процедуру запуска включения перехвата адрес своей функции(Callback function).


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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