You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.5 KiB
107 lines
3.5 KiB
#include <windows.h>
|
|
#include <shlwapi.h>
|
|
#include <commctrl.h>
|
|
#include "dataitem.h"
|
|
#include "resource.h"
|
|
#include "stdio.h"
|
|
#include "util.h"
|
|
|
|
#define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
|
|
#define EXPLORER_EXE_STRING TEXT("explorer.exe")
|
|
#define HTTP_PREFIX_STRING TEXT("http://")
|
|
|
|
CDataItem::CDataItem()
|
|
{
|
|
m_szTitle[0] = 0;
|
|
m_szCmdLine[0] = 0;
|
|
m_szArgs[0] = 0;
|
|
m_dwFlags = 0;
|
|
m_dwType = 0;
|
|
}
|
|
|
|
CDataItem::~CDataItem()
|
|
{
|
|
}
|
|
|
|
BOOL CDataItem::SetData( LPTSTR pszTitle, LPTSTR pszCmd, LPTSTR pszArgs, DWORD dwFlags, DWORD dwType)
|
|
{
|
|
BOOL fRet = FALSE;
|
|
|
|
if (!m_szCmdLine[0] && // not init'd yet
|
|
pszTitle &&
|
|
pszCmd)
|
|
{
|
|
lstrcpyn(m_szTitle, pszTitle, ARRAYSIZE(m_szTitle)); // fine, we control pszTitle
|
|
lstrcpyn(m_szCmdLine, pszCmd, ARRAYSIZE(m_szCmdLine)); // fine, we control pszCmd
|
|
if (pszArgs)
|
|
{
|
|
lstrcpyn( m_szArgs, pszArgs, ARRAYSIZE(m_szArgs)); // fine, we control pszArgs
|
|
}
|
|
|
|
m_dwType = dwType;
|
|
m_dwFlags = dwFlags;
|
|
fRet = TRUE;
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
#define BUFFER_SIZE 1000
|
|
|
|
BOOL CDataItem::Invoke(HWND hwnd)
|
|
{
|
|
BOOL fResult = FALSE;
|
|
if (m_szCmdLine[0])
|
|
{
|
|
TCHAR szExpandedExecutable[BUFFER_SIZE];
|
|
TCHAR szExpandedArgs[BUFFER_SIZE];
|
|
|
|
fResult = SafeExpandEnvStringsA(m_szCmdLine, szExpandedExecutable, ARRAYSIZE(szExpandedExecutable));
|
|
if (fResult)
|
|
{
|
|
if (m_szArgs[0])
|
|
{
|
|
fResult = SafeExpandEnvStringsA(m_szArgs, szExpandedArgs, ARRAYSIZE(szExpandedArgs));
|
|
}
|
|
else
|
|
{
|
|
szExpandedArgs[0] = 0;
|
|
}
|
|
|
|
if (fResult)
|
|
{
|
|
TCHAR szDirectory[MAX_PATH];
|
|
int cchDirectory = GetModuleFileName(NULL, szDirectory, ARRAYSIZE(szDirectory));
|
|
if (cchDirectory > 0 && cchDirectory < MAX_PATH)
|
|
{
|
|
if (LocalPathRemoveFileSpec(szDirectory))
|
|
{
|
|
if (!strncmp(szExpandedExecutable, EXPLORER_EXE_STRING, ARRAYSIZE(EXPLORER_EXE_STRING))) // explorer paths must be opened
|
|
{
|
|
if (szExpandedArgs[0] && !strncmp(szExpandedArgs, HTTP_PREFIX_STRING, ARRAYSIZE(HTTP_PREFIX_STRING) - 1))
|
|
{
|
|
// opening a weblink
|
|
fResult = ((INT_PTR)ShellExecute(hwnd, TEXT("open"), szExpandedArgs, NULL, NULL, SW_SHOWNORMAL) > 32);
|
|
}
|
|
else
|
|
{
|
|
// opening a folder
|
|
if (szExpandedArgs[0])
|
|
{
|
|
LocalPathAppendA(szDirectory, szExpandedArgs, ARRAYSIZE(szDirectory));
|
|
}
|
|
fResult = ((INT_PTR)ShellExecute(hwnd, TEXT("open"), szDirectory, NULL, NULL, SW_SHOWNORMAL) > 32);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fResult = ((INT_PTR)ShellExecute(hwnd, NULL, szExpandedExecutable, szExpandedArgs, szDirectory, SW_SHOWNORMAL) > 32);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return fResult;
|
|
}
|