文件的打开问题。(200分)

  • 主题发起人 主题发起人 mumuwoyou
  • 开始时间 开始时间
M

mumuwoyou

Unregistered / Unconfirmed
GUEST, unregistred user!
在windows中文件与程序的关联,当我们在某一类型的文件(一个或多个)上点击右键,会弹出于这一文件类型关联的
程序,我们选择一种程序,程序启动,调用打开命令打开被选择的文件.关于程序在注册表中的关联表示我知道,我要
问的是,我们在程序的编制时,如何处理这一系统调用,启动程序,打开相应的文件(我们如何知道文件名
并打开)。我在Tale的电子小说阅览器的初始化代码中发现了paramstr,paramstr(0)为程序的文件名,paramstr(1~ ?)为
他的其他参数。请较为详细告诉我原理,给出例程和注释。


1.CSDN上有一个同样的问题(解释一下):
我最近作了一个简单的察看某种格式文件的浏览器,假设文件后缀为*.xxx,我怎样才能使以这样
后缀结尾的文件以我的浏览器为默认浏览器,另外,怎样在双击文件时得到他的全名,因为我显示文件内容的前提是先知道它的文件名。
--回复得分 0 --
补充:文件名是系统通过DDE调用你的OpenDocumentFile(LPCTSTR lpfilename)时传递给你的;当然前提是你使用MFC缺省的处理方式;实际上也可以处理命令行参数象Un1提到的;

--回复得分 0 --
请问各位,怎样在双击文件时得到他的全名并将文件名传给我的程序知道?

--回复得分 0 --
如shines所言,然后当你的程序被启动时,在命令行上就有完整的文件名.


--回复得分 0 --
双击文件名时,文件所在目录即被设置位当前目录,在程序里可以用API函数
DWORD GetCurrentDirectory(
DWORD nBufferLength, // size, in characters, of directory buffer
LPTSTR lpBuffer // address of buffer for current directory
)
获取当前目录,加上文件名即可得到他的全名

--回复得分 0 --
怎么!没有看明白我的上一个帖子?
你只要重载CWinApp::OpenDocumentFile()函数,就不用管文件名从双击来的还是命令行来得到的,而且是全路径!

--回复得分 0 --
正如大家所言,我已经取得了文件名,但无法用WriteProfileString在注册表的HKEY_CLASSES_ROOT内写入shines告诉的内容,好像WriteProfileString只能写在HKEY_CURRENT_USER/SOFTWARE/,有谁指点一下。

--回复得分 10 --
因为WriteProfileString是MFC包装在CWinApp的应用程序注册函数之一,其只能根据应用程序中保存的主键在其子键中增改信息。
你需要自己打开注册表建立HKEY与要写的地方对应,简单的方法是用MFC的CRegKey类,高兴的话也可以用API来写,也没有很麻烦查找RegOpenKeyEx及其相关的函数就可。
****问题是????*********
如果你只是支持一种文件扩展名的话是不需要编程或手工修改注册表的,只需在资源文件中将文档的字符串信息填写完整即可!!
************************


--回复得分 0 --
谢谢各位,可惜分太少了,可能分赃不均。
 
利用:
Case ExtractFileExt() of
'txt': 调用笔记本
'jpg': 调用photoshop
...
End;
 
如果没有什么特殊要求,就是用文件关联的程序去打开,就直接用API: ShellExecute。
例,打开任意文件的函数:
function OpenDocument(DocName,Dir:string):boolean;
begin
Result:=ShellExecute(0,'open', PChar(DocName), nil, PChar(Dir), SW_Show)>32;
end;
 
一、注册文件类型。
1 可以通过文件夹属性添加。
2 可以通过修改注册表
首先在HKEY_CLASSES_ROOT下建主键'.xxx',其缺省值为'xxxFile'。
然后在HKEY_CLASSES_ROOT下建主键'xxxFile',其缺省值为'xxx文件'。
在'xxxFile'下建主键'Shell',在'Shell'下建主键'Open',设其缺省值为'打开(&O)'。
在'Open'下建主键'Command',设其缺省值为你的程序完整路径后加' "%1"'。

以上步骤用程序实现如下:
with TRegistry.Create do
try
RootKey := HKEY_CLASSES_ROOT;
if OpenKey('.xxx', True) then begin
WriteString('', 'xxxFile');
CloseKey;
end;
if OpenKey('xxxFile', True) then begin
WriteString('', 'xxx文件');
if OpenKey('Shell', True) then
if OpenKey('Open', True) then begin
WriteString('', '打开(&O)');
if OpenKey('Command', True) then
WriteString('', Application.ExeName + ' "%1"');
end;
end;
finally
CloseKey;
Free;
end;

二、适别文件
Delphi提供两个函数以提供命令行参数。
ParamCount获得命令行参数的个数(包括程序文件);
ParamStr(Index)获得第Index个参数的字符串表示。

只要程序文件类型已经注册,且在初始化时处理命令行参数,就可以实现你的功能了。
 
多人接受答案了。
 
后退
顶部