如何在Windows C ++程序中找到符号链接的目标

时间:2014-05-13 02:12:06

标签: c++ winapi

我正在使用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对符号链接有意义,因为它是一个设备控制功能。无论如何我试过了它并没有用,那就是缓冲没有改变。

有没有人有这方面的经验? 任何帮助将不胜感激。

杰伊

2 个答案:

答案 0 :(得分:7)

.lnk文件不是符号链接。符号链接是文件系统本身的一个特性。这就是您可以使用DeviceIoControl()查询它们的原因。 .lnk文件只是一个文件。您可以使用IShellLink界面查询和操作.lnk文件。

答案 1 :(得分:1)

您是否尝试使用CreateFile()API打开符号链接?具体来说,这就是API的文档所说的关于打开符号链接的内容

如果未指定FILE_FLAG_OPEN_REPARSE_POINT:

  • 如果打开现有文件并且它是符号链接,则为句柄 返回是目标的句柄。
  • 如果指定了CREATE_ALWAYS,TRUNCATE_EXISTING或FILE_FLAG_DELETE_ON_CLOSE, 受影响的文件是目标。

因此,您可以尝试打开链接,该链接将返回目标文件的句柄,然后尝试按照here从返回的句柄中检索文件名。

我从来没有尝试过,但只是一种你可以考虑探索的方法。