2015-06-10 3 views
0

В настоящее время я пытаюсь интегрировать код C, написанный для UNIX в C++ Builder. Но часть коды с помощью функции симлинка:Альтернатива symlink в C++ Builder

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

Я не знаю, как заменить его, чтобы он работает в C++ Builder для Windows 64 бита, я нашел функцию CreateSymbolicLinkW и CreateSymbolicLinkA, которые кажутся чтобы быть эквивалентом для Windows, но C++ Builder не может их найти.

У вас есть представление о том, как я могу обойти эту проблему?

спасибо.

+1

Вы пробовали с CreateSymbolicLink (обратите внимание на отсутствие A или W)? A/W - это ansi/wide версии функций в API, но вы обычно называете это без чего-либо, поэтому компилятор выбирает, какой из них вызывать в зависимости от проекта. –

+0

Что вы подразумеваете под _can't find them_? Это компилятор или компоновщик? Собственно, что такое сообщение об ошибке? – CristiFati

+0

Благодарим вас за эту информацию. Да, я пробовал с CreateSymbolicLink, но это та же проблема, что это «неявное объявление [...]». Я попытался включить «windows.h», но он поднял ошибку в этом файле. – mvezinet

ответ

1

CreateSymbolicLink() объявлен в winbase.h, который #include «d от windows.h, который #include» d от 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 также не имеют CreateSymbolicLinkA и CreateSymbolicLinkW символы в своей копии 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, ,

+0

В том числе в моем файле C на самом деле возникает ошибка «неизвестно» имя типа «OUT» в rpcdcep.h, я не знаю почему. Я использую в том же проекте, но в файле C++. – mvezinet