20 #if (defined(PLATFORM_WINDOWS) && !defined(COMPILER_CYGWIN))
24 #pragma warning(disable:4996)
84 symlink(
const char *dest,
const char *shortcut,
const char *working_directory )
86 IShellLinkA *pISL = NULL;
87 IPersistFile *ppf = NULL;
90 if ((NULL == dest) || (NULL == shortcut) || (strlen(shortcut) < 5) || (strlen(dest) == 0))
93 _set_errno(ENAMETOOLONG);
94 else if (Glib::file_test(shortcut, Glib::FILE_TEST_EXISTS))
100 if (SUCCEEDED (hRet = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (
void**)&pISL)))
102 if (SUCCEEDED (pISL->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf)))
108 strcpy(sc_path_lower_case, shortcut);
109 strlwr(sc_path_lower_case);
110 const char *p = strlen(sc_path_lower_case) + sc_path_lower_case - 4;
112 if (0 == strcmp(p,
".lnk"))
117 MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, shortcut, -1, shortcut_path,
_MAX_PATH);
120 if (FAILED (hr = ppf->Load(shortcut_path, STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE)))
121 hr = ppf->Save(shortcut_path, TRUE);
126 if (S_OK == pISL->SetPath(dest))
129 if (working_directory)
130 p = working_directory;
134 if (S_OK == pISL->SetWorkingDirectory(p))
137 if (S_OK == pISL->SetShowCmd(SW_SHOWNORMAL))
141 if (Glib::file_test(dest, Glib::FILE_TEST_IS_DIR))
142 pISL->SetIconLocation(
"%SystemRoot%\\system32\\shell32.dll", 1);
144 pISL->SetIconLocation(dest, 0);
146 if (S_OK == ppf->Save(shortcut_path, FALSE))
176 if (E_POINTER == hRet)
203 readlink(
const char *__restrict shortcut,
char *__restrict buf,
size_t bufsize)
205 IShellLinkA *pISL = NULL;
206 IPersistFile *ppf = NULL;
209 if ((NULL == shortcut) || (NULL == buf) || (strlen(shortcut) < 5) || (bufsize == 0))
212 _set_errno(ENAMETOOLONG);
217 if (SUCCEEDED (hRet = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (
void**)&pISL)))
219 if (SUCCEEDED (pISL->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf)))
225 strcpy(target_path, shortcut);
227 const char *p = strlen(target_path) + target_path - 4;
229 if (0 == strcmp(p,
".lnk"))
232 MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, shortcut, -1, shortcut_path,
_MAX_PATH);
235 if (SUCCEEDED (ppf->Load(shortcut_path, 0)))
238 if (S_OK == (pISL->GetPath (target_path,
_MAX_PATH, NULL, SLGP_UNCPRIORITY)))
240 strncpy(buf, target_path, bufsize);
241 ret = ((ret = strlen(buf)) > bufsize) ? bufsize : ret;
258 if (E_POINTER == hRet)
276 #endif // COMPILER_MSVC
#define LIBARDOUR_APICALLTYPE