gpt4 book ai didi

c - C++ Builder 中符号链接(symbolic link)的替代方案

转载 作者:行者123 更新时间:2023-11-30 15:19:18 24 4
gpt4 key购买 nike

我目前正在尝试在 C++ Builder 中集成为 UNIX 编写的 C 代码。但部分代码正在使用函数符号链接(symbolic link):

if(!fname
|| (use_real_copy ? real_copy(path, fname) : symlink(path, fname))

我不知道如何替换它,因此它可以在 Windows 64 位的 C++ Builder 中工作,我发现函数 CreateSymbolicLinkW 和 CreateSymbolicLinkA 似乎与 Windows 等效,但 C++ Builder 找不到它们。

您知道如何解决这个问题吗?

谢谢。

最佳答案

CreateSymbolicLink() 声明于 winbase.h ,即#includewindows.h 提供,即#includevcl.h 提供在所有基于 VCL 的项目中。如果您不创建 VCL 项目,请确保您有 #include <windows.h>代码中的声明。无论哪种方式,还要确保_WIN32_WINNT定义为至少 0x0600 (Vista+)。

如果编译器仍然提示 CreateSymbolicLink()未定义,那么您必须使用旧版本的 C++Builder(CreateSymbolicLink() 已添加到 C++Builder 2007 中的 winbase.h 的 C++Builder 副本中),在这种情况下,您必须声明 CreateSymbolicLink()手动在您自己的代码中,例如:

#define SYMBOLIC_LINK_FLAG_DIRECTORY            (0x1)

#define VALID_SYMBOLIC_LINK_FLAGS SYMBOLIC_LINK_FLAG_DIRECTORY // & whatever other flags we think of!

WINBASEAPI
BOOLEAN
APIENTRY
CreateSymbolicLinkA (
__in LPCSTR lpSymlinkFileName,
__in LPCSTR lpTargetFileName,
__in DWORD dwFlags
);
WINBASEAPI
BOOLEAN
APIENTRY
CreateSymbolicLinkW (
__in LPCWSTR lpSymlinkFileName,
__in LPCWSTR lpTargetFileName,
__in DWORD dwFlags
);
#ifdef UNICODE
#define CreateSymbolicLink CreateSymbolicLinkW
#else
#define CreateSymbolicLink CreateSymbolicLinkA
#endif // !UNICODE

但是你还有另一个问题需要解决 - 那个版本的 C++Builder 也没有 CreateSymbolicLinkACreateSymbolicLinkW kernel32.lib 副本中的符号用于链接到 kernel32.dll 中的导出函数。所以你必须创建一个新的 .lib从现代导入库 kernel32.dll包括这些符号,然后将其添加到您的项目中。此时,动态加载 CreateSymbolicLink() 可能会更容易在运行时使用GetProcAddress()相反:

typedef BOOLEAN (APIENTRY *LPFN_CSL)(LPCTSTR, LPCTSTR, DWORD);

LPFN_CSL lpCreateSymbolicLink = (LPFN_CSL) GetProcAddress(GetModuleHandle(TEXT("kernel32")),
#ifdef UNICODE
"CreateSymbolicLinkW"
#else
"CreateSymbolicLinkA"
#endif
);
if (lpCreateSymbolicLink)
{
// use lpCreateSymbolicLink(...) as needed...
}

这也将允许您的代码在 XP 及更早版本上运行(如果需要),因为 CreateSymbolicLink() Vista 中已添加。

关于c - C++ Builder 中符号链接(symbolic link)的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30761148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com