C ++ Builder

时间:2015-06-10 15:43:42

标签: c c++builder symlink

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

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

我不知道如何替换它以便它适用于C ++ Builder for Windows 64位,我发现函数CreateSymbolicLinkW和CreateSymbolicLinkA似乎与Windows等效,但C ++ Builder可以&#39找不到它们。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

CreateSymbolicLink()winbase.h中声明,#include表示windows.h#include表示vcl.h表示#include <windows.h>基于VCL的项目。如果您没有创建VCL项目,请确保代码中包含_WIN32_WINNT语句。无论哪种方式,还要确保0x0600定义为至少CreateSymbolicLink()(Vista +)。

如果编译器仍抱怨CreateSymbolicLink()未定义,那么您必须使用旧版本的C ++ Builder(winbase.h已添加到C ++ Builder的CreateSymbolicLink()副本中C ++ Builder 2007),在这种情况下,您必须在自己的代码中手动声明#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 ,例如:

CreateSymbolicLinkA

但是你还有另一个需要解决的问题 - 那个版本的C ++ Builder在其CreateSymbolicLinkW副本中也没有kernel32.libkernel32.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... } 可能更容易:

CreateSymbolicLink()

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