小问题,关于打开外部文件的问题.熟悉WIN32编程者请进(70分)

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

base7

Unregistered / Unconfirmed
GUEST, unregistred user!
用我的程序调用系统程序打开外部的文本文件<br>1.如果是系统已有关联的程序,就用默认的程序打开,如.txt用notepad,.doc用Word<br>2.如果没有关联,一律用notepad打开,如.bill,.money等都用notepad打开<br>如何实现这个功能?<br>我现在用的是ShellExecuteEx函数,代码如下:<br>
代码:
var<br>&nbsp; info:ShellExecuteInfo;<br>begin<br>&nbsp; FillChar(Info, SizeOf(Info), 0);<br>&nbsp; info.cbSize := SizeOf(ShellExecuteInfo);<br>&nbsp; info.Wnd &nbsp;:= Handle;<br>&nbsp; info.lpVerb := 'Open';<br>&nbsp; info.lpFile := Pchar(MyFileName);<br>&nbsp; info.nShow := SW_SHOWNORMAL;<br>&nbsp; info.fMask := SEE_MASK_NOCLOSEPROCESS;<br>&nbsp; ShellExecuteEx(@info);
<br>可是无法实现我的第二个功能,望高手出招!
 
个人认为应该捕获ERROR_NO_ASSOCIATION,但是具体应该如何操作呢?
 
NOTEPAD.EXE d:/a.txt<br>就是直接永NOTEPAD打开d:/a.txt<br>这样对你有帮助吗?
 
呵呵,说得太简单了吧?<br>你是说用winexec或shellexecute来直接调用,可是这不符合我的需求呀
 
这个问题你查一下一定能找到。
 
这个问题和注册表有关系,所有有关联的信息都在注册表的HKEY_CLASSES_ROOT中,你可以看看<br>。txt那一项,那就是和Notepade关联的地方。
 
同意楼上的说法,在注册表中获得信息,然后就可以确定用什么程序打开了。
 
楼上诸位的方法的确能实现,这个我事先早就想过了.<br>可是你们不觉得这太麻烦了吗?而且拐了很多弯<br>ShellExecuteInfo中的参数lpVerb:'open'本来就可以根据关联的程序打开的,何苦再自己去找?<br>我的疑问其实应该很简单呀,就是ERROR_NO_ASSOCIATION消息应该如何捕获并利用,换句话说:<br>如何使用GetLastError来实现我上面说的内容.本人M$ SDK学的不多,所以想请熟悉的人指点一二...
 
还有: to 妄语<br>如果你找到的话能否麻烦把话题ID告诉我?<br>我在提问前早就搜了一遍,可是没有看见相似内容的呀
 
我在后面加上:<br>
代码:
 &nbsp;if GetLastError = ERROR_NO_ASSOCIATION	 then<br>&nbsp; &nbsp; Winexec(Pchar('NotePad ' + lbFile.FileName), SW_SHOWNORMAL);
<br>算是很难看的解决了这个问题,中间抛出一个异常,各位还有更好的方法吗?<br>如何把那个"关联文件"的异常对话框去掉?用try except好像无法捕获?
 
没看完题,差点出丑,哈哈。<br>我也学习学习
 
&nbsp;if shellexecute(0,'open',pchar(filename),nil,nil,SW_NORMAL) &lt;= 32 then<br>&nbsp; &nbsp; &nbsp; shellexecute(0,'open',pChar('notepad.exe'),pChar(filename),nil,SW_NORMAL);<br>
 
to base7:<br>要去掉那个对话框应该不难啊,把你前面那段程序改一下:<br>info.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;<br>不就行了?
 
agree with peng_qs
 
用 FindExecutable函数可以找到一个文件对应的Open操作的执行程序名,<br>如果没有对应的执行程序的话,返回值为SE_ERR_NOASSOC,这时候你再调用<br>Notepad.exe打开那个文件。例:<br>var<br>&nbsp; buffer: array[0..256] of char;<br>&nbsp; r: integer;<br>begin<br>&nbsp; r:=FindExecutable(YourFileName,'',buffer);<br>&nbsp; case r of<br>&nbsp; &nbsp; SE_ERR_FNF: ;// 文件不存在!<br>&nbsp; &nbsp; SE_ERR_NOASSOC: // 文件未关联<br>&nbsp; &nbsp; &nbsp; &nbsp;WinExec(YourFileName,SW_SHOW);<br>&nbsp; &nbsp; else if r&gt;32 then // 文件存在且有关联<br>&nbsp; &nbsp; &nbsp; DoYourShellExecuteFunction;<br>&nbsp; end;<br>end;<br>
 
多人接受答案了。
 
后退
顶部