|
|
#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.
}
|