Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > создание библиотеки


Автор: golfV 22.4.2010, 14:55
Доброго времени суток!

Появился такой вопрос. Есть маленькое приложение из 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 подскажите как это сделать. Пробовал по примерам найденым в интернэте ничего неполучается. Может кто поможет? или даст ссылку на хорошие материалы по этому поводу?
Заранее большое спасибо!

Автор: bems 22.4.2010, 15:31
что конкретно не получается?

Автор: golfV 22.4.2010, 15:57
а неполучается. вернее незнаю как этот метод переписать чтоб он работал в DLL  и чтобы его можно было вызывать.

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

Автор: golfV 22.4.2010, 16:08
а можеш показать какой нить маленький примерчик с формой чтоб я по нему сделал и как обьявить функцию а то я в дельфи совсем несилён?

Автор: golfV 22.4.2010, 20:34
никак немогу понять как в библиотеке обьявить
Код

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

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

procedure TForm1.WMDeviceChange(var Message: TMessage);

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

Автор: golfV 23.4.2010, 11:49
сделал так 
Код

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 

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

Автор: golfV 23.4.2010, 12:29
да именно так. подскажи пожалуйста как это реализовать

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

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.

Автор: golfV 23.4.2010, 13:41
если это будет несовсем нагло. можеш поконткретней расказать что делать. Так как мне эту библиотеку надо в LabView запускать и чтобы выскакивало сообщение о том что подключили устроиство или отключили. 

Автор: Rennigth 23.4.2010, 14:01
Код

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;



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

Автор: golfV 23.4.2010, 14:18
огромное спасибо. Все вроде работает. Сам бы еще долго голову ломал

Автор: golfV 23.4.2010, 17:17
появился еще 1 вопросик. как сделать чтоб процедура из библиотеки возвращала результат получный в форме? Если такое возможно. Подскажите пожалуйста новичку

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

Автор: golfV 23.4.2010, 17:57
похоже я никогда с этой библиотекой неразберусь=)

Добавлено через 10 минут и 20 секунд
блин очень неудобно просить но такая ситуация катострафическая. Если неочень напрягаю помоги с этим разобраться а то настолько позарез нужна эта библиотека которая возвращает результат ввиде строки (что в начале подключено а потом отключено устроиство)

Автор: Rennigth 23.4.2010, 18:09
Попозже немного.

Автор: Rennigth 23.4.2010, 20:55
Что-то типа этого.

Автор: golfV 23.4.2010, 21:12
здорова. огромное спасибо. а подскажи еще а то я немогу понять в твоем примере когда флешка обнаруживается что возвращает процедура в библиотеке?

Автор: Rennigth 23.4.2010, 21:45
Цитата(golfV @  23.4.2010,  21:12 Найти цитируемый пост)
здорова. огромное срасибо. а подскажи еще а то я немогу понять в твоем примере когда флешка обнаруживается что возвращает процедура в библиотеке? 

Когда вызывается StartFlashInOutIntercepting в нее параметром передается адрес процедуры FIOProc. А самой dll когда приходит событие подключения или отключения флешки вызывается как раз эта процедура(FIOProc). Но она исполняеся уже в контексте твоего приложения(т.е. в exe).

Автор: golfV 23.4.2010, 21:48
огромное спасибо еще раз. буду разбираться в примере

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)