Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何将程序与文件类型关联,但仅限于当前用户?_Delphi_Windows 7_Windows Vista_Registry - Fatal编程技术网

Delphi 如何将程序与文件类型关联,但仅限于当前用户?

Delphi 如何将程序与文件类型关联,但仅限于当前用户?,delphi,windows-7,windows-vista,registry,Delphi,Windows 7,Windows Vista,Registry,因此,我无法将我的程序与特定的文件类型相关联,而不强制可怜的用户输入其管理员密码(对于家庭用户来说,这可能没问题,但对于公司环境中的用户来说,这是一个巨大的问题)。在这种情况下,唯一的解决方案是仅为当前用户建立关联 我试过了,但有些东西不起作用 如果我理解正确,我必须在ctCurUserFileExt中编写一个键,比如说“.mp3”,然后在其中编写类似“my_file”的内容。然后在ctCurUserClases中添加一个键,如下所示: WriteReg_String(RootKey, ctCu

因此,我无法将我的程序与特定的文件类型相关联,而不强制可怜的用户输入其管理员密码(对于家庭用户来说,这可能没问题,但对于公司环境中的用户来说,这是一个巨大的问题)。在这种情况下,唯一的解决方案是仅为当前用户建立关联

我试过了,但有些东西不起作用

如果我理解正确,我必须在ctCurUserFileExt中编写一个键,比如说“.mp3”,然后在其中编写类似“my_file”的内容。然后在ctCurUserClases中添加一个键,如下所示:

WriteReg_String(RootKey, ctCurUserClases+ 'my_file\shell\open\command', '', Application.ExeName+ ' "%L"', TRUE) 
但是,当我双击文件时,Windows会问我应该用哪个应用程序打开它

以下是常数:

CONST
     RootKey= 'HKEY_CURRENT_USER';
     ctCurUserFileExt= '\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\';
     ctCurUserClases = '\Software\Classes\';

如果要为每个用户注册关联,请将数据写入

HKEY_LOCAL_MACHINE\Software\Classes
HKEY_CURRENT_USER\Software\Classes

如果只想为当前用户注册关联,请将数据写入

HKEY_LOCAL_MACHINE\Software\Classes
HKEY_CURRENT_USER\Software\Classes
这就是后一种方法:

with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    if OpenKey('\Software\Classes\.myfile', true) then
      WriteString('', 'MyAppDataFile');
    if OpenKey('\Software\Classes\MyAppDataFile', true) then
      WriteString('', 'My Very Own Text File Type');
    if OpenKey('\Software\Classes\MyAppDataFile\DefaultIcon', true) then
      WriteString('', 'C:\WINDOWS\notepad.exe');
    if OpenKey('\Software\Classes\MyAppDataFile\shell\open\command', true) then
      WriteString('', 'C:\WINDOWS\notepad.exe "%1"');
  finally
    Free;
  end;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
这将关联名为“我自己的文本文件类型”的.myfile文件,以便它们具有notepad.exe图标,并由notepad.exe打开。最后一行告诉资源管理器“重新加载”自身,以反映对文件关联所做的更改。例如,资源管理器文件列表视图将更新。WinAPI函数
SHChangeNotify
ShlObj.pas
中声明,因此您需要
使用ShlObj

请注意,
shell\open\command
中的
%1
将扩展到当前文件。例如,如果双击
C:\some dir\test.myfile
,则资源管理器将执行该命令

C:\WINDOWS\notepad.exe "C:\some dir\test.myfile"

您是否看过根据Hi Ngln在HKEY_CURRENT_USER\Software\Class下设置它。这不是骗局。这是关于如何关联所有用户(需要提升)。我需要不带高程(因此,仅针对当前用户)。顺便问一下,为什么不使用TRegistry?因此,我必须在CTcurUserClase中添加这两个条目?我想我需要在ctCurUserClases和ctCurUserFileExt中分别添加一个和一个。@table:HKCR是HKLM和HKCU的合并视图。使用HKLM中的默认值初始化视图,然后将HKCU值置于该值之上。阅读MSDN了解更多详细信息:和。我发现大多数程序使用的是%1而不是%1。有什么区别吗?@salter:我从来没有见过%L,但%1一直都是用于这个目的的。我怀疑你把它们混在一起了。免费库DSiWin32()现在实现为DSiRegisterUserFileAssoc和DSiUnregisterUserFileAssoc。它的工作原理与全局设置完全相同,只是有一个用户特定的位置来放置密钥以获取文件关联。