通过双击文件,怎样使windows调用我自己编的程序打开这个文件?
我是这样做的:
先生成了一个自己已知格式的文件xxx.xyz,然后将该类.xyz文件的打开方式设我的程序my.exe。
这样双击xxx.xyz,系统就会调用my.exe。但是my.exe 中怎样处理才能得到我需要打开的文件名?
我试过用获取命令行的方式:
通过AfxGetApp()->m_lpCmdLine来获取这个文件名。
系统提示了一个很怪的消息框“未发生错误!”
没有找到xxx.xyz文件。
解决方案 »
你要这样注册
“my.exe” “%1”
在资源管理器菜单选-文件夹选项,在文件类型中新建一个xyz文件类型,指定打开方式就行了啊
如楼上说的,在[文件夹选项里],指定文件类型和打开方式
或者在注册表中指定
最简单的方法就是选择你要打开的文件,点击鼠标右键,选择打开方式,在弹出的对话框中选择浏览,找到相应的打开程序,同时选中始终用选择的程序打开文件,再确定就可以了
如果你的my.exe要作为安装程序安装到目标机器,那就要在安装的时候修改目标机器的注册表,把对应的文件类型和打开方式添加到注册表
建议楼主再仔细学习一下MFC的 Document/View ,不妨用向导编一个测试程序试试。
兄弟们啊!谢谢了,可是你们没有理解我的意思我问题中已经说明了,系统已经调用了my.exe 只是my.exe不知到我双击的那个文件!
关键是在my.exe中怎么处理,才能将获得这个文件名(绝对不是用鼠标单击打开文件按钮弹出CFileDialg这样的手动操作).我想知道,双击xxx.xyz文件后系统做了什么操作,向my.exe传了些什么参数,怎样才能利用这些参数自动的打开xxx.xyz文件?
向Windows注册你文件的扩展名就行了……..
文档视图结构就是这样的.
按2,3,4楼兄弟的方法去做,如果还是提示找不到文件,就应该是你程序中处理AfxGetApp()->m_lpCmdLine的问题了。兄弟不妨贴出代码看看啊
File-type associations is stored in registry.
see
http://www.codeproject.com/shell/cgfiletype.asp
兄弟们啊!谢谢了,可是你们没有理解我的意思我问题中已经说明了,系统已经调用了my.exe 只是my.exe不知到我双击的那个文件!
关键是在my.exe中怎么处理,才能将获得这个文件名(绝对不是用鼠标单击打开文件按钮弹出CFileDialg这样的手动操作).我想知道,双击xxx.xyz文件后系统做了什么操作,向my.exe传了些什么参数,怎样才能利用这些参数自动的打开xxx.xyz文件?
首先,在编写my.exe时,要传入一个文件名作为参数给主程序,取到参数后判断,如果参数为空就不打开任何文件,如果非空,判断文件是否存在,不存在则提示文件无效,最后就是打开由参数传进来的文件名,然后编译生成你的exe
然后在做上述的文件关联,这样你双击关联文件就能调用你的exe打开了
用这个取得传递exe后传递的参数:AfxGetApp()->m_lpCmdLine
如果是双击,就是传递的被双击的文件名。
自己想怎么处理怎么处理。
奇怪的是:我通过工程属性添加的命令行
和通过双击文件得到的命令行是完全相同的都是”C:\Documents and Settings\Administrator\桌面\测试包\xxx.xyz”但是前者能打开文件,
后者却提示“未发现错误!”没有打开文件。
CString st = AfxGetApp()->m_lpCmdLine;
AfxMessageBox(st);
CFile file( st, CFile::modeRead );
因为传递命令行参数时,
有个小细节:
如果全路径中含有空格,那么传递的命令行参数将加上引号。
不信你试一下c:\a.txt这样的文件肯定不会出错
因此,你要做的就是去掉这个引号, CString st = AfxGetApp()->m_lpCmdLine;
if(st.Left(1)==”\”“)//如果第一个字符是引号,那么去掉之
{
st=st.Mid(1,st.GetLength()-2);
}
AfxMessageBox(st);
CFile file( st, CFile::modeRead );