【问题标题】:How to find target of symbolic link in Windows C++ program如何在 Windows C++ 程序中找到符号链接的目标
【发布时间】:2014-05-13 02:12:05
【问题描述】:

我正在使用 Visual Studio C++ 2008 和 2010 开发应用程序。我有一个简单的需求:我想找出符号链接(.lnk 或快捷方式)文件的目标。我已经梳理了网络以找到答案,但没有任何运气。

我可以看到 MSDN 有两个功能来创建符号链接

BOOLEAN WINAPI CreateSymbolicLink( 在 LPTSTR lpSymlinkFileName, 在 LPTSTR lpTargetFileName, 在 DWORD dwFlags );

BOOLEAN WINAPI CreateSymbolicLinkTransacted( 在 LPTSTR lpSymlinkFileName, 在 LPTSTR lpTargetFileName, 在 DWORD dwFlags, 在中处理 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 对符号链接有意义,因为它是一个设备控制功能。反正我试了还是不行,就是buffer没变。

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

杰

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

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

    【讨论】:

    • Remy Lebeau 你又是老大了! .lnk 的 1 开始不是符号链接。它们相似但提供细微的功能差异。另一个开始,您可以使用 IShellLink 来操作 .lnk 文件。而且我猜您也适合 DeviceIoControl 查询 SymbolicLinks。你是堆栈溢出的老大。
    【解决方案2】:

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

    如果未指定 FILE_FLAG_OPEN_REPARSE_POINT:

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

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

    我从未尝试过,但只是一种您可以考虑探索的方法。

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 2012-07-03
      • 2016-03-17
      • 2017-08-22
      • 2010-09-18
      • 2017-09-28
      • 2014-08-06
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多