关于DLL问题,DLL传参给EXE ( 积分: 100 )

  • 主题发起人 主题发起人 renaihaore
  • 开始时间 开始时间
R

renaihaore

Unregistered / Unconfirmed
GUEST, unregistred user!
比如 DLL里的 TCheckBox 被选中 然后就通知EXE他改了呢?
就是 TCheckBox 被选中 EXE程序里的一个boolean的变量就为TRUE

请问怎么实现?
 
在DLL里定义一个boolean的变量 可以传出
DLL里的 TCheckBox 被选中 DLL里的这个boolean的变量就为TRUE
EXE程序里判断DLL里的 TCheckBox 被选 就调用DLL的传出变量 如果True 则为选中
 
应该使用回调函数来实现,由EXE程序传递给DLL的一个回调函数,在TCheckBox的OnClick事件里调用回调函数通知Exe程序
 
还有没有别的办法?
 
在EXE里定义
TFUN_PCHAR_BOOL=function (str:string):Boolean;stdcall;
//调用DLL函数
function SetDeleteImagePro(fun:TFUN_PCHAR_BOOL):Boolean;
var
FP2B:TFUN_PCHAR2_BOOL;
begin
if ReportLH>0 then
begin
FP2B:=GetProcAddress(ReportLH,PChar('SetDeleteImagePro'));
if Assigned(FP2B) then
begin
FP2B(fun);
end;
end;
function NotPrintImage(FileName:string):Boolean;stdcall;
//把EXE函数地址传到DLL中
SetDeleteImagePro(@NotPrintImage);

剩下的知道怎么做了吧
 
to 康凌

我知道你的意识是 EXE取DLL function 里的函数 然后返回bool
但是 我要的是 DLL里一个tchickbox改变 然后主程序 的BOOL就改变
 
做回调函数就行了
 
在EXE里定义输出函数
DLL里一个tchickbox改变 则调用EXE里函数 改变值!
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
Exports
ChangeChick;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
////////////////////////////////
Unit Unit1;
{$I SetOption.INC}
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, shellapi,
Controls, Forms, Dialogs, StdCtrls, ComCtrls;
Type
TForm1 = Class(TForm)
Edit1: TEdit;
Private
{ Private declarations }
Public
{ Public declarations }
End;
Procedure ChangeChick(ChickBool:Boolean); //Stdcall; Export;
Var
Form1: TForm1;
CB: Boolean;
Implementation
{$R *.dfm}
Procedure ChangeChick(ChickBool:Boolean);
begin
CB:=ChickBool;
end;
End.
 
晕,我做的就是回调呀,你仔细看没有!
把EXE函数地址传到DLL,DLL的checkbox单击的时候,调用该函数,通过参数的形式传到EXE
就可以改变EXE里的bool变量了呀(实在不行给你做个Demo吧)
 
回调函数
dll主程序
type TCheckClick=procedure (b :Boolean) of object;
procedure A(CheckClick:TCheckClick);
begin
Form1:=TForm1.Create(nil);
MyCheckClick:=CheckClick;
Form1.Show;
end;
exports
A;
dll中的checkbox窗体单元
type TCheckClick=procedure (b :Boolean) of object;
var
MyCheckClick:TCheckClick;
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
MyCheckClick(CheckBox1.Checked);
end;
exe程序
type TShowBool=procedure(b:Boolean) of object;
procedure A(ShowBool:TShowBool);stdcall;
external 'TestDLL.dll';
var
Form1: TForm1;
MyShowBool:TShowBool;
implementation

{$R *.dfm}
procedure TForm1.ShowBool(b:Boolean);
begin
if b then
showmessage('yes')
else
showmessage('no');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyShowBool:=ShowBool;
A(MyShowBool)
end;
 
to 银雨辰 你给的代码不全哦 只有DLL窗口程序里的? ChickBool 这个都不知道哪来的


to 康凌 您还是给个 Demo 吧 哈

辛苦2位了
 
回调函数
发送消息
 
真是没办法!
Procedure ChangeChick(ChickBool: Boolean); //Stdcall; Export;
这里不是定义了吗?

这是EXE的代码!!

Exports
ChangeChick;

DLL的checkbox单击的时候,回调函数 ChangeChick
 
后退
顶部