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