Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 16509|回复: 23

调用外部exe程序的DEMO(wince测试通过)

[复制链接]

该用户从未签到

发表于 2009-6-18 17:27:20 | 显示全部楼层 |阅读模式
lazarus调用外部exe程序的方法和delphi原有的Shellexecute,Winexec方式不一样。
为了方便大家学习,写了一个DEMO,已经传上,在附件中


add by bugxiong 20090619
--------------------------------------------------------------------------------
早上谦卑同学告之,我给出的方法在wince下实现不了。看来此方法只能在win/linux下使用
随即又让我找到一更好的方法,并由谦卑测试通过,OK,成功,wince开发板下测试通过。

请下载
--------------------------------------------------------------------------------
end by

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

x
回复

使用道具 举报

该用户从未签到

发表于 2009-6-18 17:28:57 | 显示全部楼层
^_^,我就是传说中的恶魔天使
我要看~~~
哈哈
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2009-6-18 17:30:19 | 显示全部楼层
下载啊.学习一下啊
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2009-6-18 17:34:16 | 显示全部楼层
下载啊.学习一下啊
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2009-6-18 17:48:29 | 显示全部楼层
估计有个地方需要修改!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2009-6-18 17:57:20 | 显示全部楼层
呵呵,比我想象的代码要差。
Lazarus为了兼容多平台,建议用TProcess来启动程序。在那些启动后不管的程序,可以这样,但是对于某些文件的打开就有问题了。比如启动word文档什么的。还有一点很奇怪,如果用WaitForSingleObject来实现RUNWAIT功能是要注意不能用INFINITY参数,而是应该用一小段时间加Application.ProcessMessage的循环来实现。否则会出现有些程序无法启动,同时导致原来的程序僵死。
下面是我的一段用于WINCE的RUNWAIT代码,分享一下,其中的ShellExecute可以用CreateProcess代替
  1. function RunWait(FileName: WideString): boolean;
  2. var
  3.   info: SHELLEXECUTEINFO;
  4.   ret:  DWORD;
  5. begin
  6.   FillChar(info, SizeOf(info), 0);
  7.   info.cbSize    := SizeOf(info);
  8.   info.lpFile    := PWideChar(FileName);
  9.   info.lpVerb    := nil;
  10.   info.fMask     := $440;
  11.   //SEE_MASK_NOCLOSEPROCESS($00000040)|SEE_MASK_FLAG_NO_UI($00000400);
  12.   info.dwHotKey  := 0;
  13.   info.hIcon     := 0;
  14.   info.hInstApp  := 0;
  15.   info.hkeyClass := 0;
  16.   info.hProcess  := 0;
  17.   info.hwnd      := 0;
  18.   info.lpClass   := nil;
  19.   info.lpDirectory := nil;
  20.   info.lpIDList  := nil;
  21.   info.lpParameters := '';
  22.   info.nShow     := SW_SHOW;
  23.   ShellExecuteEx(@info);
  24.   if info.hProcess < 32
  25.   then Exit(False);
  26.   Application.ProcessMessages;
  27.   repeat
  28.     ret := WaitForSingleObject(info.hProcess, 500);
  29.     Application.ProcessMessages;
  30.   until ret <> WAIT_TIMEOUT;
  31.   Exit(True);
  32. end;
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2009-6-19 08:45:12 | 显示全部楼层
我在开发版上测试是不可以打开其它程序的.???WINCE
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2009-6-19 08:59:53 | 显示全部楼层
引用第6楼hdj2013于2009-06-19 08:45发表的  :
我在开发版上测试是不可以打开其它程序的.???WINCE
要特别注意的是WINCE是UNICODE支持的系统,但Lazarus内部函数都是支持ANSI,文件名要转换一下,特别是有汉字的时候。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2009-6-19 11:03:16 | 显示全部楼层
早上谦卑同学告之,我给出的方法在wince下实现不了。看来此方法只能在win/linux下使用
随即又让我找到一更好的方法,并由谦卑测试通过,OK,成功,wince下测试通过。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2009-6-19 11:06:39 | 显示全部楼层
应该是开发板下测试通过
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 21:03 , Processed in 0.053284 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表