在我当前个人项目的Windows版本中,我希望支持扩展长度的文件路径.因此,我对如何使用GetFullPathNameW API来解析长文件路径的全名感到困惑.
根据MSDN(关于lpFileName参数):
在此函数的ANSI版本中,名称仅限于MAX_PATH字符.要将此限制扩展为32,767个宽字符,请调用该函数的Unicode版本并在路径前添加"\?\".有关更多信息,请参阅命名文件.
如果我正确理解这一点,为了使用扩展长度的文件路径GetFullPathNameW,我需要指定一个\\?\附加前缀的路径.由于\\?\前缀仅在卷字母或UNC路径之前有效,这意味着API无法用于解析相对于当前目录的路径的全名.
如果是这种情况,我是否可以使用另一个API来解析文件路径的全名,..\somedir\somefile.txt如果结果名称的长度超过MAX_PATH?如果没有,我是否能够GetCurrentDirectory与相对文件路径(\\?\C:\my\cwd\..\somedir\somefile.txt)结合并使用它GetFullPathNameW,或者我需要自己处理所有文件路径解析?
所以我试图将用于处理Windows上的连接/符号链接/等的python C扩展程序移植到使用ctypes模块的纯Python.不幸的是,由于我之前使用的ctypes非常有限,我想我可能会在某处导致我的代码无法正常运行时出错.这是我到目前为止所拥有的:
from os import path
from ctypes import *
from ctypes.wintypes import *
# Python implementation of:
#
# typedef struct {
# DWORD ReparseTag;
# DWORD ReparseDataLength;
# WORD Reserved;
# WORD ReparseTargetLength;
# WORD ReparseTargetMaximumLength;
# WORD Reserved1;
# WCHAR ReparseTarget[1];
# } REPARSE_MOUNTPOINT_DATA_BUFFER, *PREPARSE_MOUNTPOINT_DATA_BUFFER;
class ReparsePoint(Structure):
_fields_ = [
("ReparseTag", DWORD),
("ReparseDataLength", DWORD),
("Reserved", WORD),
("ReparseTargetLength", WORD),
("ReparseTargetMaximumLength", WORD),
("Reserved1", WORD),
("ReparseTarget", c_wchar_p),
]
GENERIC_READ = 0x80000000
GENERIC_WRITE = 0x40000000
FILE_SHARE_DELETE = 0x00000004
FILE_SHARE_READ = 0x00000001 …Run Code Online (Sandbox Code Playgroud) 我一直在搜索Lazarus IDE文档,但到目前为止只发现了与交叉编译相关的信息,所以我希望有人能给我一个直接的答案.我目前正在开发一个需要编译32位Windows和64位Windows的项目.另外,我已经设置了Free Pascal编译器的两个版本.Lazarus是否具有用于在两个编译器中进行配置的任何内置功能,然后使用适当的编译器基于构建目标?理想情况下,这将在全局级别完成,以便配置在项目中保持不变,但如果只能在项目级别完成,我不介意这样做.