C++ Builder 中符号链接的替代方案

Alternative to symlink in C++ Builder

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

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

我不知道如何替换它,所以它在 C++ Builder 中适用于 Windows 64 位,我发现函数 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 的副本 winbase.h 在 C++Builder 2007 中),在这种情况下,您必须在自己的代码中手动声明 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 在它的 kernel32.lib 副本中也不会有 CreateSymbolicLinkACreateSymbolicLinkW 符号来链接到kernel32.dll 中的导出函数。因此,您必须从包含这些符号的现代 kernel32.dll 创建一个新的 .lib 导入库,然后将其添加到您的项目中。在这一点上,使用 GetProcAddress() 在 运行 时动态加载 CreateSymbolicLink() 可能会更容易:

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 和更早版本(如果需要)上 运行,因为在 Vista 中添加了 CreateSymbolicLink()