delphi中判断文件是否能打开

coderee 2011-09-23 05:45:51
如下代码
shellexecute(handle,'open',pchar('\\192.168.0.6\tz$\aa.pdf'),nil,nil,sw_shownormal);
当客户端机器没有安装pdf阅读器时,执行以上代码没反应,请问这时该如何提示‘无法打开该文件’?
...全文
257 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq66826628 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jayqiang 的回复:]
可以根据shellexecute的返回值来判断具体情况。

如果返回值 <= 32, 表示执行错误
  返回值可能的错误有:
0 内存不足
2 文件名错误
3 路径名错误
11 EXE 文件无效
26 发生共享错误
27 文件名不完全或无效
28 超时
29 DDE 事务失败
30 正在处理其他 DDE 事务而不能完成该 DDE 事务
31 没有相关联的应用程序
……
[/Quote]

正解!
随行的太阳 2011-09-28
  • 打赏
  • 举报
回复
找shellexecute的函数说明。
某某某 2011-09-28
  • 打赏
  • 举报
回复
如果成功,shellexecute返回值大于32,否则小于32,定义什么变量名无所谓的,
在delphi中shellexecute定义如下:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall;

其中HINST定义为HINST = System.HINST;
HINST = THandle;
THandle = LongWord;
hongss 2011-09-28
  • 打赏
  • 举报
回复
变量名你自己随意。


\\192.168.0.6\tz$\'+qybc.FieldByName('tzh').asstring+'.dwg'
先看看这个文件路径你能读出来不,权限够不

coderee 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hongss 的回复:]
var
H:LongInt;
begin
H:=shellexecute(...
end;
[/Quote]
定义的变量只能用‘H’吗,用了其它的变量怎么不行。
coderee 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hongss 的回复:]
var
H:LongInt;
begin
H:=shellexecute(...
end;
[/Quote]
我的客户端没有安装cad软件,用了如下代码,这个文件实际是存在的,但为什么h的值为2,而不是31
h:=shellexecute(handle,'open',pchar('\\192.168.0.6\tz$\'+qybc.FieldByName('tzh').asstring+'.dwg'),nil,nil,sw_shownormal);
hongss 2011-09-28
  • 打赏
  • 举报
回复
var
H:LongInt;
begin
H:=shellexecute(...
end;
coderee 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jayqiang 的回复:]
可以根据shellexecute的返回值来判断具体情况。

如果返回值 <= 32, 表示执行错误
  返回值可能的错误有:
0 内存不足
2 文件名错误
3 路径名错误
11 EXE 文件无效
26 发生共享错误
27 文件名不完全或无效
28 超时
29 DDE 事务失败
30 正在处理其他 DDE 事务而不能完成该 DDE 事务
31 没有相关联的应用程序
……
[/Quote]

如何获得shellexecute的返回值?
jingtuzhong 2011-09-27
  • 打赏
  • 举报
回复
先判断路径是否存在,再用messagebox
jayqiang 2011-09-27
  • 打赏
  • 举报
回复
可以根据shellexecute的返回值来判断具体情况。

如果返回值 <= 32, 表示执行错误
  返回值可能的错误有:
0 内存不足
2 文件名错误
3 路径名错误
11 EXE 文件无效
26 发生共享错误
27 文件名不完全或无效
28 超时
29 DDE 事务失败
30 正在处理其他 DDE 事务而不能完成该 DDE 事务
31 没有相关联的应用程序


像楼主这样的情况的话,如果客户端没有安装pdf阅读器的话,返回值
应该是31。

所以楼主只要判断返回值是否31即可知道客户端是否安装阅读器

楼主可以试下!
coderee 2011-09-23
  • 打赏
  • 举报
回复
Tregistry类需引用哪个单元?
funxu 2011-09-23
  • 打赏
  • 举报
回复
一个读取键值的例子
procedure TForm1.Button18Click(Sender: TObject);
var reg:Tregistry;
KeyList: TStringList;
i: Integer;
begin
reg:=Tregistry.create;
KeyList := TStringList.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.openkey('HARDWARE\DEVICEMAP\SERIALCOMM', False);
reg.GetValueNames(KeyList);
for i := 0 to KeyList.Count - 1 do
begin
ShowMessage(KeyList[i]);
ShowMessage(reg.ReadString(KeyList[i]));
end;
reg.CloseKey;
reg.free;
KeyList.Free;
end;
funxu 2011-09-23
  • 打赏
  • 举报
回复
我机器上没装,不过思路是
LZ 运行regedit 寻找acrobat的安装路径,然后记下这个键值,每次运行程序时,先读取这个键值,有即可运行pdf

5,388

社区成员

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

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