windows-nt/Source/XPSP1/NT/shell/ext/qvhack/main.cpp
2020-09-26 16:20:57 +08:00

146 lines
3.6 KiB
C++

#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>
#include "resource.h"
#define ARRAYSIZE(x) (sizeof((x)) / sizeof((x)[0]))
HMODULE g_hInstance = NULL;
LPTSTR g_pszFile = NULL;
BOOL FormatMessageString(UINT idTemplate, LPTSTR pszStrOut, DWORD cchSize, ...)
{
BOOL fResult = FALSE;
va_list vaParamList;
TCHAR szFormat[512];
if (LoadString(g_hInstance, idTemplate, szFormat, ARRAYSIZE(szFormat)))
{
va_start(vaParamList, cchSize);
fResult = FormatMessage(FORMAT_MESSAGE_FROM_STRING, szFormat, 0, 0, pszStrOut, cchSize, &vaParamList);
va_end(vaParamList);
}
return fResult;
}
INT_PTR QuickviewHackDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
INT_PTR fReturn = FALSE;
switch (uMsg)
{
case WM_INITDIALOG:
{
// Set the message
TCHAR szMessage[512];
BOOL fFormat = FormatMessageString(IDS_QUESTION, szMessage, ARRAYSIZE(szMessage), StrRChr(g_pszFile, NULL, TEXT('\\')) + 1);
if (fFormat)
{
SetWindowText(GetDlgItem(hwnd, IDC_MESSAGE), szMessage);
}
// default focus
fReturn = FALSE;
}
break;
case WM_PAINT:
{
HDC hdcPaint = GetDC(hwnd);
// Set the icon
HICON hQuestionIcon = (HICON) LoadIcon(NULL, MAKEINTRESOURCE(IDI_QUESTION));
DrawIcon(hdcPaint, 7, 7, hQuestionIcon);
// Don't free the icon, its shared.
ReleaseDC(hwnd, hdcPaint);
}
break;
case WM_COMMAND:
{
switch ((UINT) LOWORD(wParam))
{
case IDYES:
{
SHELLEXECUTEINFO shexecinfo = {0};
shexecinfo.cbSize = sizeof(shexecinfo);
shexecinfo.lpVerb = TEXT("openas");
shexecinfo.lpClass = TEXT("unknown");
shexecinfo.nShow = SW_SHOWNORMAL;
shexecinfo.fMask = SEE_MASK_CLASSNAME;
shexecinfo.lpFile = g_pszFile;
// This may take a while
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT)));
ShellExecuteEx(&shexecinfo);
}
// Fall through
case IDNO:
EndDialog(hwnd, LOWORD(wParam));
fReturn = TRUE;
break;
}
break;
}
break;
default:
break;
}
return fReturn;
}
int _stdcall ModuleEntry(void)
{
UINT uiExit = 0;
g_hInstance = GetModuleHandle(NULL);
// The command-line looks like:
// "quikview.exe" -v -f:"c:\blah\foo\doc.jpg"
// We want to take the stuff between the two quotes at the end
TCHAR szFile[MAX_PATH + 1];
LPTSTR pszLastQuote = StrRChr(GetCommandLine(), NULL, TEXT('\"'));
if (pszLastQuote)
{
LPTSTR pszSecondLastQuote = StrRChr(GetCommandLine(), pszLastQuote - 1, TEXT('\"'));
if (pszSecondLastQuote)
{
StrCpyN(szFile, pszSecondLastQuote + 1, ARRAYSIZE(szFile));
// Now find our last quote again
pszLastQuote = StrRChr(szFile, NULL, TEXT('\"'));
if (pszLastQuote)
{
*pszLastQuote = 0;
// szFile now has what we want
g_pszFile = szFile;
DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_QVHACK), NULL,
QuickviewHackDialogProc, 0);
}
}
}
ExitProcess(uiExit);
return 0; // We never come here.
}