/* 同じ内容を持つショートカットを削除(スタートアップへの重複登録よけ) */ BOOL RemoveSameLink(const char *dir, char *remove_path) { char path[MAX_PATH_U8], dest[MAX_PATH_U8], arg[MAX_PATH_U8]; HANDLE fh; WIN32_FIND_DATA_U8 data; BOOL ret = FALSE; ::wsprintf(path, "%s\\*.*", dir); if ((fh = FindFirstFileU8(path, &data)) == INVALID_HANDLE_VALUE) return FALSE; do { ::wsprintf(path, "%s\\%s", dir, data.cFileName); if (ReadLinkU8(path, dest, arg) && *arg == 0) { int dest_len = strlen(dest), ipmsg_len = strlen(IPMSG_EXENAME); if (dest_len > ipmsg_len && strncmpi(dest + dest_len - ipmsg_len, IPMSG_EXENAME, ipmsg_len) == 0) { ret = DeleteFileU8(path); if (remove_path) strcpy(remove_path, path); } } } while (FindNextFileU8(fh, &data)); ::FindClose(fh); return ret; }
BOOL GetFileInfomationU8(const char *path, WIN32_FIND_DATA_U8 *fdata) { HANDLE fh; if ((fh = FindFirstFileU8(path, fdata)) != INVALID_HANDLE_VALUE) { ::FindClose(fh); return TRUE; } if ((fh = CreateFileU8(path, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)) != INVALID_HANDLE_VALUE) { BY_HANDLE_FILE_INFORMATION info; BOOL info_ret = ::GetFileInformationByHandle(fh, &info); ::CloseHandle(fh); if (info_ret) { memcpy(fdata, &info, (char *)&info.dwVolumeSerialNumber - (char *)&info); return TRUE; } } return (fdata->dwFileAttributes = GetFileAttributesU8(path)) == 0xffffffff ? FALSE : TRUE; }