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
中声明,#include
由 windows.h
声明,#include
由 vcl.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
副本中也不会有 CreateSymbolicLinkA
和 CreateSymbolicLinkW
符号来链接到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()
。
我目前正在尝试在 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
中声明,#include
由 windows.h
声明,#include
由 vcl.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
副本中也不会有 CreateSymbolicLinkA
和 CreateSymbolicLinkW
符号来链接到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()
。