| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2753 人关注过本帖
标题:请教DLL定时器的问题
取消只看楼主 加入收藏
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
结帖率:94.74%
收藏
已结贴  问题点数:100 回复次数:10 
请教DLL定时器的问题
现在想练习DLL,先定义一个过程,用过程读文件,再定义一个函数利用读出的数据计算输出到调用程序,,但读过程需要一个事件触发,并且定时触发,想用TIMER,可无法加入这一控件,搜索网上、教程,讲了两种方法,一种是通过UNIT引用,另一种是用API函数,都不详细,难以理解。因此在此求助,望能详解。谢谢  谢谢。

library dlltest1;
uses
  SysUtils,
  Classes;
 var
 x,y,z:integer;
{$R *.res}
procedure read(str:string);/////////////这里是读文件过程
begin
 ...........        
end;

procedure   ontimer();//这里想利用timer事件触发,不知怎样添加此触发方法。?
 begin
     read("dddd");//调用读过程
 
     function Add():integer;stdcall;//定义DLL的输出函数(无参)
        begin
        ..........
        result:= z;
        end;

  end;

exports
Add;
 
begin
end.
 
搜索更多相关主题的帖子: DLL 定时器 
2010-07-23 01:14
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
鱼兄,能否按我上面的框架做个格式,
另外,将输出函数定义在事件循环内和定义在循环外然后在循环体内调用有无不同,对调用程序调用DLL的函数有无影响。

谢谢
2010-07-23 10:29
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
以前看到要用HWND,不会用,现在不用窗体设置为空简单多了,可是不知将其放在那个位置,引用那个系统单元。
2010-07-23 10:34
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
鱼兄在线呀,很快。
我现在是在DLL中使用,没有button/memeo等控件的,因此不懂创建和消除定时器的制作,请明示
2010-07-23 10:45
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
基础差,还是不明白怎样做,回调函数的地址就把我搞晕了。

[ 本帖最后由 yalewang 于 2010-7-23 11:09 编辑 ]
2010-07-23 11:04
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
好的谢谢
2010-07-23 11:19
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
library dlltest1;
uses
  SysUtils,
  Classes;
var
x,y,z:integer;
{$R *.res}
procedure read(str:string);/////////////
begin
   x:=random(100)    ;
   y:=random(30);      ;
end;

procedure TimerProc(hWn:HWND,nMsg:integer,nTimerid: DWORD,dwTime:DWORD);stdcall;
我在这里设置回调函数,也就是事件处理过程?
begin
     read("dddd");//调用读过程

     function Add():integer;stdcall;//定义DLL的输出函数(无参)
        begin
        z:=x+y;
        result:= z;
        end;
     timerdelete;//删除定时器
end;

exports
Add;

begin///////在dll的初始化模块中设置定时器的创立及删除
   procedure timercreate(Sender: TObject);
       var
       identer:integer;
       begin
       identer:=settimer(0,1,2000,@TimerProc);//handle为null或0
       end;
    procedure timerdelete(Sender: TObject);
       begin
         KillTimer(0, 1);
       end;

end.

上面是根据我的理解所写,请指教



[ 本帖最后由 yalewang 于 2010-7-23 15:01 编辑 ]
2010-07-23 11:47
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
编译器提示有以下错误
1、procedure TimerProc(hWn:HWND,nMsg:integer,nTimerid: DWORD,dwTime:DWORD);stdcall
 形参之间用  分号
2、 procedure timercreate(Sender: TObject);   此处不能有声明
3、function Add():integer;stdcall               此处不能有声明
   (好像不能嵌套定义,)
根据提示进行修改,勉强通过编译,放入调用程序,函数输出始终为0;
random没发挥作用,定时没触发。
我改过的代码如下:

uses
  SysUtils,
  windows,
  Classes;
var
x,y,z,TimeID:integer;
{$R *.res}
procedure read(str:string);/////////////
begin
   x:=random(100);
   y:=random(30);
end;

procedure TimerProc(hWn:HWND;nMsg:integer;nTimerid:DWORD;dwTime:DWORD);stdcall;
begin
     read('dddd');
     //timerdelete;
end;
 function Add():integer;stdcall;
        begin
        z:=x+y;
        result:= z;
        end;
exports
Add;
begin
   //procedure timercreate(Sender: TObject);

    //   begin
       TimeID:=settimer(0,1,2,@TimerProc);
     //  end;
    //procedure timerdelete(Sender: TObject);
    //   begin
         KillTimer(0, TimeID);
    //   end;

end.
2010-07-24 11:21
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
鱼兄,你可给我出了一个大题目,定义了过程变量,从没接触过。
经常受木马所侵,想学一下制作和防御也这这么难,有点灰心,
刚又杀了一个木马project1.exe     不服气



有没有简单的办法制作我讲的定时器?我所讲的定时器是在DLL内部触发事件,
来读取数据,经计算后由输出函数传给调用DLL的程序

[ 本帖最后由 yalewang 于 2010-7-24 22:14 编辑 ]
2010-07-24 22:11
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
以下是引用东海一鱼在2010-7-24 17:24:55的发言:

老兄需要多看看delphi的基础书啊。
我写了一个测试,希望能对你有帮助:
dll代码:
library Project1;
uses
  SysUtils,
  windows,
  Classes;
 
  type
    OutFn = procedure(OutVal: Integer);stdcall;
 
{$R *.res}
var
  CallFun: OutFn;
  TimeID: Integer;
 
function Add(hwn:HWND;msg:Integer;TimeFlg: Integer;
  TimeElp:DWORD):Integer;stdcall;
var
  x,y,z: Integer;
begin
  Result:= 0;
 
  if pInteger(@CallFun)^ <> 0 then
  begin
    y:= random(300);
    z:= random(750);
    x:= y * z;
    CallFun(x);
    Result:= 1;
  end;
end;
 
function Start(TimeFlg: Integer;TimeElp: DWORD):BOOL;stdcall;
begin
  Result:= False;
 
  TimeID:= SetTimer(0,TimeFlg,TimeElp,@Add);
  if TimeID <> 0 then
    Result:= True;
end;
 
function Stop:BOOL;stdcall;
begin
  Result:= KillTimer(0,TimeID);
end;
 
function Init(Fn: OutFn):BOOL;stdcall;
begin
  Result:= False;
 
  if pInteger(@Fn)^ <> 0 then
  begin
    CallFun:= Fn;
    Result:= True;
  end;
end;
 
exports
Stop,
Start,
Init;
 
begin
  CallFun:= OutFn(Nil);
  TimeID:= 0;
end.
测试代码:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  OutFn = procedure(OutVal: Integer);stdcall;
 
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
function Start(TimeFlg: Integer;
  TimeElp: DWORD):BOOL;stdcall;external 'Project1.dll';
function Stop:BOOL;stdcall;external 'Project1.dll';
function Init(Fn: OutFn):BOOL;stdcall;external 'Project1.dll';
 
procedure Playout(OutValue: Integer);stdcall;
begin
  Form1.Memo1.Lines.Add(IntToStr(OutValue));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Init(@Playout);
  Start(1,500);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Stop;
end;
 
end.编译附件:
恭喜鱼兄荣升版主。
上面的代码看了好长时间,还难理解,能否做个注释。
尤其是
if pInteger(@Fn)^ <> 0
.....
 CallFun(x);

这两句。
谢谢
2010-07-29 09:19
快速回复:请教DLL定时器的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017262 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved