与 Windows 投影文件系统 DLL/LIB 链接

Posted

技术标签:

【中文标题】与 Windows 投影文件系统 DLL/LIB 链接【英文标题】:Linking with Windows Projected File System DLL/LIB 【发布时间】:2018-12-10 06:53:46 【问题描述】:

我正在尝试构建RegFS sample 以更好地了解 Windows 投影文件系统。我的代码在没有警告的情况下构建,但出现动态链接错误。下面是一个示例错误,代码就在下面。

“在动态链接库中找不到过程入口点PrjWritePlaceholderInfo。”

HRESULT VirtualizationInstance::WritePlaceholderInfo(
    LPCWSTR relativePath,
    PRJ_PLACEHOLDER_INFO* placeholderInfo,
    DWORD length
) 
    return PrjWritePlaceholderInfo(
        _instanceHandle,
        relativePath,
        placeholderInfo,
        length);

我确定我在链接时做错了什么。在 [Project Property Pages] > Linker > Input 下,我将“ProjectedFSlib.lib”添加到“Additional Dependencies”中。

这是我第一次使用默认情况下未链接库的 Visual Studio,我一直无法找到有关如何在 Windows SDK 中查找和链接库的说明。

感谢您的帮助!

编辑:

DUMPBIN 输出为:

Dump of file ProjectedFSLib.lib

File Type: LIBRARY

 Exports

   ordinal    name

              PrjAllocateAlignedBuffer
              PrjClearNegativePathCache
              PrjCloseFile
              PrjCommandCallbacksInit
              PrjCompleteCommand
              PrjConfigureVolume
              PrjConvertDirectoryToPlaceholder
              PrjCreatePlaceholderAsHardlink
              PrjDeleteFile
              PrjDetachDriver
              PrjDoesNameContainWildCards
              PrjFileNameCompare
              PrjFileNameMatch
              PrjFillDirEntryBuffer
              PrjFreeAlignedBuffer
              PrjGetOnDiskFileState
              PrjGetVirtualizationInstanceIdFromHandle
              PrjGetVirtualizationInstanceInfo
              PrjMarkDirectoryAsPlaceholder
              PrjOpenFile
              PrjReadFile
              PrjStartVirtualizationInstance
              PrjStartVirtualizationInstanceEx
              PrjStartVirtualizing
              PrjStopVirtualizationInstance
              PrjStopVirtualizing
              PrjUpdateFileIfNeeded
              PrjUpdatePlaceholderIfNeeded
              PrjWriteFile
              PrjWriteFileData
              PrjWritePlaceholderInfo
              PrjWritePlaceholderInformation
              PrjpReadPrjReparsePointData

Summary

      D8 .debug$S
      14 .idata$2
      14 .idata$3
       8 .idata$4
       8 .idata$5
      14 .idata$6

可执行导入的 DUMPBIN 导致:

Dump of file regfs.exe

File Type: EXECUTABLE IMAGE

  Section contains the following imports:

    PROJECTEDFSLIB.dll
             14006D2A0 Import Address Table
             14006D9E0 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                          1E PrjWritePlaceholderInfo
                          1D PrjWriteFileData
                          19 PrjStopVirtualizing
                          17 PrjStartVirtualizing
                           C PrjFileNameMatch
                           D PrjFillDirEntryBuffer
                           E PrjFreeAlignedBuffer
                           0 PrjAllocateAlignedBuffer
                          11 PrjGetVirtualizationInstanceInfo
                          12 PrjMarkDirectoryAsPlaceholder
                           B PrjFileNameCompare

    KERNEL32.dll
             14006D098 Import Address Table
             14006D7D8 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                         389 IsProcessorFeaturePresent
                         382 IsDebuggerPresent
                         466 RaiseException
                         1B1 FreeLibrary
                          BA CreateDirectoryW
                         116 DeleteFileW
                         59A TerminateProcess
                         4BD RemoveDirectoryW
                         621 WriteFile
                          C2 CreateFile2
                          86 CloseHandle
                         267 GetLastError
                         3F2 MultiByteToWideChar
                         21D GetCurrentProcess
                         57B SetUnhandledExceptionFilter
                         5BC UnhandledExceptionFilter
                         4E1 RtlVirtualUnwind
                         4DA RtlLookupFunctionEntry
                         4D3 RtlCaptureContext
                         477 ReadFile
                         2B5 GetProcAddress
                         5DD VirtualQuery
                         2BB GetProcessHeap
                         60D WideCharToMultiByte
                         450 QueryPerformanceCounter
                         21E GetCurrentProcessId
                         2F0 GetSystemTimeAsFileTime
                         36C InitializeSListHead
                         352 HeapFree
                         34E HeapAlloc
                         27E GetModuleHandleW
                         2D7 GetStartupInfoW
                         222 GetCurrentThreadId

    ADVAPI32.dll
             14006D000 Import Address Table
             14006D740 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                         299 RegQueryValueExW
                         293 RegQueryInfoKeyW
                         28C RegOpenKeyExW
                         27D RegEnumValueW
                         27A RegEnumKeyExW
                         25B RegCloseKey
                         281 RegGetValueW

    ole32.dll
             14006D438 Import Address Table
             14006DB78 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                          2A CoCreateGuid

    MSVCP140D.dll
             14006D228 Import Address Table
             14006D968 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                          A5 ??1_Lockit@std@@QEAA@XZ
                          6D ??0_Lockit@std@@QEAA@H@Z
                         296 ?_Xlength_error@std@@YAXPEBD@Z
                         297 ?_Xout_of_range@std@@YAXPEBD@Z

    VCRUNTIME140D.dll
             14006D360 Import Address Table
             14006DAA0 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                          3C memcpy
                          3D memmove
                           1 _CxxThrowException
                           E __CxxFrameHandler3
                          36 _purecall
                          3B memcmp
                          21 __std_exception_copy
                          22 __std_exception_destroy
                           8 __C_specific_handler
                           9 __C_specific_handler_noexcept
                          25 __std_type_info_destroy_list
                          2E __vcrt_GetModuleFileNameW
                          2F __vcrt_GetModuleHandleW
                          31 __vcrt_LoadLibraryExW

    ucrtbased.dll
             14006D498 Import Address Table
             14006DBD8 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                         2B6 _register_thread_local_exe_atexit_callback
                          B5 _configthreadlocale
                         2CE _set_new_mode
                          4D __p__commode
                         11D _free_dbg
                         52C strcpy_s
                         528 strcat_s
                          68 __stdio_common_vsprintf_s
                         2C2 _seh_filter_dll
                          B6 _configure_narrow_argv
                         171 _initialize_narrow_environment
                         172 _initialize_onexit_table
                          9F _c_exit
                          E5 _execute_onexit_table
                          C2 _crt_atexit
                          C1 _crt_at_quick_exit
                         54B terminate
                         39C _wmakepath_s
                         3B8 _wsplitpath_s
                         564 wcscpy_s
                          A4 _cexit
                         48D getchar
                          60 __stdio_common_vfwprintf
                          35 __acrt_iob_func
                           4 _CrtDbgReport
                         567 wcslen
                         176 _invalid_parameter
                          4B __p___wargv
                          49 __p___argc
                         2CB _set_fmode
                          EA _exit
                         450 exit
                         175 _initterm_e
                         174 _initterm
                         13E _get_initial_wide_environment
                         173 _initialize_wide_environment
                          B7 _configure_wide_argv
                          5B __setusermatherr
                         2C6 _set_app_type
                         561 wcscmp
                           5 _CrtDbgReportW
                         4D8 malloc
                         2B5 _register_onexit_function
                          A1 _callnewh
                         2C3 _seh_filter_exe

  Summary

        1000 .00cfg
        1000 .data
        2000 .idata
        1000 .msvcjmc
        5000 .pdata
       17000 .rdata
        1000 .reloc
        1000 .rsrc
       37000 .text
       18000 .textbss

显然,它从 PROJECTEDFSLIB.dll 导入所有必要的函数

【问题讨论】:

这不是链接器问题,您的操作系统根本不够更新,无法拥有此功能。它是全新的,先驱者背后有箭。我的操作系统版本也没有,但我知道它不是最新的。顺便说一句,定位 x64 可能会有所不同。当你获得下一个主要的 Win10 更新时再试一次。 我已经检查过了。该库已安装,该功能已可用几个月。我将笔记本电脑更新到最新版本。我刚刚用 lib 文件的转储更新了问题。 我们已经知道你的.lib 文件没问题,如果你的程序没有这个功能就不会链接。 .exe 文件上的 Dumpbin.exe /imports 更有趣,它会显示使用的操作系统 dll。该 .dll 上的 Dumpbin.exe /exports 显示了实际实现的内容。 我刚刚用导入的转储编辑了这个问题。 【参考方案1】:

将 ProjectedFSLib.lib 添加到您的库或添加:

#pragma comment(lib, "ProjectedFSLib.lib")

代码中的行。此外,请确保您使用的是 SDK 版本 10.0.17763.0。如果您使用的是 mingw,如果该库尚未可用,我不会感到惊讶。

【讨论】:

我认为所有的设置都是正确的。我做了一个 UNIX 查找来定位实际的库,它们应该在 Windows SDK 搜索路径中。 Screenshot 我是盲人,所以你的屏幕截图对我来说没用,请查看配置属性->构建系统正在使用的 windows SDK 版本的常规页面。 我使用的是最新的 (10.0.17763.0)。【参考方案2】:

Projected FS 仍然是 Windows 的可选功能,需要手动安装才能使用。转到控制面板 -> 程序和功能 -> 打开或关闭 Windows 功能。在该可选功能列表中,向下滚动到“Windows Projected File System”并确保在那里启用它。只有在完成之后,您的 system32 目录中才会显示 ProjectedFSLib.dll。

还可能值得注意的是,这个 DLL 看起来只有一个 x64 版本,所以如果您正在构建一个 x86 程序,这可能是您无法与该 DLL 动态链接的原因。

【讨论】:

以上是关于与 Windows 投影文件系统 DLL/LIB 链接的主要内容,如果未能解决你的问题,请参考以下文章

windows 10(64位)下实现vs20120C++调用matlab r2014a编写的m文件生成的.dll,.lib,.h文件

windows 10(64位)下实现vs20120C++调用matlab r2014a编写的m文件生成的.dll,.lib,.h文件

在 Qt 中使用非标准名称链接 lib 文件

vs2010下静态加载dll文件,每次都要把.dll .lib 复制到目录下,但书上说可以设置系统环境变量就不要复制

是否总会有一个与您构建的 .dll 相关联的 .lib(导入库)?

21.2 windows_21_Library_Class_DLL_USE 动态库补充2