启动DLL中封装的窗体问题

Lenic__ 2009-02-28 07:56:15
问题是这样的:

1. 如何把MDI子窗体封装在DLL动态链接库文件中?

2. 如何启动这个封装在DLL动态链接库文件中的子窗体?

3. 启动起来的MDI子窗体对Tab按键能够响应。

具体情况是这样的:

在DLL中的子窗体上面有两个文本框(Edit),如果不封装在DLL,

而是直接集成在EXE中,能够根据Tab顺序响应Tab按键,

但是如果封装在DLL中,就不能够响应Tab按键。

现在最重要的就是解决DLL中封装的窗体响应Tab按键的问题。

希望是这样解决问题的:

1. 不增加额外的代码。主要是指对每个控件设置一个跳转代码。

2. 利用新的技术或者设置一些什么。

这段期间由于找工作原因,很可能玩两天结贴,但是相信我一定会结贴,您可以看我的结贴率。

至于分数,考虑到这个问题的难度,特奉上100分供大家讨论。

抱歉,在这里先感谢大家了!
...全文
265 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
starluck 2009-03-03
  • 打赏
  • 举报
回复


呵呵,分無所謂的。

WinExec(PWIDEChar('Notepad'),SW_SHOW)

這裏是PWideChar 要注意。
Lenic__ 2009-03-03
  • 打赏
  • 举报
回复


starluck: 问题解决了,你打出来的命令没错,按照这样打出来的没错,算到下面这段代码就不行了:


procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
begin
s := 'Notepad';
WinExec(PWideChar(s),SW_SHOW);
end;


这段代码编译无法通过,参数格式不对;

换成WinExec(PAnsiChar(s),SW_SHOW)可以编译过去,但是执行之后,不会出现任何结果。

在研究了7楼提供的那个链接之后,终于弄明白是怎么回事了。

Delphi 2009中默认的String类型是WideChar类型的,而非以前默认的AnsiString类型的,

这样强制转化为PAnsiChar自然就会出现问题,所以在Delphi 2009中需要多一步的转化,看下面这段代码:


procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
begin
s := 'Notepad';
WinExec(PAnsiChar(AnsiString(s)),SW_SHOW);
end;


这就是结果,在这里贴出来,给需要的人!
Seamour 2009-03-02
  • 打赏
  • 举报
回复
没时间试,看看有没有可能是模块使用Appliaction不同产生的消息发放的问题
hsmserver 2009-03-02
  • 打赏
  • 举报
回复
1、
工程文件中
var
DLLAPP:TApplication;
procedure ExitDLL(Reason: Integer);
begin
if Reason=DLL_PROCESS_DETACH then
begin
Application:=DllApp;
end;
end;

begin
DllApp:=Application;
DLLProc:=@ExitDLL;
end.

procedure ShowMDIForm(App:TApplication;ParentForm:TForm);stdcall;
begin
Application := App;
if not Assigned(frmMDIForm) then
frmMDIForm:=TfrmMDIForm.Create(ParentForm);
frmMDIForm.Show;
end;


//子窗体关闭的时候
Action:=caFree;
frmMDIForm:=nil;
2、
TShowForm=procedure (App:TApplication;ParentForm:TForm);stdcall;
FShowForm:TShowForm;
begin
@FShowForm:=GetProcAddress(FDLLHandle,'ShowMDIForm');//FDLLHandle为DLL句柄
FShowForm(Application,Application.MainForm);
end;
3、
procedure WMHotKey(var Msg:TWMHotKey); message WM_HOTKEY;
var
H:THandle;
begin
if Msg.HotKey=id_SnapShot then
begin
H:=GetSysFocus;
while IsWindow(H) and (H<>frmMain.Handle) do
begin
SendMessage(H,WM_NEXTDLGCTL,0,0);
H:=GetParent(H);
end;
end;
end;

procedure WMACTIVATEAPP(var Msg:TMessage);message WM_ACTIVATEAPP;
begin
if Boolean(Msg.WParam) then
RegisterHotKey(frmMain.Handle,id_SnapShot,0,VK_TAB)//定义热键 在程序得到焦点时
else
UnRegisterHotKey(frmMain.Handle,id_SnapShot);//释放已经登记的热键 在程序失去焦点时
end;


//此外在DLL中加一个CloseForm方法,用于应用程序退出时关闭子窗口
procedure CloseForm;stdcall;
begin
if Assigned(MDIForm) then
MDIForm.Close;
end
starluck 2009-03-02
  • 打赏
  • 举报
回复
DLL 封裝的問題,要描述清楚才好解決。
starluck 2009-03-02
  • 打赏
  • 举报
回复
借问问题的机会,再问下这个问题吧,很简单:

WinExec这个函数再Delphi 7中用PChar引用字符串就可以使用了。

WinExec(PChar('Notepad'),SW_SHOW);

但是到了Delphi 2009中就不能用了,现在的问题就是:

在Delphi 2009中应该如何使用WinExec这个API函数?

谢谢了!


2009


WinExec(PWideChar('Notepad'),SW_SHOW);
fang 2009-03-02
  • 打赏
  • 举报
回复
先说说你是怎么封装你的带窗体的动态库的!
Lenic__ 2009-03-02
  • 打赏
  • 举报
回复

还没打完呢。。。

starluck:这位头像很帅的超级大大,之前我曾经用WinExec(PAnsiChar('Notepad'),SW_SHOW)

这个命令试过,不起作用,所以我只能带回去。这里先给你10分好吗?

3150379:你见解很精辟,但是带包编译了,还要DLL干吗。。。
Lenic__ 2009-03-02
  • 打赏
  • 举报
回复

晕死啊,打了半天的字提交没成功。。。

这次不多说了,非常感谢两位超级大大对我问题的关注,现在是网吧,我只能把问题带回去,贴先结了。

总不能因为我个人的原因,让这么多热心人等着。

这样吧:

hsmserver:这位超级大大很辛苦,贴了这么多代码,而且专门针对我的问题,这里给60分了,

相信这点分不多。

yct0605:非常感谢你帮我找了适合的资料,给你30分吧,别见怪,你比人家hsmserver
人家少很多事呢
Lenic__ 2009-03-02
  • 打赏
  • 举报
回复

今天看到这么多人关注这个问题,我非常高兴,但是现在宿舍里面还没有开网,

所以说只能先把这些问题带回去,自己试验之后才能知道结果。这些问题先这样吧。

至于分数的问题,我按照顺序分给大家:

hsmserver:这位超级大大,很辛苦,贴了这么多代码,我没时间看了,回去仔细研究————50分

yct0605:感谢你帮我找了点资料,我大概看了下,希望能够符合我的要求————30分

starluck:也是个超级大大,你头像挺酷的,之前我曾经试过用PAnsiChar('Notepad')转化不成功,

所以也不敢确定,先给你20分吧。

我先结贴了,但是问题可能还没有解决,我先把解决方案拿回去,如果有什么不懂的问题再向大家提问,可以吗?

其实我感觉,分数是次要的,主要是学会东西,在这里先感谢大家了。

补充一点,8楼的见解很精辟,这个方面我也想过,不过说起来,真要是带包编译,那DLL就没有任何意义了,呵呵。

五维思考 2009-03-02
  • 打赏
  • 举报
回复
其实DLL封装MDI子窗体没那么神秘,只要带包编译,一切问题迎刃而解
Lenic__ 2009-02-28
  • 打赏
  • 举报
回复
借问问题的机会,再问下这个问题吧,很简单:

WinExec这个函数再Delphi 7中用PChar引用字符串就可以使用了。

WinExec(PChar('Notepad'),SW_SHOW);

但是到了Delphi 2009中就不能用了,现在的问题就是:

在Delphi 2009中应该如何使用WinExec这个API函数?

谢谢了!

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧