Delphi里调用DLL里的对话框遇到一个很奇怪的问题。。。好人们帮忙看一下

JKLJJLJLK 2017-01-12 04:28:22
在DLL中加入MessageBox,从程序中调用时弹出提示信息对话框,然后点击确定后程序窗体就跑到其他程序窗体的后面了,到底咋回事啊?
下面是DLL中的对话框代码
procedure ShowMsgInfo(strInfo:PChar);stdcall;
begin
Application.MessageBox(strInfo,'提示',MB_OK+MB_ICONINFORMATION);
end;
...全文
338 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
santiaodahan 2017-01-16
  • 打赏
  • 举报
回复
结分啦,谢谢各位大神,我想每次都穿句柄参数有点麻烦,我用MessageBox,但是句柄用GetForegroundWindow获取可以吗? DLL代码:
procedure ShowMsgInfo(strInfo:PChar)stdcall;
begin
  MessageBox(GetForegroundWindow,strInfo,'提示',MB_OK+MB_ICONINFORMATION);
end;
[/quote] 可以这么用。不过GetForegroundWindow有返回为NULL的时候,比如通过Application.Minimize;窗口最小化的时候返回句柄为空,MessageBox对话框就会出现在任务栏上。
JKLJJLJLK 2017-01-16
  • 打赏
  • 举报
回复
引用 8 楼 santiaodahan 的回复:
MessageBox函数例子:MessageBox(Ahandle,'对话框内容!','提示',MB_OK+MB_ICONInformation);
引用 9 楼 suiyunonghen 的回复:
Application.MessageBox使用的是前置在应用程序的Handle,如果你Dll不带包,那么Dll和宿主中的Application是两个对象,你在DLl中的Application.MessageBox实际上是前置在Dll的Application最前,和你的宿主无关,最好的办法是用MessageBox然后获得前置窗口Handle,作为参数放进去则可
结分啦,谢谢各位大神,我想每次都穿句柄参数有点麻烦,我用MessageBox,但是句柄用GetForegroundWindow获取可以吗? DLL代码:
procedure ShowMsgInfo(strInfo:PChar)stdcall;
begin
  MessageBox(GetForegroundWindow,strInfo,'提示',MB_OK+MB_ICONINFORMATION);
end;
不得闲 2017-01-13
  • 打赏
  • 举报
回复
Application.MessageBox使用的是前置在应用程序的Handle,如果你Dll不带包,那么Dll和宿主中的Application是两个对象,你在DLl中的Application.MessageBox实际上是前置在Dll的Application最前,和你的宿主无关,最好的办法是用MessageBox然后获得前置窗口Handle,作为参数放进去则可
santiaodahan 2017-01-12
  • 打赏
  • 举报
回复
MessageBox函数例子:MessageBox(Ahandle,'对话框内容!','提示',MB_OK+MB_ICONInformation);
santiaodahan 2017-01-12
  • 打赏
  • 举报
回复
dll加一个参数,传入调用者的句柄给dll中的Application.Handle 或者直接使用API函数MessageBox(引用Windows),使用后者没有这个问题。但最好也传入主窗体句柄,否则对话框会出现在任务栏上。Application.MessageBox是API函数MessageBox的包装,更复杂。
看那山瞧那水 2017-01-12
  • 打赏
  • 举报
回复
dll的Handle:= 主程序的Handle
JKLJJLJLK 2017-01-12
  • 打赏
  • 举报
回复
引用 3 楼 santiaodahan 的回复:
引用 2 楼 QQQ541825707 的回复:
[quote=引用 1 楼 santiaodahan 的回复:] 帖代码吧,至少能重现出这个问题才能解决。
刚才补充了
最好帖完整了,dll和调用的代码。可能不是对话框的问题。[/quote] DLL代码:
//定义过程:提示用户信息
procedure ShowMsgInfo(strInfo:PChar);stdcall;
begin
  Application.MessageBox(strInfo,'提示',MB_OK+MB_ICONINFORMATION);
end;
exports    
     ShowMsgInfo;
主程序代码:
procedure TForm1.btn1Click(Sender: TObject);
var
  strVal:string;
begin
  strVal:=edt1.Text;
  ShowMsgInfo(PChar(strVal));
end;//按钮btn1的单击事件
lyhoo163 2017-01-12
  • 打赏
  • 举报
回复
顶一下,末知。
santiaodahan 2017-01-12
  • 打赏
  • 举报
回复
引用 2 楼 QQQ541825707 的回复:
引用 1 楼 santiaodahan 的回复:
帖代码吧,至少能重现出这个问题才能解决。
刚才补充了
最好帖完整了,dll和调用的代码。可能不是对话框的问题。
JKLJJLJLK 2017-01-12
  • 打赏
  • 举报
回复
引用 1 楼 santiaodahan 的回复:
帖代码吧,至少能重现出这个问题才能解决。
刚才补充了
santiaodahan 2017-01-12
  • 打赏
  • 举报
回复
帖代码吧,至少能重现出这个问题才能解决。

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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