我正在使用Visual Studio C ++ 2008和2010开发应用程序。我有一个简单的需求:我想找出符号链接(.lnk或快捷方式)文件的目标。我已经梳理了网络以找到答案并且没有运气。
我可以看到MSDN有两个创建符号链接的功能
BOOLEAN WINAPI CreateSymbolicLink( 在 LPTSTR lpSymlinkFileName中, 在 LPTSTR lpTargetFileName中, In DWORD dwFlags );
BOOLEAN WINAPI CreateSymbolicLinkTransacted( 在 LPTSTR lpSymlinkFileName中, 在 LPTSTR lpTargetFileName中, 在 DWORD dwFlags中, In HANDLE hTransaction );
但是我没有看到任何让你检索目标路径的东西。这对我来说似乎很奇怪,因为它是符号链接文件的基本属性。不会将这些信息保存在文件标题信息中吗?
MSDN网站上推荐的一个建议是
h = CreateFile (
path,
FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
0,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_REPARSE_POINT | FILE_FLAG_OPEN_REPARSE_POINT,
0);
DeviceIoControl (
h,
FSCTL_GET_REPARSE_POINT,
NULL,
0,
buffer,
bufferSize,
&returnedDataSize,
NULL);
但它看起来并不像DeviceIoControl对符号链接有意义,因为它是一个设备控制功能。无论如何我试过了它并没有用,那就是缓冲没有改变。
有没有人有这方面的经验? 任何帮助将不胜感激。
杰伊答案 0 :(得分:7)
.lnk文件不是符号链接。符号链接是文件系统本身的一个特性。这就是您可以使用DeviceIoControl()
查询它们的原因。 .lnk文件只是一个文件。您可以使用IShellLink
界面查询和操作.lnk文件。
答案 1 :(得分:1)
您是否尝试使用CreateFile()API打开符号链接?具体来说,这就是API的文档所说的关于打开符号链接的内容
如果未指定FILE_FLAG_OPEN_REPARSE_POINT:
因此,您可以尝试打开链接,该链接将返回目标文件的句柄,然后尝试按照here从返回的句柄中检索文件名。
我从来没有尝试过,但只是一种你可以考虑探索的方法。