winemenubuilder: Add an option for thumbnailing .lnk files.
This commit is contained in:
parent
be5fdcd242
commit
dcb2ebee78
|
@ -2742,6 +2742,98 @@ static void cleanup_menus(void)
|
||||||
WINE_ERR("error opening registry key, menu cleanup failed\n");
|
WINE_ERR("error opening registry key, menu cleanup failed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void thumbnail_lnk(LPCWSTR lnkPath, LPCWSTR outputPath)
|
||||||
|
{
|
||||||
|
char *utf8lnkPath = NULL;
|
||||||
|
char *utf8OutputPath = NULL;
|
||||||
|
WCHAR *winLnkPath = NULL;
|
||||||
|
IShellLinkW *shellLink = NULL;
|
||||||
|
IPersistFile *persistFile = NULL;
|
||||||
|
WCHAR szTmp[MAX_PATH];
|
||||||
|
WCHAR szPath[MAX_PATH];
|
||||||
|
WCHAR szArgs[INFOTIPSIZE];
|
||||||
|
WCHAR szIconPath[MAX_PATH];
|
||||||
|
int iconId;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
utf8lnkPath = wchars_to_utf8_chars(lnkPath);
|
||||||
|
if (utf8lnkPath == NULL)
|
||||||
|
{
|
||||||
|
WINE_ERR("out of memory converting paths\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
utf8OutputPath = wchars_to_utf8_chars(outputPath);
|
||||||
|
if (utf8OutputPath == NULL)
|
||||||
|
{
|
||||||
|
WINE_ERR("out of memory converting paths\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
winLnkPath = wine_get_dos_file_name(utf8lnkPath);
|
||||||
|
if (winLnkPath == NULL)
|
||||||
|
{
|
||||||
|
WINE_ERR("could not convert %s to DOS path\n", utf8lnkPath);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
|
||||||
|
&IID_IShellLinkW, (LPVOID*)&shellLink);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
WINE_ERR("could not create IShellLinkW, error 0x%08X\n", hr);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IShellLinkW_QueryInterface(shellLink, &IID_IPersistFile, (LPVOID)&persistFile);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
WINE_ERR("could not query IPersistFile, error 0x%08X\n", hr);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IPersistFile_Load(persistFile, winLnkPath, STGM_READ);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
WINE_ERR("could not read .lnk, error 0x%08X\n", hr);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_cmdline(shellLink, szTmp, MAX_PATH, szArgs, INFOTIPSIZE);
|
||||||
|
ExpandEnvironmentStringsW(szTmp, szPath, MAX_PATH);
|
||||||
|
szTmp[0] = 0;
|
||||||
|
IShellLinkW_GetIconLocation(shellLink, szTmp, MAX_PATH, &iconId);
|
||||||
|
ExpandEnvironmentStringsW(szTmp, szIconPath, MAX_PATH);
|
||||||
|
|
||||||
|
if(!szPath[0])
|
||||||
|
{
|
||||||
|
LPITEMIDLIST pidl = NULL;
|
||||||
|
IShellLinkW_GetIDList(shellLink, &pidl);
|
||||||
|
if (pidl && SHGetPathFromIDListW(pidl, szPath))
|
||||||
|
WINE_TRACE("pidl path : %s\n", wine_dbgstr_w(szPath));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (szIconPath[0])
|
||||||
|
{
|
||||||
|
if (!ExtractFromEXEDLL(szIconPath, iconId, utf8OutputPath))
|
||||||
|
ExtractFromICO(szIconPath, utf8OutputPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!ExtractFromEXEDLL(szPath, iconId, utf8OutputPath))
|
||||||
|
ExtractFromICO(szPath, utf8OutputPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
HeapFree(GetProcessHeap(), 0, utf8lnkPath);
|
||||||
|
HeapFree(GetProcessHeap(), 0, utf8OutputPath);
|
||||||
|
HeapFree(GetProcessHeap(), 0, winLnkPath);
|
||||||
|
if (shellLink != NULL)
|
||||||
|
IShellLinkW_Release(shellLink);
|
||||||
|
if (persistFile != NULL)
|
||||||
|
IPersistFile_Release(persistFile);
|
||||||
|
}
|
||||||
|
|
||||||
static WCHAR *next_token( LPWSTR *p )
|
static WCHAR *next_token( LPWSTR *p )
|
||||||
{
|
{
|
||||||
LPWSTR token = NULL, t = *p;
|
LPWSTR token = NULL, t = *p;
|
||||||
|
@ -2827,6 +2919,7 @@ int PASCAL wWinMain (HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int sh
|
||||||
{
|
{
|
||||||
static const WCHAR dash_aW[] = {'-','a',0};
|
static const WCHAR dash_aW[] = {'-','a',0};
|
||||||
static const WCHAR dash_rW[] = {'-','r',0};
|
static const WCHAR dash_rW[] = {'-','r',0};
|
||||||
|
static const WCHAR dash_tW[] = {'-','t',0};
|
||||||
static const WCHAR dash_uW[] = {'-','u',0};
|
static const WCHAR dash_uW[] = {'-','u',0};
|
||||||
static const WCHAR dash_wW[] = {'-','w',0};
|
static const WCHAR dash_wW[] = {'-','w',0};
|
||||||
|
|
||||||
|
@ -2865,6 +2958,16 @@ int PASCAL wWinMain (HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int sh
|
||||||
bWait = TRUE;
|
bWait = TRUE;
|
||||||
else if ( !strcmpW( token, dash_uW ) )
|
else if ( !strcmpW( token, dash_uW ) )
|
||||||
bURL = TRUE;
|
bURL = TRUE;
|
||||||
|
else if ( !strcmpW( token, dash_tW ) )
|
||||||
|
{
|
||||||
|
WCHAR *lnkFile = next_token( &p );
|
||||||
|
if (lnkFile)
|
||||||
|
{
|
||||||
|
WCHAR *outputFile = next_token( &p );
|
||||||
|
if (outputFile)
|
||||||
|
thumbnail_lnk(lnkFile, outputFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if( token[0] == '-' )
|
else if( token[0] == '-' )
|
||||||
{
|
{
|
||||||
WINE_ERR( "unknown option %s\n", wine_dbgstr_w(token) );
|
WINE_ERR( "unknown option %s\n", wine_dbgstr_w(token) );
|
||||||
|
|
Loading…
Reference in New Issue