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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 03.08.2010, 14:14   #1
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
Вопрос библиотека DLL

У мну есть библиотека
Как мне S передать программе?
Код:
library hook;
uses
  Windows,
  Messages,
  Sysutils;

var
  myHook: HHook = 0;

function MsgProc(Code: integer; wParam: Word; lParam: Longint): Longint; stdcall;
var
f: text;
r:integer;
S:string;

begin
  if (Code=HC_ACTION) and (((lParam shr 16) and KF_UP)=0) then
  begin
  r:=wParam;
  S:='vkl('+IntToStr(r)+')';
//////передать S программе;
  result:=CallNextHookEx(myHook,Code,wParam,lParam);
  end;
end;

procedure setHook(Hook: boolean) export; stdcall;
begin
  if Hook then
  begin
    if myHook=0 then
    myHook:=SetWindowsHookEx(WH_KEYBOARD,@MsgProc,HInstance,0);
  end
  else
  begin
    if myHook<>0 then
    UnHookWindowsHookEx(myHook);
    myHook:=0;
  end;
end;

exports setHook name 'SetHook';

begin
end.
Federal вне форума
Старый 03.08.2010, 14:30   #2
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

передать лучше через сообщения - PostMessage();
Копайте в сторону WM_USER.
ZaRDaK вне форума
Старый 03.08.2010, 14:31   #3
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
По умолчанию

Копаю )))...
Federal вне форума
Старый 03.08.2010, 14:33   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Можно еще изголится:
Код:
exports setHook name 'SetHook', s;
А потом через GetProcAddress получить адрес на первый элемент и использовать как pchar
Код:
var l:THandle;  s:^string;
begin 
 l:=LoadLibrary('project2.dll');
 s:=GetProcAddress(l,'s');
 Caption:=s^;
end;
I'm learning to live...

Последний раз редактировалось Stilet; 03.08.2010 в 14:38.
Stilet вне форума
Старый 03.08.2010, 15:15   #5
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
По умолчанию

до меня так и не дошло как устроить постоянный поток информации с ДЛЛ при чем при каждом таком приходе в программе вызывалась процедура
Federal вне форума
Старый 03.08.2010, 15:32   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
при чем при каждом таком приходе в программе вызывалась процедура
Ну а какой способ ты выберешь?
Если через сообщения то пропиши обработчик сообщения
Код:
  TForm1 = class(TForm)
  private
   procedure w(var m:TMessage); message WM_USER+1001;
    { Private declarations }
  public
    { Public declarations }
  end;
А из ДЛЛ посылай окну это сообщение
Код:
postmessage(HWND_BROADCAST,WM_USER+1001,0,0)
Тогда должен сработать обработчик этого сообщения (который ты ессно реализуешь)
I'm learning to live...
Stilet вне форума
Старый 03.08.2010, 16:04   #7
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
По умолчанию

А можете написать небольшой пример для ясности ато уже тошнит от гугла
Цитата:
library hook;
uses
Windows,
Messages,
Sysutils;

{$R *.res}

var
S:string;

PostMessage(HWND_BROADCAST,WM_USER+ 1001,0,0);

begin
end.
Цитата:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

procedure w(var m:TMessage); message WM_USER+1001;

implementation

procedure w(var m:TMessage); message WM_USER+1001;
begin
Memo1.Lines.Add(S);
end;
Federal вне форума
Старый 03.08.2010, 16:41   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну вот смотри:
ДЛЛ:
Код:
library Project2;


uses

  windows,messages;
 var h:hwnd;
{$R *.res}
 procedure init(m:hwnd);begin h:=m;end;

 procedure post;
 begin
  SendMessage(h,WM_USER+1001,0,0);
 end;

 exports post,init;
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);
    procedure FormCreate(Sender: TObject);
  private
   procedure w(var m:TMessage); message WM_USER+1001;

    { Private declarations }
  public
    { Public declarations }
  end;
  procedure post;external 'project2.dll';
  procedure init(m:hwnd);external 'project2.dll';
var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.w(var m: TMessage);
begin
 ShowMessage('sdfgsdfds');
end;

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

procedure TForm1.FormCreate(Sender: TObject);
begin
 init(Handle);
end;

end.
I'm learning to live...
Stilet вне форума
Старый 04.08.2010, 15:35   #9
Federal
Пользователь
 
Регистрация: 21.05.2010
Сообщений: 77
По умолчанию

Код:
library hook;
Uses Windows, Messages, Sysutils;

var
  myHook: HHook = 0;
  B, T :string;
  h: hwnd;

procedure init(m:hwnd);begin h:=m;end;

function MsgProc(Code: integer; wParam: Word; lParam: Longint): Longint; stdcall;
var f: text;
    key: array [0..16] of Char;
    r: integer;
    S: string;
begin
  if (Code=HC_ACTION) and (((lParam shr 16) and KF_UP)=0) then
  begin
  Assign(f,'D:\log.txt');
  if FileExists('D:\log.txt') then
  Append(f) else Rewrite(f);
  r:=wParam;
  S:='vkl('+IntToStr(r)+')';
  B:=S;
  //SendMessage(h,WM_USER+1001,0,0);
  postmessage(h,WM_USER+1001,0,0);
  GetKeyNameText(lParam,key,SizeOf(key));
  Writeln(f,S);
  CloseFile(f);
  result:=CallNextHookEx(myHook,Code,wParam,lParam);
  end;
end;

function GetStr : Variant;
begin
  T:=B;
  Result:=T;
end;


procedure setHook(Hook: boolean) export; stdcall;
begin
  if Hook then
  begin
    if myHook=0 then
    myHook:=SetWindowsHookEx(WH_KEYBOARD,@MsgProc,HInstance,0);
  end
  else
  begin
    if myHook<>0 then
    UnHookWindowsHookEx(myHook);
    myHook:=0;
  end;
end;

exports setHook name 'SetHook';
exports GetStr;
exports init;
begin
end.
Сделал как вы научили, но вот беда это дело не работает если окно не активно, видимо post и send message не поддерживают неактивные окна
а мне на этапе надо передать строку S неактивному приложению, как быть?
Federal вне форума
Старый 04.08.2010, 16:29   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
если окно не активно, видимо post и send message не поддерживают неактивные окна
Нет. Я проверил даже.
Код:
library Project2;


uses

  windows,messages;
 var h:hwnd; ti:Cardinal;
{$R *.res}

 procedure post;
 begin
  while true do begin
   SendMessage(h,WM_USER+1001,0,0);
   sleep(10);
  end;
 end;

 procedure init(m:hwnd);begin
  h:=m;
  CreateThread(nil,0,@post,0,CREATE_NEW,ti);
 end;



 exports post,init;
begin
end.
Длл поставил на поток, и сообщения нормально проходят.
Дело скорее всего в хуке, наверное он некорректно ловит сообщения.
I'm learning to live...
Stilet вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Библиотека графических эффектов в dll. Alex Cones Общие вопросы Delphi 34 20.06.2010 16:12
DLL-библиотека Lisёноk Помощь студентам 2 29.04.2010 22:00
DLL библиотека Владимир1988 Помощь студентам 1 17.11.2009 17:15
библиотека bass.dll larry Win Api 2 31.07.2009 15:37
Библиотека классов != обычная DLL ? darkstarx Общие вопросы .NET 3 14.04.2008 14:41