CreateSymbolicLink() 在所有基于 VCL 的项目中声明在 winbase.h 中,即 #include'd by windows.h,即 #include'd by vcl.h。如果您没有创建 VCL 项目,请确保您的代码中有 #include <windows.h> 语句。无论哪种方式,还要确保 _WIN32_WINNT 至少定义为 0x0600 (Vista+)。
如果编译器仍然抱怨 CreateSymbolicLink() 未定义,那么您必须使用旧版本的 C++Builder(CreateSymbolicLink() 在 C++Builder 2007 中添加到 C++Builder 的 winbase.h 副本中) ,在这种情况下,您必须在自己的代码中手动声明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()。