You could use winim:
https://github.com/khchen/winim
With the IShellLink. There is an example in the readme how to use it.
Here is a demo:
import winim
converter pointerConverter(x: ptr): ptr PVOID = cast[ptr PVOID](x)
proc parseLnk(lnk: string) =
var pIL: ptr IShellLink
if CoCreateInstance(&CLSID_ShellLink, nil, CLSCTX_LOCAL_SERVER, &IID_IShellLink, &pIL).SUCCEEDED:
defer: pIL.Release()
var pPF: ptr IPersistFile
if pIL.QueryInterface(&IID_IPersistFile, &pPF).SUCCEEDED:
defer: pPF.Release()
if pPF.Load(lnk, STGM_READ).SUCCEEDED:
var buffer = T(32768)
var index: cint
if pIL.GetPath(buffer, cint buffer.len, nil, SLGP_RAWPATH).SUCCEEDED:
echo "Path: ", $buffer.nullTerminated()
if pIL.GetWorkingDirectory(buffer, cint buffer.len).SUCCEEDED:
echo "WorkingDirectory: ", $buffer.nullTerminated()
if pIL.GetArguments(buffer, cint buffer.len).SUCCEEDED:
echo "Arguments: ", $buffer.nullTerminated()
if pIL.GetIconLocation(buffer, cint buffer.len, &index).SUCCEEDED:
echo "IconLocation: ", $buffer.nullTerminated()
CoInitialize(nil)
# parseLnk("test.lnk")