| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 989 人关注过本帖
标题:DLL问题
只看楼主 加入收藏
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
结帖率:94.74%
收藏
已结贴  问题点数:100 回复次数:5 
DLL问题
看了一个用线程和消息循环的方法让DLL代码自动运行的例子,可编译不能通过。
能否帮我查一下怎回事,好希望调用dll不用传指针参数。
谢谢
library Project1;

 uses
  SysUtils,
  windows,
  Classes;
type
  TMyThread = class(TThread)
    private
      FTimer:TTimer;
      procedure TimerProc(Sender: TObject);
    protected
      procedure Execute;override;
    public
      constructor Create;override;
      procedure KillIt;//结束
  end;
 var
x,y,z:integer ;

{$R *.res}
 function Add():integer;stdcall;
    begin
        x:=random(100);
        y:=random(300);
        z:=x+y;
        result:= z;
        end;

 procedure TMyThread.TimerProc(Sender: TObject);
  begin
    Add();
  end;
  procedure TMyThread.KillIt;
  begin
    PostMessage(Handle,WM_QUIT,0,0);
  end;
procedure TMyThread.Execute;
begin
  FTimer:=TTimer.Create(nil);
  try
    try
      FTimer.Enabled:=true;//false
      FTimer.OnTimer:=TimerProc;
      while GetMessage(MsgRec, 0, 0, 0) do begin
        TranslateMessage(MsgRec);
        DispatchMessage(MsgRec)
      end;
      Terminate;
    finally
      FSocket.Free;
    end;
  finally
    FTimer.Free;
  end;
end;

exports
Add;

begin

end.
搜索更多相关主题的帖子: DLL 
2010-08-01 01:27
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:100 
1、这个dll代码不完整,差的东西较多。如
procedure TMyThread.KillIt;
  begin
    PostMessage(Handle,WM_QUIT,0,0); //给谁发消息,自己的窗口?没见窗体对象声明。别的窗体?同样没有。
  end;

procedure TMyThread.Execute;
begin
  FTimer:=TTimer.Create(nil);
  try
    try
      FTimer.Enabled:=true;//false
      FTimer.OnTimer:=TimerProc;
      while GetMessage(MsgRec, 0, 0, 0) do begin
        TranslateMessage(MsgRec);
        DispatchMessage(MsgRec)
      end;
      Terminate;
    finally
      FSocket.Free;    //这里更加匪夷所思,居然还有个未声明的SOCKET对像。
    end;
  finally
    FTimer.Free;
  end;
end;

2、导出函数更加离奇。
exports
Add;

这个Add函数被dll内部定时调用,现在又导出给外部调用,怎么保证数据更新同步哪(外部调用时,调用的数据可能还没更新,或更新多次了。这样就失去了时钟的意义)?

综上所述,原作者可能是这样设计的,dll中有一个窗体,上面使用了TTime和TClientSocket控件,其中TTime控件用于计时
产生数据,TClientSocket控件用于与外部程序通讯,传递数据?!这也太@#$%!&了。

不过用Socket通讯到确实可以避免使用回调函数。但是效率肯定不是一个量级的。





举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-08-01 09:12
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
讲来也是,很难编译,能否给出一个具有定时器功能,导出函数不需指针的代码,
2010-08-01 15:25
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
那就用消息吧,效率稍低。

程序代码:
unit Unit1;

interface

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

const
  WM_MYDATAADD = WM_USER + 107;   //定义消息常量,跟 dll 中一致

type
  TForm1 = class(TForm)
    mmo1: TMemo;
    btn1: TButton;
    btn2: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
    procedure OnDataMsg(var msg: TMessage);message WM_MYDATAADD; //处理自定义消息
  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(Hand: DWORD):BOOL;stdcall;external 'Project1.dll';

procedure TForm1.btn1Click(Sender: TObject);
begin
  Init(Handle);  //改为传递窗口句柄
  if Start(1,150) then
    btn1.Enabled:= False;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  if Stop then
    btn1.Enabled:= True;
end;

procedure TForm1.OnDataMsg(var msg: TMessage);
begin
  mmo1.Lines.Add(IntToStr(msg.WParam));   //把发来的数值显示出来
end;

end.
TimerGroup.rar (246.5 KB)


举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-08-01 17:48
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
鱼兄,我需要调用DLL的终端很简单,不能定义复杂的类型,是面向过程的,甚至不能用指针,所以好多细节只能在DLL中实现,调用程序向DLL传递的参数也只有数据类型和字符串,能否帮我将你的DLL改一下,输出函数无需传参?
2010-08-01 23:24
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
晕,现在没有任何复杂参数类型啊。

function Start(TimeFlg: Integer;
  TimeElp: DWORD):BOOL;stdcall;external 'Project1.dll';  //一个整数,一个无符号整数。

function Stop:BOOL;stdcall;external 'Project1.dll';      //无参

function Init(Hand: DWORD):BOOL;stdcall;external 'Project1.dll';  //一个无符号整数

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-08-02 11:07
快速回复:DLL问题
数据加载中...
 
   



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

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