请问一个打开外部文件相关的问题,多谢!(100分)

  • 主题发起人 主题发起人 balloy
  • 开始时间 开始时间
B

balloy

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在我的程序中,启动外部的编辑器来打开特定的文件,当程序结束后,再重新用<br>我程序中的控件(如Webbrowser)打开编辑过的文件。<br><br>因为文件类型可能很多,我不希望使用OpenProcess,只好用ShellExecuteEx,程序片段如下:<br>procedure EditExternalFile( const strFileName : string );<br>var<br> ShExecInfo : TSHELLEXECUTEINFO;<br> bReturn : Boolean;<br>begin<br><br> // 这个操作是为了防止Ie独占文件<br> frmMain.wbContent.Navigate('about:blank');<br><br> ShExecInfo.cbSize := sizeof(TSHELLEXECUTEINFO);<br> ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS;<br> ShExecInfo.Wnd := Application.Handle;<br><br> ShExecInfo.lpVerb := 'edit';<br> ShExecInfo.lpFile := PAnsiChar(strFileName);<br> ShExecInfo.lpParameters := '';<br> ShExecInfo.lpDirectory := nil;<br> ShExecInfo.nShow := SW_SHOW;<br><br> bReturn := ShellExecuteEx(@ShExecInfo);<br><br> if ( not bReturn ) then begin<br> ShExecInfo.lpVerb := 'open';<br> bReturn := ShellExecuteEx(@ShExecInfo);<br> end;<br><br> if ( not bReturn ) then begin<br> ShExecInfo.lpVerb := '';<br> ShExecInfo.lpFile := PAnsiChar('rundll32.exe shell32.dll,OpenAs_RunDLL ' + strFileName);<br> bReturn := ShellExecuteEx(@ShExecInfo);<br> end;<br><br> if ( bReturn ) then begin<br> while WaitForSingleObject(ShExecInfo.hProcess, 100) = WAIT_TIMEOUT do<br> begin<br> Application.ProcessMessages;<br> if Application.Terminated then exit;<br> end;<br><br> frmMain.wbContent.Navigate( strFileName );<br> end;<br>end;<br><br>我的想法是,首先尝试"edit"操作,不成功则继续尝试"open"操作,最后,只好调出“打开方式”对话框。<br>结果基本正常,但比如对ppt文件,由于没有"edit"操作,操作系统竟然自己弹出了一个对话框,告诉我<br>“该文件没有关联程序”!我想不显示这个对话框,但不知道该怎么做。<br><br>希望大家帮帮忙啊!多谢!多谢!
 
对了,还有一个问题,可不可以做到执行外部程序后,我的程序就不再接受用户的任何消息,<br>就好像外部程序是我程序的一个Modal窗口一样?谢谢!
 
1。你可以先判断某类文件的后缀呀,如果该类文件有关联程序,那么它就会在注册表里写有<br>信息,并指明与它关联的程序。这样,就过滤掉了没有关联程序的文件类型,因此不会出现<br>那个对话框了。<br><br>2。在启动外部程序的同时,你让你的程序窗口的enabled:=false就可以了。<br>你当然可以用一个timer,检测当外部程序的窗口关闭时,让你的程序窗口enabled:=true.<br>另外,要让一个外部程序像你自己的程序的一个Modal窗口,我不知道有没有什么API可以<br>做到,但你同样可以利用那个timer,检测当外部程序窗口不处于最上层时,用API设置<br>其为前景窗口。<br><br>以上是我的思路,没有验证。<br>
 
to iseek:<br>非常感谢你的回答。通过查找注册表,你的方法似乎是可行的。我现在才发现,可以<br>从".txt"找出"textfile",再找出相关操作,非常感谢,我以前以为要为每种不同的文件编写不同的代码呢。<br><br>不过,高兴之余,还是想问问,有没有更简单一些的办法?可以让我不要大改的?
 
运行一个程序并等待它终止 <br><br>function WinExecAndWait32(<br>&nbsp; FileName:String; Visibility :integer):integer;<br>var<br>&nbsp; zAppName:array[0..512] of char;<br>&nbsp; zCurDir:array[0..255] of char;<br>&nbsp; WorkDir:String;<br>&nbsp; StartupInfo:TStartupInfo;<br>&nbsp; ProcessInfo:TProcessInformation;<br>begin<br>&nbsp; StrPCopy(zAppName,FileName);<br>&nbsp; GetDir(0,WorkDir);<br>&nbsp; StrPCopy(zCurDir,WorkDir);<br>&nbsp; FillChar(StartupInfo,Sizeof(StartupInfo),#0);<br>&nbsp; StartupInfo.cb := Sizeof(StartupInfo);<br>&nbsp; StartupInfo.dwFlags := STARTF_USESHOWWINDOW;<br>&nbsp; StartupInfo.wShowWindow := Visibility;<br>&nbsp; if not CreateProcess(nil,zAppName,<br>&nbsp; &nbsp; { pointer to command line string }<br>&nbsp; &nbsp; nil, { pointer to process security attributes }<br>&nbsp; &nbsp; nil, { pointer to thread security attributes }<br>&nbsp; &nbsp; false, { handle inheritance flag }<br>&nbsp; &nbsp; CREATE_NEW_CONSOLE or { creation flags }<br>&nbsp; &nbsp; NORMAL_PRIORITY_CLASS,<br>&nbsp; &nbsp; nil, { pointer to new environment block }<br>&nbsp; &nbsp; nil, { pointer to current directory name }<br>&nbsp; &nbsp; StartupInfo, { pointer to STARTUPINFO }<br>&nbsp; &nbsp; ProcessInfo) then Result := -1 <br>&nbsp; &nbsp; { pointer to PROCESS_INF }<br>&nbsp; else begin<br>&nbsp; &nbsp; WaitforSingleObject(ProcessInfo.hProcess,INFINITE);<br>&nbsp; &nbsp; GetExitCodeProcess(ProcessInfo.hProcess,Result);<br>&nbsp; end;<br>end; <br><br>
 
你可以写一个函数或过程,解决某类文件是否有关联程序的问题.<br>如果有关联程序,用下面的过程就可以打开一个有关联程序的文件了.<br>procedure URLink(URL: PChar);<br>begin<br>&nbsp; &nbsp;ShellExecute(0, nil, URL, nil, nil, SW_NORMAL);<br>end;<br>其中,URL可以是网址,也可以是文件名<br>不知道我理解得对不对.<br>
 
TO jsxjd<br>你提到的例子我见过,但没有试过,应该可行吧,你试验过吗?
 
To jsxjd<br>你的代码不行啊
 
jsxjd可能是没看清楼主的意思。<br>其实直接用open就行了,好象只有htm格式的才需要edit,还有什么其它格式需要吗?
 
不好意思,今天白天出去了,拖到现在才给分,问题解决了,多谢各位!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部