SHELLEXECUTEINFO打开指定的文件,请看清问题后再回答。(100分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用SHELLEXECUTEINFO打开指定的文件,本来只要指定文件名就行了。
...
FillChar(Info, SizeOf(Info), 0);
info.cbSize := SizeOf(ShellExecuteInfo);
info.Wnd := Handle;
info.lpVerb := 'open'; //用open的方式
info.lpFile := PChar(TmpFileName); //这个地方指定好文件名即可
info.nShow := SW_SHOWNORMAL;
info.fMask := SEE_MASK_NOCLOSEPROCESS;
ShellExecuteEx(@info);
这样就可以打开文件,这一点我是知道的。但问题来了,因为我想文件以临时文件的方式
存在,也就是说TmpFileName本来的名字是'123.doc',但我相以123.tmp的形式放在硬盘上,
但我要打开这个文件。文件的类型多种多样,也有可能是.xls,.txt,所以我想传送临时文
件名,打开方式指定用word,这样就可以用WORD打开这个123.tmp。
因为Windows能够根据扩展名自动打开某个文件。所以我想在此处怎么改一下,让
SHELLEXECUTEINFO通过我指定的临时文件名,但却用正确的方法打来此文件。
因为我要得到打开这个文件的进程,所以必须用SHELLEXECUTEINFO来实现。不知哪位能
帮我一把。大伙儿看看,我的表述清楚了没有?谢谢啦!
 
应该不能这样的,它是根据注册表的信息来打开你的文件,跟你双击文件一样
因此,你生成临时文件的的时候不要更改扩展名就行了。
 
xianjun兄,如果我生成临时文件不改扩展名,那么用户还是能够看到文件类型呀。那么,他
就可以直接打开了。还是可以自己拷贝一份呀。我是想将所有的文件都以tmp形式,自己在
数据库中保存文件类型,尽可能的使其更安全一些。
 
我觉得应该没其他办法了吧,又不可能根据扩展名来指定打开文件的程序的。
既然已经生成了临时文件,就没有什么安全性可言了。毕竟已经保存在人家的硬盘上了
即使你把扩展名改了,别有用心的用户也总有办法发现它是什么格式文件的。[:)]
至于说防止用户拷贝,这是行不通的,既然他都能打开看了,就象以前讨论过的一样,他
记下来,然后再在别的机上敲出来,或者更绝的,先用数码相机拍下来,然后用OCR再识别
所以,我个人认为这样做根本没有意义。 这是应该用另外的机外手段来进行的。[:D]
 
XianJun,我是想尽量做到这点。因为如果我存成任意的名字,如111243.tmp,别人是不知
道是什么类型的文件的,而如果是123.doc,别人一打开就知道了。
最重要的是为什么我双击123.doc就能打开word,这说明windows是根据内部注册机制什么的
指定用WORD去找开的这个文件。那么找到这个方法,我的程序中应该也行呀。
 
把 info.lpFile 指定为相应的可执行程序文件名:
如,......../word.exe
将要打开的文件作为 info.lpParameters 如 123.tmp


 
用start aaa.doc 就可以了,
strart后跟执行的文件,系统自动选用合适的程序打开.
 
jsxjd,但是我如何知道这个文件是由哪个执行档打开呢?怎么把他找出来?你能否给段代码?
谢谢!
 
改注册表啊。
打开完后
然后再恢复过来。。。。
与我联系吧QQ:68767468
 
lqldir,我用不了QQ呀。你就在这儿说吧,我不想改注册表,万一中途程序出问题那怎么办?
不过我认为可以在注册表中找到是注册的是哪个执行档。
 
你看下面的方法可以吗
ShellExecute(frmMain.Handle,nil,PChar('WINWORD.EXE'),'123.tmp',nil,SW_SHOWNORMAL);
 
ShellExecute(frmMain.Handle,nil,PChar('WINWORD.EXE'),'123.tmp',nil,SW_SHOWNORMAL);
也行啊.好办法

呵呵
 
我的执行文件是多种,要自己取得,不能写死只用Word,那样我就不用问了。只能用上面我
写的方法来实现。
 
var
strAppName,strword:String;
begin
strAppName:='WINWORD.EXE'; //程序名称
strword:='123.tmp'; //文档名称
ShellExecute(frmMain.Handle,nil,PChar(strAppName),PChar(strword),nil,SW_SHOWNORMAL);
用变量代替就可以了,用你的方法你同样也要先给Info这个变量赋值
 
yanghai0437, 谢谢你的一再热心。
但你得看清楚我问什么呀。请你看清楚我的题意好吗?我如何知道这个文件是用WORD还是
EXCEL还是别的什么程序打开呢?我要的是这个。
 
后退
顶部