summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornanahi <130121847+na-na-hi@users.noreply.github.com>2023-11-05 22:50:39 -0500
committerKacper Michajłow <kasper93@gmail.com>2024-03-19 11:34:00 +0100
commitd2bbd7a531567fe9c41a56e5ab3b6255e771a5aa (patch)
tree66dab98758f0904c8216d8be9a5103b81d5696ce
parent3e7d36c295f726e701d1ceea6af83382f7b2f59e (diff)
downloadmpv-d2bbd7a531567fe9c41a56e5ab3b6255e771a5aa.tar.bz2
mpv-d2bbd7a531567fe9c41a56e5ab3b6255e771a5aa.tar.xz
win32: implement shell link target resolving
Adds a function to resolve the target of a shell link (Windows shortcut) for use by other parts of mpv.
-rw-r--r--osdep/windows_utils.c22
-rw-r--r--osdep/windows_utils.h4
2 files changed, 26 insertions, 0 deletions
diff --git a/osdep/windows_utils.c b/osdep/windows_utils.c
index 8cedf939e2..91eef62cb8 100644
--- a/osdep/windows_utils.c
+++ b/osdep/windows_utils.c
@@ -24,9 +24,12 @@
#include <audioclient.h>
#include <d3d9.h>
#include <dxgi1_2.h>
+#include <ole2.h>
+#include <shobjidl.h>
#include "common/common.h"
#include "windows_utils.h"
+#include "mpv_talloc.h"
char *mp_GUID_to_str_buf(char *buf, size_t buf_size, const GUID *guid)
{
@@ -227,3 +230,22 @@ error:
*server = *client = INVALID_HANDLE_VALUE;
return false;
}
+
+wchar_t *mp_w32_get_shell_link_target(wchar_t *path)
+{
+ IShellLink *psl = NULL;
+ IPersistFile *ppf = NULL;
+ wchar_t *buf = talloc_array(NULL, wchar_t, MAX_PATH + 1);
+
+ if (FAILED(CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (void**)&psl)) ||
+ FAILED(IShellLinkW_QueryInterface(psl, &IID_IPersistFile, (void**)&ppf)) ||
+ FAILED(IPersistFile_Load(ppf, path, STGM_READ)) ||
+ FAILED(IShellLinkW_GetPath(psl, buf, MAX_PATH, NULL, 0)))
+ {
+ TA_FREEP(&buf);
+ }
+
+ SAFE_RELEASE(psl);
+ SAFE_RELEASE(ppf);
+ return buf;
+}
diff --git a/osdep/windows_utils.h b/osdep/windows_utils.h
index a8a5e947b8..c3fc72aefe 100644
--- a/osdep/windows_utils.h
+++ b/osdep/windows_utils.h
@@ -46,4 +46,8 @@ struct w32_create_anon_pipe_opts {
bool mp_w32_create_anon_pipe(HANDLE *server, HANDLE *client,
struct w32_create_anon_pipe_opts *opts);
+// Returns the target of the shell link in talloc memory if the path is a
+// resolvable shell link, otherwise returns NULL.
+wchar_t *mp_w32_get_shell_link_target(wchar_t *path);
+
#endif