1
0
Fork 0

LAUNCHER: resolve .lnk shortcuts

This commit is contained in:
Mr. eXoDia 2014-12-12 16:56:01 +01:00
parent 94fad3a0c4
commit 208e216a35
1 changed files with 62 additions and 2 deletions

View File

@ -2,6 +2,8 @@
#include <windows.h>
#include <string>
#include <shlwapi.h>
#include <objbase.h>
#include <shlobj.h>
enum arch
{
@ -98,6 +100,59 @@ static void CreateUnicodeFile(const wchar_t* file)
CloseHandle(hFile);
}
//Taken from: http://www.cplusplus.com/forum/windows/64088/
static bool ResolveShortcut(HWND hwnd, const wchar_t* szShortcutPath, char* szResolvedPath, size_t nSize)
{
if(szResolvedPath == NULL)
return SUCCEEDED(E_INVALIDARG);
//Initialize COM stuff
CoInitialize(NULL);
//Get a pointer to the IShellLink interface.
IShellLink* psl = NULL;
HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
if(SUCCEEDED(hres))
{
//Get a pointer to the IPersistFile interface.
IPersistFile* ppf = NULL;
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if(SUCCEEDED(hres))
{
//Load the shortcut.
hres = ppf->Load(szShortcutPath, STGM_READ);
if(SUCCEEDED(hres))
{
//Resolve the link.
hres = psl->Resolve(hwnd, 0);
if(SUCCEEDED(hres))
{
//Get the path to the link target.
char szGotPath[MAX_PATH] = {0};
hres = psl->GetPath(szGotPath, _countof(szGotPath), NULL, SLGP_SHORTPATH);
if(SUCCEEDED(hres))
{
strcpy_s(szResolvedPath, nSize, szGotPath);
}
}
}
//Release the pointer to the IPersistFile interface.
ppf->Release();
}
//Release the pointer to the IShellLink interface.
psl->Release();
}
//Uninitialize COM stuff
CoUninitialize();
return SUCCEEDED(hres);
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
CoInitialize(NULL); //fixed some crash
@ -192,10 +247,15 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
}
if(argc == 2) //one argument -> execute debugger
{
wchar_t szPath[MAX_PATH] = L"";
wcscpy_s(szPath, argv[1]);
char szResolvedPath[MAX_PATH] = "";
if(ResolveShortcut(0, szPath, szResolvedPath, _countof(szResolvedPath)))
MultiByteToWideChar(CP_ACP, 0, szResolvedPath, -1, szPath, _countof(szPath));
std::wstring cmdLine = L"\"";
cmdLine += argv[1];
cmdLine += szPath;
cmdLine += L"\"";
switch(GetFileArchitecture(argv[1]))
switch(GetFileArchitecture(szPath))
{
case x32:
if(sz32Path[0])