Compare commits
No commits in common. "d164531606af56577adbc9b989328cc8ef1f04f2" and "be95698d108c4b4f46f712967c2bd643d53754c0" have entirely different histories.
d164531606
...
be95698d10
|
@ -1,160 +0,0 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="CommonCfg"
|
|
||||||
ProjectGUID="{61829180-05C1-4865-B9C3-FEB983AD6997}"
|
|
||||||
RootNamespace="CommonCfg"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="Debug"
|
|
||||||
IntermediateDirectory="Debug"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="_WIN32_WINNT=0x0400;_WIN32_WINDOWS=0x0400;_DEBUG"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
CompileAs="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/CommonCfg.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="Release"
|
|
||||||
IntermediateDirectory="Release"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="_WIN32_WINNT=0x0400;_WIN32_WINDOWS=0x0400"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CompileAs="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/CommonCfg.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\Config.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\MultiString.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\RegHelper.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\stdafx.c">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\UploadConfig.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\RegHelper.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\stdafx.h">
|
|
||||||
</File>
|
|
||||||
<Filter
|
|
||||||
Name="Export"
|
|
||||||
Filter="">
|
|
||||||
<File
|
|
||||||
RelativePath=".\Export\Config.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
|
||||||
</Filter>
|
|
||||||
<File
|
|
||||||
RelativePath=".\ReadMe.txt">
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,141 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
const Config DEFAULT_CONFIG = {
|
|
||||||
{0}, // Use default (My Documents/Screenshots)
|
|
||||||
FALSE, // Don't upload screenshots
|
|
||||||
TRUE, // Do keep screenshots
|
|
||||||
FALSE, // Don't start helper on startup
|
|
||||||
HSC_WIN10 // Emulate Win7+ "Snipping Tool" shortcut
|
|
||||||
};
|
|
||||||
|
|
||||||
#define OpenRootKey(hkey,access) \
|
|
||||||
RegCreateKeyEx(HKEY_CURRENT_USER, \
|
|
||||||
_T(ROOT_KEYNAME), \
|
|
||||||
0, \
|
|
||||||
NULL, \
|
|
||||||
REG_OPTION_NON_VOLATILE, \
|
|
||||||
access, \
|
|
||||||
NULL, \
|
|
||||||
hkey, \
|
|
||||||
NULL)
|
|
||||||
|
|
||||||
// Enumeration callback for GetConfig
|
|
||||||
static BOOL
|
|
||||||
ConfigCallback(HKEY hKey,
|
|
||||||
LPTSTR szValName,
|
|
||||||
DWORD dwValSize,
|
|
||||||
DWORD dwValType,
|
|
||||||
PVOID pData)
|
|
||||||
{
|
|
||||||
Config *cfg = pData;
|
|
||||||
if (!cfg) return FALSE;
|
|
||||||
|
|
||||||
CopyIfMatch(hKey, cfg,
|
|
||||||
ScreenshotDir, REG_PATH_SZ)
|
|
||||||
else CopyIfMatch(hKey, cfg,
|
|
||||||
Upload, REG_DWORD)
|
|
||||||
else CopyIfMatch(hKey, cfg,
|
|
||||||
KeepScreenshots, REG_DWORD)
|
|
||||||
else CopyIfMatch(hKey, cfg,
|
|
||||||
HelperStartup, REG_DWORD)
|
|
||||||
else CopyIfMatch(hKey, cfg,
|
|
||||||
HelperShortcut, REG_DWORD)
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Config *
|
|
||||||
GetConfig(void)
|
|
||||||
{
|
|
||||||
HKEY hkRootKey = NULL;
|
|
||||||
BOOL bRes;
|
|
||||||
DWORD dwErr;
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
Config *cfg = HeapAlloc(hHeap, 0, sizeof(Config));
|
|
||||||
|
|
||||||
if (!cfg) return NULL;
|
|
||||||
|
|
||||||
// Copy in the default config
|
|
||||||
CopyMemory(cfg, &DEFAULT_CONFIG, sizeof(Config));
|
|
||||||
|
|
||||||
if ((dwErr = OpenRootKey(&hkRootKey, KEY_READ))) {
|
|
||||||
HeapFree(hHeap, 0, cfg);
|
|
||||||
SetLastError(dwErr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bRes = RegGetAllValues(hkRootKey, ConfigCallback, cfg);
|
|
||||||
dwErr = GetLastError();
|
|
||||||
RegCloseKey(hkRootKey);
|
|
||||||
|
|
||||||
if (!bRes) {
|
|
||||||
FreeConfig(cfg);
|
|
||||||
SetLastError(dwErr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If ScreenshotDir is NULL, set it to My Documents
|
|
||||||
if (!strlen(cfg->ScreenshotDir)) {
|
|
||||||
HRESULT hrRes;
|
|
||||||
|
|
||||||
// afaict, My Pictures isn't an easily accessible folder.
|
|
||||||
// There's CSIDL_MYPICTURES, but that's XP-only (and also
|
|
||||||
// points to a virtual folder???).
|
|
||||||
hrRes = SHGetFolderPath(NULL,
|
|
||||||
CSIDL_PERSONAL,
|
|
||||||
NULL,
|
|
||||||
SHGFP_TYPE_CURRENT,
|
|
||||||
cfg->ScreenshotDir);
|
|
||||||
|
|
||||||
if (FAILED(hrRes)) {
|
|
||||||
// TODO: error management
|
|
||||||
// For now, just empty the string
|
|
||||||
*cfg->ScreenshotDir = 0;
|
|
||||||
} else {
|
|
||||||
PathAppend(cfg->ScreenshotDir,
|
|
||||||
_T("Screenshots"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Detect startup
|
|
||||||
|
|
||||||
return cfg;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
SaveConfig(Config *cfg)
|
|
||||||
{
|
|
||||||
HKEY hkRootKey;
|
|
||||||
DWORD dwErr;
|
|
||||||
|
|
||||||
if (!cfg) return FALSE;
|
|
||||||
|
|
||||||
if ((dwErr = OpenRootKey(&hkRootKey, KEY_WRITE))) {
|
|
||||||
SetLastError(dwErr);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
StoreConfig(hkRootKey, cfg,
|
|
||||||
ScreenshotDir, REG_SZ)
|
|
||||||
StoreConfig(hkRootKey, cfg,
|
|
||||||
Upload, REG_DWORD)
|
|
||||||
StoreConfig(hkRootKey, cfg,
|
|
||||||
KeepScreenshots, REG_DWORD)
|
|
||||||
StoreConfig(hkRootKey, cfg,
|
|
||||||
HelperStartup, REG_DWORD)
|
|
||||||
StoreConfig(hkRootKey, cfg,
|
|
||||||
HelperShortcut, REG_DWORD)
|
|
||||||
|
|
||||||
RegCloseKey(hkRootKey);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
FreeConfig(Config *cfg)
|
|
||||||
{
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
if (!cfg) return;
|
|
||||||
|
|
||||||
HeapFree(hHeap, 0, cfg);
|
|
||||||
return;
|
|
||||||
}
|
|
|
@ -1,86 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
typedef struct _MultiString {
|
|
||||||
LPTSTR * Values; // Array of string values
|
|
||||||
size_t Count; // Length of Values
|
|
||||||
size_t TotalLength; // Used by registry helpers.
|
|
||||||
// NOTE: This length includes the NULL
|
|
||||||
// terminator characters of each string
|
|
||||||
DWORD Reserved[2]; // Used internally
|
|
||||||
} MultiString;
|
|
||||||
|
|
||||||
// Initializes an existing MultiString array, with the given length.
|
|
||||||
// If dwInitLen is 0, no entries are pre-allocated.
|
|
||||||
BOOL
|
|
||||||
MultiString_Init(MultiString *ms,
|
|
||||||
DWORD dwInitLen);
|
|
||||||
|
|
||||||
// Appends a copy of szNew to the end of the list.
|
|
||||||
//
|
|
||||||
// NOTE: A new string with the same length as szNew is allocated and
|
|
||||||
// stored in ms. This makes future internal freeing easier, but means
|
|
||||||
// the function caller is responsible for freeing the parameter.
|
|
||||||
BOOL
|
|
||||||
MultiString_Append(MultiString *ms,
|
|
||||||
LPCTSTR szNew);
|
|
||||||
|
|
||||||
// Removes the string at dwIdx, freeing the memory used.
|
|
||||||
BOOL
|
|
||||||
MultiString_Remove(MultiString *ms,
|
|
||||||
DWORD dwIdx);
|
|
||||||
|
|
||||||
// Replaces the string at dwIdx with szNew. Allocations are performed
|
|
||||||
// similar to MultiString_Append.
|
|
||||||
BOOL
|
|
||||||
MultiString_Replace(MultiString *ms,
|
|
||||||
DWORD dwIdx,
|
|
||||||
LPCTSTR szNew);
|
|
||||||
|
|
||||||
// Frees all memory in a MultiString structure.
|
|
||||||
void
|
|
||||||
MultiString_Dispose(MultiString *ms);
|
|
||||||
|
|
||||||
typedef enum _HelperShortcut {
|
|
||||||
HSC_MACOS, // Pretend to be like MacOS (Win+Shift+4)
|
|
||||||
HSC_WIN10, // Pretend to be like Windows (Win+Shift+S)
|
|
||||||
HSC_CUSTOM // Use a custom keyboard shortcut
|
|
||||||
} HlprKbd;
|
|
||||||
|
|
||||||
typedef struct _GlobalConfig {
|
|
||||||
TCHAR ScreenshotDir[MAX_PATH];
|
|
||||||
BOOL Upload;
|
|
||||||
BOOL KeepScreenshots;
|
|
||||||
BOOL HelperStartup;
|
|
||||||
HlprKbd HelperShortcut;
|
|
||||||
} Config;
|
|
||||||
|
|
||||||
typedef enum _AuthMethod {
|
|
||||||
CFG_NOAUTH, // Anonymous HTTP requests
|
|
||||||
CFG_BASICAUTH, // Use HTTP Basic auth
|
|
||||||
CFG_DIGESTAUTH, // Use HTTP Digest auth
|
|
||||||
CFG_TOKENAUTH // Use a custom Authorization header
|
|
||||||
} AuthMethod;
|
|
||||||
|
|
||||||
typedef struct _UploadConfig {
|
|
||||||
LPTSTR Name;
|
|
||||||
LPTSTR URL;
|
|
||||||
LPTSTR Method;
|
|
||||||
/*
|
|
||||||
* NOTE: If AuthType == CFG_TOKENAUTH, Username is blank/NULL and
|
|
||||||
* Password is the token.
|
|
||||||
*/
|
|
||||||
LPTSTR Username;
|
|
||||||
LPTSTR Password;
|
|
||||||
AuthMethod HTTPAuthMethod;
|
|
||||||
|
|
||||||
MultiString Headers;
|
|
||||||
MultiString Parameters;
|
|
||||||
} UploadConfig;
|
|
||||||
|
|
||||||
|
|
||||||
// Gets the current configuration from the registry.
|
|
||||||
Config *GetConfig(void);
|
|
||||||
// Saves the Config object to the registry.
|
|
||||||
BOOL SaveConfig(Config *cfg);
|
|
||||||
// Frees all memory associated with the Config object.
|
|
||||||
void FreeConfig(Config *cfg);
|
|
|
@ -1,196 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
#define STRSAFE_NO_DEPRECATE
|
|
||||||
#include <Strsafe.h>
|
|
||||||
|
|
||||||
#define CurAlloc Reserved[0]
|
|
||||||
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
MultiString_Init(MultiString *ms,
|
|
||||||
DWORD dwInitLen)
|
|
||||||
{
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
|
|
||||||
if (!ms) {
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dwInitLen) {
|
|
||||||
ms->CurAlloc = dwInitLen;
|
|
||||||
ms->Values = HeapAlloc(hHeap,
|
|
||||||
HEAP_ZERO_MEMORY,
|
|
||||||
sizeof(LPTSTR) * dwInitLen);
|
|
||||||
if (!ms->Values) return FALSE;
|
|
||||||
ms->Count = 0;
|
|
||||||
} else {
|
|
||||||
// Otherwise, this amounts to a zero-out
|
|
||||||
ZeroMemory(ms, sizeof(MultiString));
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
__inline static LPTSTR
|
|
||||||
CreateStrCopy(LPCTSTR szStr)
|
|
||||||
{
|
|
||||||
HRESULT hrRes;
|
|
||||||
LPTSTR szNewCopy;
|
|
||||||
// dwLen needs to include the NULL terminator
|
|
||||||
size_t dwLen = _tcslen(szStr) + 1;
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
|
|
||||||
// Allocate the new string
|
|
||||||
szNewCopy = HeapAlloc(hHeap,
|
|
||||||
HEAP_ZERO_MEMORY,
|
|
||||||
sizeof(TCHAR) * dwLen);
|
|
||||||
if (!szNewCopy) return NULL;
|
|
||||||
|
|
||||||
// Copy the actual data over
|
|
||||||
hrRes = StringCchCopy(szNewCopy,
|
|
||||||
dwLen,
|
|
||||||
szStr);
|
|
||||||
if (FAILED(hrRes)) {
|
|
||||||
HeapFree(hHeap, 0, szNewCopy);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return szNewCopy;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
MultiString_Append(MultiString *ms,
|
|
||||||
LPCTSTR szNew)
|
|
||||||
{
|
|
||||||
LPTSTR szNewCopy = NULL;
|
|
||||||
DWORD dwNewLen;
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
|
|
||||||
if (!ms || !szNew) {
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
dwNewLen = (DWORD)_tcslen(szNew) + 1;
|
|
||||||
|
|
||||||
// Do we need to allocate more room for pointers?
|
|
||||||
if (ms->Values == NULL) {
|
|
||||||
// Oops, we have nothing! Let's allocate a couple
|
|
||||||
if (!MultiString_Init(ms, 3)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
} else if (ms->CurAlloc == ms->Count) {
|
|
||||||
DWORD dwNewAlloc = ms->CurAlloc + 3;
|
|
||||||
LPTSTR *pszNew = HeapReAlloc(hHeap,
|
|
||||||
0,
|
|
||||||
ms->Values,
|
|
||||||
sizeof(LPTSTR) * dwNewAlloc);
|
|
||||||
if (!pszNew) {
|
|
||||||
// ReAlloc failed :<
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
ms->CurAlloc = dwNewAlloc;
|
|
||||||
ms->Values = pszNew;
|
|
||||||
}
|
|
||||||
|
|
||||||
szNewCopy = CreateStrCopy(szNew);
|
|
||||||
if (!szNewCopy) return FALSE;
|
|
||||||
|
|
||||||
// All set, append to the end and increment Count
|
|
||||||
ms->Values[ms->Count++] = szNewCopy;
|
|
||||||
ms->TotalLength += dwNewLen;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
MultiString_Remove(MultiString *ms,
|
|
||||||
DWORD dwIdx)
|
|
||||||
{
|
|
||||||
DWORD dwLen = 0;
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
|
|
||||||
if (!ms) return FALSE;
|
|
||||||
|
|
||||||
if (dwIdx >= ms->Count) {
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
return FALSE;
|
|
||||||
} else if (ms->Values[dwIdx] != NULL) {
|
|
||||||
dwLen = (DWORD)_tcslen(ms->Values[dwIdx]) + 1;
|
|
||||||
|
|
||||||
HeapFree(hHeap, 0, ms->Values[dwIdx]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Shift down the remaining strings
|
|
||||||
if (dwIdx < ms->Count - 1) {
|
|
||||||
size_t i;
|
|
||||||
for (i = dwIdx; i < ms->Count - 1; i++) {
|
|
||||||
ms->Values[i] = ms->Values[i + 1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ms->Count--;
|
|
||||||
ms->TotalLength -= dwLen;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
MultiString_Replace(MultiString *ms,
|
|
||||||
DWORD dwIdx,
|
|
||||||
LPCTSTR szNew)
|
|
||||||
{
|
|
||||||
DWORD dwOldLen = 0,
|
|
||||||
dwNewLen = 0;
|
|
||||||
LPTSTR szTmp;
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
|
|
||||||
if (!ms || !szNew) return FALSE;
|
|
||||||
|
|
||||||
if (dwIdx >= ms->Count) {
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
dwNewLen = (DWORD)_tcslen(szNew) + 1;
|
|
||||||
|
|
||||||
// Create the copied new string
|
|
||||||
szTmp = CreateStrCopy(szNew);
|
|
||||||
if (!szTmp) return FALSE;
|
|
||||||
|
|
||||||
// Perform the switcheroo
|
|
||||||
if (ms->Values[dwIdx] != NULL) {
|
|
||||||
dwOldLen = (DWORD)_tcslen(ms->Values[dwIdx]) + 1;
|
|
||||||
|
|
||||||
HeapFree(hHeap, 0, ms->Values[dwIdx]);
|
|
||||||
}
|
|
||||||
|
|
||||||
ms->Values[dwIdx] = szTmp;
|
|
||||||
ms->TotalLength = ms->TotalLength + dwNewLen - dwOldLen;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MultiString_Dispose(MultiString *ms)
|
|
||||||
{
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
DWORD i;
|
|
||||||
|
|
||||||
if (!ms) return;
|
|
||||||
|
|
||||||
if (ms->Values != NULL) {
|
|
||||||
for (i = 0; i < ms->Count; i++) {
|
|
||||||
HeapFree(hHeap, 0, ms->Values[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
HeapFree(hHeap, 0, ms->Values);
|
|
||||||
ms->Values = NULL;
|
|
||||||
}
|
|
||||||
ms->Count = 0;
|
|
||||||
ms->CurAlloc = 0;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
========================================================================
|
|
||||||
STATIC LIBRARY : CommonCfg Project Overview
|
|
||||||
========================================================================
|
|
||||||
|
|
||||||
AppWizard has created this CommonCfg library project for you.
|
|
||||||
This file contains a summary of what you will find in each of the files that
|
|
||||||
make up your CommonCfg application.
|
|
||||||
|
|
||||||
|
|
||||||
CommonCfg.vcproj
|
|
||||||
This is the main project file for VC++ projects generated using an Application Wizard.
|
|
||||||
It contains information about the version of Visual C++ that generated the file, and
|
|
||||||
information about the platforms, configurations, and project features selected with the
|
|
||||||
Application Wizard.
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
StdAfx.h, StdAfx.cpp
|
|
||||||
These files are used to build a precompiled header (PCH) file
|
|
||||||
named CommonCfg.pch and a precompiled types file named StdAfx.obj.
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
Other notes:
|
|
||||||
|
|
||||||
AppWizard uses "TODO:" comments to indicate parts of the source code you
|
|
||||||
should add to or customize.
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
|
@ -1,280 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
#define STRSAFE_NO_DEPRECATE
|
|
||||||
#include <Strsafe.h>
|
|
||||||
|
|
||||||
// Used by CopyRegValue specifically for copying
|
|
||||||
// REG_MULTI_SZ values, because those in particular are
|
|
||||||
// really funky.
|
|
||||||
static BOOL
|
|
||||||
CopyMultiValue(HKEY hKey,
|
|
||||||
PVOID pVal,
|
|
||||||
LPCTSTR szName,
|
|
||||||
DWORD dwSize)
|
|
||||||
{
|
|
||||||
int iStrCount = 0;
|
|
||||||
LPTSTR szMulti = NULL,
|
|
||||||
ptr;
|
|
||||||
BOOL bWasNull = FALSE;
|
|
||||||
LONG lRes;
|
|
||||||
MultiString *msData = (MultiString *)pVal;
|
|
||||||
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
|
|
||||||
szMulti = HeapAlloc(hHeap,
|
|
||||||
HEAP_ZERO_MEMORY,
|
|
||||||
dwSize + sizeof(TCHAR));
|
|
||||||
if (!szMulti) return FALSE;
|
|
||||||
|
|
||||||
// Get the multi-string value
|
|
||||||
if (!(lRes = RegQueryValueEx(hKey,
|
|
||||||
szName,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
szMulti,
|
|
||||||
&dwSize)))
|
|
||||||
{
|
|
||||||
HeapFree(hHeap, 0, szMulti);
|
|
||||||
SetLastError(lRes);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ptr = szMulti; (ptr - szMulti) < (LONG)dwSize; ptr++) {
|
|
||||||
if (*ptr == 0) {
|
|
||||||
if (bWasNull) {
|
|
||||||
// Two NULLs in a row, we're done!
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
// End of string, add to the list
|
|
||||||
bWasNull = TRUE;
|
|
||||||
iStrCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bWasNull = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!bWasNull) {
|
|
||||||
// Not properly NULL terminated, sigh...
|
|
||||||
// Make sure to count the last string.
|
|
||||||
iStrCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!MultiString_Init(msData, iStrCount)) {
|
|
||||||
HeapFree(hHeap, 0, szMulti);
|
|
||||||
return FALSE;
|
|
||||||
} else {
|
|
||||||
int i;
|
|
||||||
for (i = 0, ptr = szMulti; i < iStrCount; i++, ptr += strlen(ptr) + 1) {
|
|
||||||
if (!MultiString_Append(msData, ptr)) {
|
|
||||||
DWORD err = GetLastError();
|
|
||||||
|
|
||||||
HeapFree(hHeap, 0, szMulti);
|
|
||||||
MultiString_Dispose(msData);
|
|
||||||
|
|
||||||
SetLastError(err);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HeapFree(hHeap, 0, szMulti);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
CopyRegValue(HKEY hKey,
|
|
||||||
PVOID pVal,
|
|
||||||
LPCTSTR szName,
|
|
||||||
DWORD dwType,
|
|
||||||
DWORD dwSize)
|
|
||||||
{
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
PVOID pData = pVal;
|
|
||||||
LONG lRes;
|
|
||||||
|
|
||||||
if (pVal == NULL ||
|
|
||||||
szName == NULL ||
|
|
||||||
hKey == NULL) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dwType == REG_BINARY ||
|
|
||||||
dwType == REG_SZ) {
|
|
||||||
pData = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize);
|
|
||||||
if (!pData) return FALSE;
|
|
||||||
*(PVOID *)pVal = pData;
|
|
||||||
} else if (dwType == REG_MULTI_SZ) {
|
|
||||||
// REG_MULTI_SZ is complex enough to warrant its own
|
|
||||||
// function
|
|
||||||
return CopyMultiValue(hKey, pVal, szName, dwSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((lRes = RegQueryValueEx(hKey,
|
|
||||||
szName,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
pData,
|
|
||||||
&dwSize)) != ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SetLastError(lRes);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enumerates across all values in a key, running the given
|
|
||||||
// RegEnumCallback. Use `pData` to pass application-defined
|
|
||||||
// data to your enumerator callback.
|
|
||||||
BOOL RegGetAllValues(HKEY hKey,
|
|
||||||
RegEnumCallback cb,
|
|
||||||
PVOID pData)
|
|
||||||
{
|
|
||||||
LONG lRes;
|
|
||||||
TCHAR szValName[512];
|
|
||||||
DWORD dwNameLen = 512,
|
|
||||||
dwIdx,
|
|
||||||
dwValType,
|
|
||||||
dwValSize;
|
|
||||||
if (!hKey || !cb) return FALSE;
|
|
||||||
|
|
||||||
for (dwIdx = 0;
|
|
||||||
dwNameLen = 512, // reset dwNameLen first
|
|
||||||
!(lRes = RegEnumValue(hKey,
|
|
||||||
dwIdx,
|
|
||||||
szValName,
|
|
||||||
&dwNameLen,
|
|
||||||
0,
|
|
||||||
&dwValType,
|
|
||||||
NULL,
|
|
||||||
&dwValSize));
|
|
||||||
dwIdx++) {
|
|
||||||
// Enforce null termination
|
|
||||||
szValName[min(511, dwNameLen)] = 0;
|
|
||||||
// pass to callback
|
|
||||||
if (!cb(hKey,
|
|
||||||
szValName,
|
|
||||||
dwValSize,
|
|
||||||
dwValType,
|
|
||||||
pData)) {
|
|
||||||
// Callback returned failure, bail out
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lRes != ERROR_NO_MORE_ITEMS) {
|
|
||||||
// Some enumeration error happened, store it
|
|
||||||
// and report the failure
|
|
||||||
SetLastError(lRes);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
RegStoreMultiString(HKEY hKey,
|
|
||||||
LPTSTR szValName,
|
|
||||||
MultiString *msData)
|
|
||||||
{
|
|
||||||
LPTSTR szMulti;
|
|
||||||
DWORD dwMultiSize;
|
|
||||||
LONG lRes;
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
|
|
||||||
if (!msData->TotalLength) return FALSE;
|
|
||||||
|
|
||||||
// Total size + second NULL terminator
|
|
||||||
dwMultiSize = (DWORD)msData->TotalLength + 1;
|
|
||||||
szMulti = HeapAlloc(hHeap,
|
|
||||||
HEAP_ZERO_MEMORY,
|
|
||||||
dwMultiSize * sizeof(TCHAR));
|
|
||||||
if (!szMulti) return FALSE;
|
|
||||||
|
|
||||||
// Copy all the strings into one buffer, as per REG_MULTI_SZ
|
|
||||||
{
|
|
||||||
DWORD i, dwCurLen;
|
|
||||||
for (i = 0, dwCurLen = 0;
|
|
||||||
i < msData->Count && dwCurLen < dwMultiSize;
|
|
||||||
dwCurLen += (DWORD)_tcslen(msData->Values[i++]) + 1) {
|
|
||||||
HRESULT hrRes = StringCchCopy(&szMulti[dwCurLen],
|
|
||||||
_tcslen(msData->Values[i]) + 1,
|
|
||||||
msData->Values[i]);
|
|
||||||
if (FAILED(hrRes)) {
|
|
||||||
HeapFree(hHeap, 0, szMulti);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lRes = RegSetValueEx(hKey,
|
|
||||||
szValName,
|
|
||||||
0,
|
|
||||||
REG_MULTI_SZ,
|
|
||||||
szMulti,
|
|
||||||
dwMultiSize);
|
|
||||||
|
|
||||||
HeapFree(hHeap, 0, szMulti);
|
|
||||||
|
|
||||||
if (lRes != ERROR_SUCCESS) {
|
|
||||||
SetLastError(lRes);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stores a value in the registry, making assumptions based on the
|
|
||||||
// key type.
|
|
||||||
BOOL
|
|
||||||
RegStoreValue(HKEY hKey,
|
|
||||||
LPTSTR szValName,
|
|
||||||
PVOID pData,
|
|
||||||
DWORD dwValType)
|
|
||||||
{
|
|
||||||
DWORD dwStoreSize;
|
|
||||||
LONG lRes;
|
|
||||||
if (!hKey || !szValName || !pData) return FALSE;
|
|
||||||
|
|
||||||
switch (dwValType) {
|
|
||||||
case REG_SZ:
|
|
||||||
case REG_EXPAND_SZ:
|
|
||||||
dwStoreSize = (DWORD)_tcslen((LPTSTR)pData) + sizeof(TCHAR);
|
|
||||||
break;
|
|
||||||
case REG_DWORD:
|
|
||||||
dwStoreSize = sizeof(DWORD);
|
|
||||||
break;
|
|
||||||
#ifdef QWORD
|
|
||||||
case REG_QWORD:
|
|
||||||
dwStoreSize = sizeof(QWORD);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case REG_BINARY:
|
|
||||||
// TODO: handle REG_BINARY? will we ever use it?
|
|
||||||
OutputDebugString(_T("REG_BINARY attempted to be stored! Unsupported"));
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
return FALSE;
|
|
||||||
case REG_MULTI_SZ:
|
|
||||||
return RegStoreMultiString(hKey,
|
|
||||||
szValName,
|
|
||||||
(MultiString *)pData);
|
|
||||||
default:
|
|
||||||
// ignore
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
lRes = RegSetValueEx(hKey,
|
|
||||||
szValName,
|
|
||||||
0,
|
|
||||||
dwValType,
|
|
||||||
pData,
|
|
||||||
dwStoreSize);
|
|
||||||
if (lRes != ERROR_SUCCESS) {
|
|
||||||
SetLastError(lRes);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
// Helper functions for handling the registry
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
// Used behind CopyIfMatch. Copies a given registry value to
|
|
||||||
// another location, regardless of type.
|
|
||||||
BOOL CopyRegValue(HKEY hKey,
|
|
||||||
PVOID pVal,
|
|
||||||
LPCTSTR szName,
|
|
||||||
DWORD dwType,
|
|
||||||
DWORD dwSize);
|
|
||||||
|
|
||||||
// Callback for RegGetAllValues
|
|
||||||
typedef BOOL (*RegEnumCallback)(HKEY hKey,
|
|
||||||
LPTSTR szValName,
|
|
||||||
DWORD dwValSize,
|
|
||||||
DWORD dwValType,
|
|
||||||
PVOID pData);
|
|
||||||
|
|
||||||
// Enumerates across all values in a key, running the given
|
|
||||||
// RegEnumCallback. Use `pData` to pass application-defined
|
|
||||||
// data to your enumerator callback.
|
|
||||||
BOOL RegGetAllValues(HKEY hKey,
|
|
||||||
RegEnumCallback cb,
|
|
||||||
PVOID pData);
|
|
||||||
|
|
||||||
// Wrapper function for storing reg values, regardless of type
|
|
||||||
BOOL RegStoreValue(HKEY hKey,
|
|
||||||
LPTSTR szValName,
|
|
||||||
PVOID pData,
|
|
||||||
DWORD dwValType);
|
|
||||||
|
|
||||||
// Used primarily by RegEnumCallback, hence the hardcoded
|
|
||||||
// var names.
|
|
||||||
// You might want to check out one of the Get*Config functions
|
|
||||||
// for more background on how to use this, but it should make the
|
|
||||||
// callback function as easy as:
|
|
||||||
//
|
|
||||||
// CopyIfMatch(hKey, myStruct,
|
|
||||||
// myField, REG_SZ) // or any type
|
|
||||||
// else CopyIfMatch(hKey, myStruct,
|
|
||||||
// myOtherField, REG_DWORD) // also note: no semicolons
|
|
||||||
// // ... and so on
|
|
||||||
#define CopyIfMatch(hk,x,name,type) \
|
|
||||||
if (!_tcsncmp(_T(#name), \
|
|
||||||
szValName, \
|
|
||||||
_tcslen(_T(#name))) \
|
|
||||||
&& (dwValType & 0xfff) == type) { \
|
|
||||||
if (!CopyRegValue(hk, \
|
|
||||||
&((x)->name), \
|
|
||||||
_T(#name), \
|
|
||||||
type, \
|
|
||||||
dwValSize)) { \
|
|
||||||
return FALSE; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper macro for Save*Config functions. Assumes a BOOL-returning
|
|
||||||
// function in a vacuum.
|
|
||||||
#define StoreConfig(hk,x,name,type) \
|
|
||||||
if (!RegStoreValue(hk, _T(#name), &(x)->name, type)) { \
|
|
||||||
DWORD dwRegErr = GetLastError(); \
|
|
||||||
RegCloseKey(hk); \
|
|
||||||
return FALSE; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ROOT_KEYNAME "SOFTWARE\\Grabby"
|
|
||||||
// Hack to handle REG_SZ values that are actually TCHAR[MAX_PATH].
|
|
||||||
#define REG_PATH_SZ (0xf000 & REG_SZ)
|
|
|
@ -1,65 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
static BOOL
|
|
||||||
UploadConfigCb(HKEY hKey,
|
|
||||||
LPTSTR szValName,
|
|
||||||
DWORD dwValSize,
|
|
||||||
DWORD dwValType,
|
|
||||||
PVOID pData)
|
|
||||||
{
|
|
||||||
UploadConfig *ucfg = pData;
|
|
||||||
if (!ucfg) return FALSE;
|
|
||||||
|
|
||||||
CopyIfMatch(hKey, ucfg,
|
|
||||||
Name, REG_SZ)
|
|
||||||
else CopyIfMatch(hKey, ucfg,
|
|
||||||
URL, REG_SZ)
|
|
||||||
else CopyIfMatch(hKey, ucfg,
|
|
||||||
Method, REG_SZ)
|
|
||||||
else CopyIfMatch(hKey, ucfg,
|
|
||||||
Username, REG_SZ)
|
|
||||||
else CopyIfMatch(hKey, ucfg,
|
|
||||||
Password, REG_SZ)
|
|
||||||
else CopyIfMatch(hKey, ucfg,
|
|
||||||
HTTPAuthMethod, REG_DWORD)
|
|
||||||
else CopyIfMatch(hKey, ucfg,
|
|
||||||
Headers, REG_MULTI_SZ)
|
|
||||||
else CopyIfMatch(hKey, ucfg,
|
|
||||||
Parameters, REG_MULTI_SZ)
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
UploadConfig *
|
|
||||||
GetUploadConfig(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
HKEY hkUploadKey = NULL;
|
|
||||||
HANDLE hHeap = GetProcessHeap();
|
|
||||||
LONG lRes;
|
|
||||||
UploadConfig *ucfg = HeapAlloc(hHeap,
|
|
||||||
HEAP_ZERO_MEMORY,
|
|
||||||
sizeof(UploadConfig));
|
|
||||||
|
|
||||||
if (!ucfg) return NULL;
|
|
||||||
|
|
||||||
// TODO: defaults?
|
|
||||||
lRes = RegOpenKeyEx(HKEY_CURRENT_USER,
|
|
||||||
_T(ROOT_KEYNAME "\\Upload"),
|
|
||||||
0,
|
|
||||||
KEY_READ,
|
|
||||||
&hkUploadKey);
|
|
||||||
|
|
||||||
if (lRes) {
|
|
||||||
SetLastError(lRes);
|
|
||||||
HeapFree(hHeap, 0, ucfg);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!RegGetAllValues(hkUploadKey, UploadConfigCb, ucfg)) {
|
|
||||||
HeapFree(hHeap, 0, ucfg);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ucfg;
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
|
@ -1,17 +0,0 @@
|
||||||
// stdafx.h : include file for standard system include files,
|
|
||||||
// or project specific include files that are used frequently, but
|
|
||||||
// are changed infrequently
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
|
||||||
#include <Windows.h>
|
|
||||||
#include <tchar.h>
|
|
||||||
#include <ShlObj.h>
|
|
||||||
#include <shlwapi.h>
|
|
||||||
|
|
||||||
// TODO: reference additional headers your program requires here
|
|
||||||
#include "RegHelper.h"
|
|
||||||
#include "Export/Config.h"
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include "Bitmap.h"
|
#include "Bitmap.h"
|
||||||
#include "Overlay.h"
|
#include "Overlay.h"
|
||||||
#include "Grabby.h"
|
#include "Grabby.h"
|
||||||
#include <Config.h>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Print an error with a given context before bailing out
|
* Print an error with a given context before bailing out
|
||||||
|
@ -44,7 +43,7 @@ void Die(LPTSTR lpContextMsg)
|
||||||
_T("Catastrophic Error"),
|
_T("Catastrophic Error"),
|
||||||
MB_OK | MB_ICONERROR);
|
MB_OK | MB_ICONERROR);
|
||||||
} else {
|
} else {
|
||||||
StringCchPrintf(lpszFullMsg, iFullLen, lpszFmt, lpContextMsg, lpszError);
|
_sntprintf(lpszFullMsg, iFullLen, lpszFmt, lpContextMsg, lpszError);
|
||||||
MessageBox(NULL,
|
MessageBox(NULL,
|
||||||
lpszFullMsg,
|
lpszFullMsg,
|
||||||
_T("Fatal Error"),
|
_T("Fatal Error"),
|
||||||
|
@ -63,24 +62,16 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
|
||||||
SYSTEMTIME stNow = {0};
|
SYSTEMTIME stNow = {0};
|
||||||
RECT capRegion = {0};
|
RECT capRegion = {0};
|
||||||
Screen *scrn = CreateScreen();
|
Screen *scrn = CreateScreen();
|
||||||
Config *cfg;
|
#define OUTPUT_DIR_LEN 96
|
||||||
TCHAR szFullOutPath[MAX_PATH];
|
TCHAR szOutputDir[OUTPUT_DIR_LEN + 1];
|
||||||
|
#define FULL_OUT_PATH_LEN OUTPUT_DIR_LEN + 24
|
||||||
|
TCHAR szFullOutPath[FULL_OUT_PATH_LEN + 1];
|
||||||
HRESULT hRes;
|
HRESULT hRes;
|
||||||
|
|
||||||
if (!scrn) {
|
if (!scrn) {
|
||||||
Die("Couldn't get screen information");
|
Die("Couldn't get screen information");
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg = GetConfig();
|
|
||||||
if (!cfg) {
|
|
||||||
Die("Couldn't get config");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!PathFileExists(cfg->ScreenshotDir) &&
|
|
||||||
!CreateDirectory(cfg->ScreenshotDir, NULL)) {
|
|
||||||
Die("Couldn't create configured folder");
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (CreateOverlay(hInstance, scrn)) {
|
switch (CreateOverlay(hInstance, scrn)) {
|
||||||
case -1:
|
case -1:
|
||||||
Die("Couldn't create overlay window");
|
Die("Couldn't create overlay window");
|
||||||
|
@ -95,12 +86,16 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
|
||||||
|
|
||||||
GetChosenRect(&capRegion);
|
GetChosenRect(&capRegion);
|
||||||
|
|
||||||
|
if (!GetTempPath(OUTPUT_DIR_LEN, szOutputDir)) {
|
||||||
|
Die("Couldn't get temporary directory");
|
||||||
|
}
|
||||||
|
|
||||||
GetLocalTime(&stNow);
|
GetLocalTime(&stNow);
|
||||||
|
|
||||||
hRes = StringCchPrintf(szFullOutPath,
|
hRes = StringCchPrintf(szFullOutPath,
|
||||||
MAX_PATH,
|
FULL_OUT_PATH_LEN,
|
||||||
"%s\\Screenshot at %04d-%02d-%02d %02d.%02d.%02d.bmp",
|
"%s\\scrn_%04d%02d%02d_%02d%02d%02d.bmp",
|
||||||
cfg->ScreenshotDir,
|
szOutputDir,
|
||||||
stNow.wYear,
|
stNow.wYear,
|
||||||
stNow.wMonth,
|
stNow.wMonth,
|
||||||
stNow.wDay,
|
stNow.wDay,
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
@ -10,25 +10,76 @@
|
||||||
#define APSTUDIO_HIDDEN_SYMBOLS
|
#define APSTUDIO_HIDDEN_SYMBOLS
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#undef APSTUDIO_HIDDEN_SYMBOLS
|
#undef APSTUDIO_HIDDEN_SYMBOLS
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
#undef APSTUDIO_READONLY_SYMBOLS
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Japanese resources
|
|
||||||
|
|
||||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
|
||||||
#ifdef _WIN32
|
LANGUAGE 17, 1
|
||||||
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
|
|
||||||
#pragma code_page(932)
|
#pragma code_page(932)
|
||||||
#endif //_WIN32
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Icon
|
||||||
|
//
|
||||||
|
|
||||||
|
// Icon with lowest ID value placed first to ensure application icon
|
||||||
|
// remains consistent on all systems.
|
||||||
|
|
||||||
|
IDI_GRABBY ICON "Grabby.ico"
|
||||||
|
IDI_SMALL ICON "small.ico"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Menu
|
||||||
|
//
|
||||||
|
|
||||||
|
IDC_GRABBY MENU
|
||||||
|
BEGIN
|
||||||
|
POPUP "&File"
|
||||||
|
BEGIN
|
||||||
|
MENUITEM "E&xit", IDM_EXIT
|
||||||
|
END
|
||||||
|
POPUP "&Help"
|
||||||
|
BEGIN
|
||||||
|
MENUITEM "&About ...", IDM_ABOUT
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Accelerator
|
||||||
|
//
|
||||||
|
|
||||||
|
IDC_GRABBY ACCELERATORS
|
||||||
|
BEGIN
|
||||||
|
"?", IDM_ABOUT, ASCII, ALT
|
||||||
|
"/", IDM_ABOUT, ASCII, ALT
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Dialog
|
||||||
|
//
|
||||||
|
|
||||||
|
IDD_ABOUTBOX DIALOG 22, 17, 230, 75
|
||||||
|
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "About"
|
||||||
|
FONT 9, "System"
|
||||||
|
BEGIN
|
||||||
|
ICON IDI_GRABBY,IDC_MYICON,14,9,16,16
|
||||||
|
LTEXT "Grabby Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX
|
||||||
|
LTEXT "Copyright (C) 2024",IDC_STATIC,49,20,119,8
|
||||||
|
DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// TEXTINCLUDE
|
// TEXTINCLUDE
|
||||||
//
|
//
|
||||||
|
|
||||||
1 TEXTINCLUDE
|
1 TEXTINCLUDE
|
||||||
BEGIN
|
BEGIN
|
||||||
"resource.h\0"
|
"resource.h\0"
|
||||||
|
@ -50,30 +101,18 @@ END
|
||||||
|
|
||||||
#endif // APSTUDIO_INVOKED
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
#endif // Japanese resources
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// English (U.S.) resources
|
|
||||||
|
|
||||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
|
||||||
#ifdef _WIN32
|
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|
||||||
#pragma code_page(1252)
|
|
||||||
#endif //_WIN32
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Icon
|
// String Table
|
||||||
//
|
//
|
||||||
|
|
||||||
// Icon with lowest ID value placed first to ensure application icon
|
STRINGTABLE
|
||||||
// remains consistent on all systems.
|
BEGIN
|
||||||
IDI_GRABBY ICON "Grabby.ico"
|
IDC_GRABBY "GRABBY"
|
||||||
IDI_SMALL ICON "small.ico"
|
IDS_APP_TITLE "Grabby"
|
||||||
IDI_ICON1 ICON "icon1.ico"
|
END
|
||||||
#endif // English (U.S.) resources
|
|
||||||
|
#endif
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,4 +126,3 @@ IDI_ICON1 ICON "icon1.ico"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
#endif // not APSTUDIO_INVOKED
|
#endif // not APSTUDIO_INVOKED
|
||||||
|
|
18
Grabby.sln
|
@ -1,13 +1,5 @@
|
||||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Grabby", "Grabby\Grabby.vcproj", "{700E5DD7-DD00-46D9-92DF-2C132940F53D}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Grabby", "Grabby.vcproj", "{700E5DD7-DD00-46D9-92DF-2C132940F53D}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GrbyCfg", "GrbyCfg\GrbyCfg.vcproj", "{BBB3E933-71CC-4EF7-BF56-52371B9AF938}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CommonCfg", "CommonCfg\CommonCfg.vcproj", "{61829180-05C1-4865-B9C3-FEB983AD6997}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
|
@ -21,14 +13,6 @@ Global
|
||||||
{700E5DD7-DD00-46D9-92DF-2C132940F53D}.Debug.Build.0 = Debug|Win32
|
{700E5DD7-DD00-46D9-92DF-2C132940F53D}.Debug.Build.0 = Debug|Win32
|
||||||
{700E5DD7-DD00-46D9-92DF-2C132940F53D}.Release.ActiveCfg = Release|Win32
|
{700E5DD7-DD00-46D9-92DF-2C132940F53D}.Release.ActiveCfg = Release|Win32
|
||||||
{700E5DD7-DD00-46D9-92DF-2C132940F53D}.Release.Build.0 = Release|Win32
|
{700E5DD7-DD00-46D9-92DF-2C132940F53D}.Release.Build.0 = Release|Win32
|
||||||
{BBB3E933-71CC-4EF7-BF56-52371B9AF938}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{BBB3E933-71CC-4EF7-BF56-52371B9AF938}.Debug.Build.0 = Debug|Win32
|
|
||||||
{BBB3E933-71CC-4EF7-BF56-52371B9AF938}.Release.ActiveCfg = Release|Win32
|
|
||||||
{BBB3E933-71CC-4EF7-BF56-52371B9AF938}.Release.Build.0 = Release|Win32
|
|
||||||
{61829180-05C1-4865-B9C3-FEB983AD6997}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{61829180-05C1-4865-B9C3-FEB983AD6997}.Debug.Build.0 = Debug|Win32
|
|
||||||
{61829180-05C1-4865-B9C3-FEB983AD6997}.Release.ActiveCfg = Release|Win32
|
|
||||||
{61829180-05C1-4865-B9C3-FEB983AD6997}.Release.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
Optimization="0"
|
Optimization="0"
|
||||||
AdditionalIncludeDirectories="D:\Projects\curl\include;..\CommonCfg\Export"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
||||||
MinimalRebuild="TRUE"
|
MinimalRebuild="TRUE"
|
||||||
BasicRuntimeChecks="3"
|
BasicRuntimeChecks="3"
|
||||||
|
@ -33,10 +32,8 @@
|
||||||
Name="VCCustomBuildTool"/>
|
Name="VCCustomBuildTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="libcurl_a.lib shlwapi.lib"
|
|
||||||
OutputFile="$(OutDir)/Grabby.exe"
|
OutputFile="$(OutDir)/Grabby.exe"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
AdditionalLibraryDirectories="D:\Projects\curl\lib"
|
|
||||||
GenerateDebugInformation="TRUE"
|
GenerateDebugInformation="TRUE"
|
||||||
ProgramDatabaseFile="$(OutDir)/Grabby.pdb"
|
ProgramDatabaseFile="$(OutDir)/Grabby.pdb"
|
||||||
SubSystem="2"
|
SubSystem="2"
|
||||||
|
@ -70,22 +67,18 @@
|
||||||
CharacterSet="2">
|
CharacterSet="2">
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
AdditionalIncludeDirectories="D:\Projects\curl\include;..\CommonCfg\Export"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
|
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
|
||||||
RuntimeLibrary="4"
|
RuntimeLibrary="4"
|
||||||
UsePrecompiledHeader="3"
|
UsePrecompiledHeader="3"
|
||||||
WarningLevel="3"
|
WarningLevel="3"
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
DebugInformationFormat="3"
|
DebugInformationFormat="3"/>
|
||||||
CompileAs="1"/>
|
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCustomBuildTool"/>
|
Name="VCCustomBuildTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="libcurl_a.lib shlwapi.lib"
|
|
||||||
OutputFile="$(OutDir)/Grabby.exe"
|
OutputFile="$(OutDir)/Grabby.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
AdditionalLibraryDirectories="D:\Projects\curl\lib"
|
|
||||||
GenerateDebugInformation="TRUE"
|
GenerateDebugInformation="TRUE"
|
||||||
SubSystem="2"
|
SubSystem="2"
|
||||||
OptimizeReferences="2"
|
OptimizeReferences="2"
|
||||||
|
@ -114,9 +107,6 @@
|
||||||
</Configuration>
|
</Configuration>
|
||||||
</Configurations>
|
</Configurations>
|
||||||
<References>
|
<References>
|
||||||
<ProjectReference
|
|
||||||
ReferencedProjectIdentifier="{61829180-05C1-4865-B9C3-FEB983AD6997}"
|
|
||||||
Name="CommonCfg"/>
|
|
||||||
</References>
|
</References>
|
||||||
<Files>
|
<Files>
|
||||||
<Filter
|
<Filter
|
||||||
|
@ -169,15 +159,12 @@
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Grabby.rc">
|
RelativePath=".\Grabby.rc">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\icon1.ico">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\small.ico">
|
RelativePath=".\small.ico">
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\ReadMe.txt">
|
RelativePath=".\ReadMe.txt">
|
||||||
</File>
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
<Globals>
|
<Globals>
|
BIN
Grabby/icon1.ico
Before Width: | Height: | Size: 766 B |
|
@ -1,36 +0,0 @@
|
||||||
//{{NO_DEPENDENCIES}}
|
|
||||||
// Microsoft Visual C++ generated include file.
|
|
||||||
// Used by Grabby.rc
|
|
||||||
//
|
|
||||||
#define IDC_MYICON 2
|
|
||||||
#define IDD_GRABBY_DIALOG 102
|
|
||||||
#define IDS_APP_TITLE 103
|
|
||||||
#define IDM_ABOUT 104
|
|
||||||
#define IDM_EXIT 105
|
|
||||||
#define IDI_GRABBY 107
|
|
||||||
#define IDI_SMALL 108
|
|
||||||
#define IDC_GRABBY 109
|
|
||||||
#define IDR_MAINFRAME 128
|
|
||||||
#define IDI_ICON1 129
|
|
||||||
#define IDC_TABVIEW 1000
|
|
||||||
#define IDC_APPLY 1001
|
|
||||||
#define IDC_EDIT1 1004
|
|
||||||
#define IDC_BUTTON1 1005
|
|
||||||
#define IDC_CHECK1 1006
|
|
||||||
#define IDC_URLINPUT 1007
|
|
||||||
#define IDC_ENCODEFILE 1008
|
|
||||||
#define IDC_COMBO1 1009
|
|
||||||
#define IDC_UPLOADMETHOD 1009
|
|
||||||
#define IDC_STATIC -1
|
|
||||||
|
|
||||||
// Next default values for new objects
|
|
||||||
//
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
#define _APS_NO_MFC 1
|
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 132
|
|
||||||
#define _APS_NEXT_COMMAND_VALUE 32771
|
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1010
|
|
||||||
#define _APS_NEXT_SYMED_VALUE 110
|
|
||||||
#endif
|
|
||||||
#endif
|
|
|
@ -1,11 +0,0 @@
|
||||||
#define _IS_DIALOG_C_
|
|
||||||
#include "stdafx.h"
|
|
||||||
#include "Dialog.h"
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
InitUserMsgs(void)
|
|
||||||
{
|
|
||||||
DEFINE_USER_MSG(WMU_SAVE_CONFIG);
|
|
||||||
DEFINE_USER_MSG(WMU_SETTING_CHANGED);
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#define _DLG_MSG_SUFFIX "{990f4b34-579a-4fbc-a5b2-08f46ef5e9c5}"
|
|
||||||
#define USER_MSG_NAME(name) _T( #name _DLG_MSG_SUFFIX )
|
|
||||||
#define DEFINE_USER_MSG(name) {\
|
|
||||||
LPCTSTR name##_MSG = USER_MSG_NAME(name); \
|
|
||||||
name = RegisterWindowMessage(name##_MSG); \
|
|
||||||
}
|
|
||||||
#define DECLARE_USER_MSG(name) \
|
|
||||||
UINT name;
|
|
||||||
|
|
||||||
/* --- */
|
|
||||||
|
|
||||||
DECLARE_USER_MSG(WMU_SAVE_CONFIG)
|
|
||||||
DECLARE_USER_MSG(WMU_SETTING_CHANGED)
|
|
||||||
|
|
||||||
void InitUserMsgs(void);
|
|
||||||
|
|
||||||
#define ChangedSetting(hwnd) \
|
|
||||||
SendMessage(hwnd, \
|
|
||||||
WMU_SETTING_CHANGED, \
|
|
||||||
0, 0)
|
|
||||||
|
|
||||||
#define IsChecked(ref) \
|
|
||||||
(IsDlgButtonChecked(hDlg, ref) == BST_CHECKED)
|
|
|
@ -1,4 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
// Define the dialog proc
|
|
||||||
DEF_DLGPROC(GeneralTab);
|
|
|
@ -1,182 +0,0 @@
|
||||||
/* General configuration dialog */
|
|
||||||
|
|
||||||
#include "stdafx.h"
|
|
||||||
#include "GrbyCfg.h"
|
|
||||||
|
|
||||||
int CALLBACK
|
|
||||||
ScreenshotBrowseCallback(HWND hWnd,
|
|
||||||
UINT uMsg,
|
|
||||||
LPARAM lParam,
|
|
||||||
LPARAM lpData)
|
|
||||||
{
|
|
||||||
if (uMsg == BFFM_INITIALIZED && lpData) {
|
|
||||||
// Set root dir
|
|
||||||
SendMessage(hWnd,
|
|
||||||
BFFM_SETSELECTION,
|
|
||||||
1,
|
|
||||||
lpData);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
INT_PTR CALLBACK
|
|
||||||
GeneralTab_DlgProc(HWND hDlg,
|
|
||||||
UINT uMsg,
|
|
||||||
WPARAM wParam,
|
|
||||||
LPARAM lParam)
|
|
||||||
{
|
|
||||||
static Config *cfg = NULL;
|
|
||||||
static HWND hStoreDir = NULL,
|
|
||||||
hCustomShortcut = NULL,
|
|
||||||
hParentDlg = NULL;
|
|
||||||
|
|
||||||
switch (uMsg) {
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
hParentDlg = GetParent(hDlg);
|
|
||||||
|
|
||||||
cfg = GetConfig();
|
|
||||||
if (!cfg) {
|
|
||||||
// TODO: better error management
|
|
||||||
// (probably SendMessage upstream)
|
|
||||||
MessageBox(hDlg,
|
|
||||||
_T("Can't get config! (TODO: error msg)"),
|
|
||||||
_T("Config Error"),
|
|
||||||
MB_OK | MB_ICONERROR);
|
|
||||||
DestroyWindow(hDlg);
|
|
||||||
}
|
|
||||||
|
|
||||||
hStoreDir = GetDlgItem(hDlg, IDC_SCRNDIR);
|
|
||||||
if (!hStoreDir) {
|
|
||||||
// TODO: error management x_x
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strlen(cfg->ScreenshotDir) > 0) {
|
|
||||||
// Set the screenshot dir, if we have it
|
|
||||||
SendMessage(hStoreDir,
|
|
||||||
EM_SETLIMITTEXT,
|
|
||||||
(WPARAM)MAX_PATH,
|
|
||||||
0);
|
|
||||||
SetWindowText(hStoreDir,
|
|
||||||
cfg->ScreenshotDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cfg->KeepScreenshots) {
|
|
||||||
// Keep screenshots after upload?
|
|
||||||
CheckDlgButton(hDlg,
|
|
||||||
IDC_KEEPIMGS,
|
|
||||||
BST_CHECKED);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cfg->HelperStartup) {
|
|
||||||
// Launch helper on startup?
|
|
||||||
CheckDlgButton(hDlg,
|
|
||||||
IDC_LAUNCHHELPER,
|
|
||||||
BST_CHECKED);
|
|
||||||
}
|
|
||||||
|
|
||||||
hCustomShortcut = GetDlgItem(hDlg,
|
|
||||||
IDC_CUSTOMKEY);
|
|
||||||
if (!hCustomShortcut) {
|
|
||||||
// TODO: error management orz
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable the shortcut input if Custom is set
|
|
||||||
EnableWindow(hCustomShortcut,
|
|
||||||
(cfg->HelperShortcut == HSC_CUSTOM));
|
|
||||||
|
|
||||||
// Also, check the correct radio box. This is hacky and
|
|
||||||
// expects IDC_RDMAC/WIN/CUSTOM is not changed, so uhhhh
|
|
||||||
// please don't change that assumption? ^_^;;
|
|
||||||
CheckDlgButton(hDlg,
|
|
||||||
IDC_RDMAC + min(2, cfg->HelperShortcut),
|
|
||||||
BST_CHECKED);
|
|
||||||
break;
|
|
||||||
case WM_NOTIFY:
|
|
||||||
// TODO
|
|
||||||
break;
|
|
||||||
case WM_COMMAND:
|
|
||||||
switch (LOWORD(wParam)) {
|
|
||||||
case IDC_LAUNCHHELPER:
|
|
||||||
cfg->HelperStartup =
|
|
||||||
(IsDlgButtonChecked(hDlg, IDC_LAUNCHHELPER) == BST_CHECKED);
|
|
||||||
ChangedSetting(hParentDlg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDC_KEEPIMGS:
|
|
||||||
cfg->KeepScreenshots =
|
|
||||||
(IsDlgButtonChecked(hDlg, IDC_KEEPIMGS) == BST_CHECKED);
|
|
||||||
ChangedSetting(hParentDlg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDC_RDMAC:
|
|
||||||
case IDC_RDWIN:
|
|
||||||
case IDC_RDCUSTOM:
|
|
||||||
// Generates the correct enum val a la GetConfig.
|
|
||||||
cfg->HelperShortcut = IsChecked(IDC_RDMAC) ? HSC_MACOS :
|
|
||||||
(IsChecked(IDC_RDWIN) ? HSC_WIN10 : HSC_CUSTOM);
|
|
||||||
// Enable/Disable the Custom Shortcut control as needed
|
|
||||||
EnableWindow(hCustomShortcut,
|
|
||||||
(cfg->HelperShortcut == HSC_CUSTOM));
|
|
||||||
ChangedSetting(hParentDlg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDC_SCRDIRBROWSE: {
|
|
||||||
LPITEMIDLIST lPidl;
|
|
||||||
BROWSEINFO bi = {0};
|
|
||||||
|
|
||||||
bi.hwndOwner = hDlg;
|
|
||||||
bi.lParam = (LPARAM)cfg->ScreenshotDir;
|
|
||||||
bi.lpfn = ScreenshotBrowseCallback;
|
|
||||||
bi.lpszTitle = _T("Select Screenshot Folder");
|
|
||||||
|
|
||||||
lPidl = SHBrowseForFolder(&bi);
|
|
||||||
if (lPidl == NULL) {
|
|
||||||
// Cancelled
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
SHGetPathFromIDList(lPidl,
|
|
||||||
cfg->ScreenshotDir);
|
|
||||||
|
|
||||||
// We don't need the PIDL anymore, so free it
|
|
||||||
{
|
|
||||||
LPMALLOC pMalloc;
|
|
||||||
if (SHGetMalloc(&pMalloc) == NOERROR) {
|
|
||||||
IMalloc_Free(pMalloc, lPidl);
|
|
||||||
IMalloc_Release(pMalloc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the edit control
|
|
||||||
SetWindowText(hStoreDir,
|
|
||||||
cfg->ScreenshotDir);
|
|
||||||
|
|
||||||
ChangedSetting(hParentDlg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// User-defined messages
|
|
||||||
if (uMsg == WMU_SAVE_CONFIG) {
|
|
||||||
GetWindowText(hStoreDir,
|
|
||||||
cfg->ScreenshotDir,
|
|
||||||
MAX_PATH - 1);
|
|
||||||
if (!SaveConfig(cfg)) {
|
|
||||||
// TODO: error management
|
|
||||||
OutputDebugString(_T("no save x_x"));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Not a message we care about
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
|
@ -1,272 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
||||||
#include "GrbyCfg.h"
|
|
||||||
#define MAX_LOADSTRING 100
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
INT_PTR CALLBACK ConfigDlgProc(HWND, UINT, WPARAM, LPARAM);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Print an error with a given context before bailing out
|
|
||||||
*/
|
|
||||||
void Die(LPTSTR lpContextMsg)
|
|
||||||
{
|
|
||||||
LPCTSTR lpszFmt = "%s: %s";
|
|
||||||
int iFullLen;
|
|
||||||
LPTSTR lpszError = NULL,
|
|
||||||
lpszFullMsg = NULL;
|
|
||||||
|
|
||||||
// The whole point of this is to print an actual message, so get the
|
|
||||||
// actual message
|
|
||||||
if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
||||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
||||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
||||||
NULL,
|
|
||||||
GetLastError(),
|
|
||||||
0,
|
|
||||||
(LPTSTR) &lpszError,
|
|
||||||
0,
|
|
||||||
NULL))
|
|
||||||
{
|
|
||||||
if (lpszError != NULL) LocalFree(lpszError);
|
|
||||||
lpszError = _T("unknown error");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create our WMU_* messages
|
|
||||||
InitUserMsgs();
|
|
||||||
|
|
||||||
iFullLen = _sctprintf(lpszFmt, lpContextMsg, lpszError);
|
|
||||||
lpszFullMsg = (LPTSTR) LocalAlloc(LPTR, sizeof(TCHAR) * (iFullLen + 1));
|
|
||||||
|
|
||||||
if (lpszFullMsg == NULL) {
|
|
||||||
// I'm honestly gonna guess if we get here, we're out of memory.
|
|
||||||
// So let's print what we have and bail
|
|
||||||
MessageBox(NULL,
|
|
||||||
lpContextMsg,
|
|
||||||
_T("Catastrophic Error"),
|
|
||||||
MB_OK | MB_ICONERROR);
|
|
||||||
} else {
|
|
||||||
_sntprintf(lpszFullMsg, iFullLen, lpszFmt, lpContextMsg, lpszError);
|
|
||||||
MessageBox(NULL,
|
|
||||||
lpszFullMsg,
|
|
||||||
_T("Fatal Error"),
|
|
||||||
MB_OK | MB_ICONERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
ExitProcess(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
HINSTANCE g_hInstance = NULL;
|
|
||||||
|
|
||||||
int APIENTRY _tWinMain(HINSTANCE hInstance,
|
|
||||||
HINSTANCE hPrevInstance,
|
|
||||||
LPTSTR lpCmdLine,
|
|
||||||
int nCmdShow)
|
|
||||||
{
|
|
||||||
BOOL bRet;
|
|
||||||
MSG msg;
|
|
||||||
HWND hDlg;
|
|
||||||
INITCOMMONCONTROLSEX lpInitCtrls = {0};
|
|
||||||
HRESULT hrRet;
|
|
||||||
|
|
||||||
g_hInstance = hInstance;
|
|
||||||
|
|
||||||
// Required for tab control
|
|
||||||
lpInitCtrls.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
|
||||||
lpInitCtrls.dwICC = ICC_WIN95_CLASSES;
|
|
||||||
if (!InitCommonControlsEx(&lpInitCtrls)) {
|
|
||||||
MessageBox(NULL,
|
|
||||||
_T("Couldn't initialize comctl32! Not sure why..."),
|
|
||||||
_T("Ooh, rare bug!"),
|
|
||||||
MB_OK | MB_ICONERROR);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Required for folder browse dialog
|
|
||||||
hrRet = CoInitializeEx(NULL,
|
|
||||||
COINIT_APARTMENTTHREADED);
|
|
||||||
if (hrRet != S_OK) {
|
|
||||||
MessageBox(NULL,
|
|
||||||
_T("Couldn't initialize COM!?"),
|
|
||||||
_T("dot com bust u_u"),
|
|
||||||
MB_OK | MB_ICONERROR);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
hDlg = CreateDialog(hInstance,
|
|
||||||
MAKEINTRESOURCE(IDD_CONFIGDIALOG),
|
|
||||||
NULL,
|
|
||||||
ConfigDlgProc);
|
|
||||||
|
|
||||||
if (!hDlg) {
|
|
||||||
Die("CreateDialog failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
ShowWindow(hDlg, nCmdShow);
|
|
||||||
|
|
||||||
while ((bRet = GetMessage(&msg, hDlg, 0, 0)) != FALSE) {
|
|
||||||
if (bRet == -1) {
|
|
||||||
// TODO: error handling
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
TranslateMessage(&msg);
|
|
||||||
DispatchMessage(&msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (int)msg.wParam;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper macro to create a new text (i.e., no icon) tab for config
|
|
||||||
// items.
|
|
||||||
//
|
|
||||||
// NOTE: This is written to use <name>Tab_DlgProc for dlgProc. This
|
|
||||||
// assumes that tabs will always be valid (enough) for a function
|
|
||||||
// identifier.
|
|
||||||
#define NEW_TEXTTAB(name, res) {{ \
|
|
||||||
TCIF_TEXT, \
|
|
||||||
0, 0, \
|
|
||||||
_T(#name), \
|
|
||||||
sizeof(_T(#name)) / sizeof(TCHAR), \
|
|
||||||
0, 0 \
|
|
||||||
}, \
|
|
||||||
res, \
|
|
||||||
name##Tab_DlgProc, \
|
|
||||||
NULL \
|
|
||||||
}
|
|
||||||
|
|
||||||
INT_PTR CALLBACK
|
|
||||||
ConfigDlgProc(HWND hWnd,
|
|
||||||
UINT uMsg,
|
|
||||||
WPARAM wParam,
|
|
||||||
LPARAM lParam)
|
|
||||||
{
|
|
||||||
// Define the tab metadata
|
|
||||||
static struct {
|
|
||||||
TCITEM tciTab;
|
|
||||||
int child;
|
|
||||||
DLGPROC dlgProc;
|
|
||||||
HWND hWnd;
|
|
||||||
} tabs[] = {
|
|
||||||
NEW_TEXTTAB(General,
|
|
||||||
IDD_GENCONFIG),
|
|
||||||
NEW_TEXTTAB(Upload,
|
|
||||||
IDD_UPLOADCONFIG)
|
|
||||||
};
|
|
||||||
BOOL bClose = FALSE;
|
|
||||||
|
|
||||||
const int tabCount = (sizeof(tabs) / sizeof(tabs[0]));
|
|
||||||
|
|
||||||
switch (uMsg) {
|
|
||||||
case WM_INITDIALOG: {
|
|
||||||
RECT rcTab;
|
|
||||||
int i;
|
|
||||||
HWND hTabCtrl = GetDlgItem(hWnd, IDC_TABVIEW);
|
|
||||||
|
|
||||||
if (!hTabCtrl) {
|
|
||||||
Die("Couldn't get tab control");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < tabCount; i++) {
|
|
||||||
int iResult = TabCtrl_InsertItem(
|
|
||||||
hTabCtrl,
|
|
||||||
i,
|
|
||||||
&tabs[i].tciTab);
|
|
||||||
if (iResult == -1) {
|
|
||||||
Die("Couldn't create tabs");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attach the child dialog
|
|
||||||
tabs[i].hWnd = CreateDialog(g_hInstance,
|
|
||||||
MAKEINTRESOURCE(tabs[i].child),
|
|
||||||
hWnd,
|
|
||||||
tabs[i].dlgProc);
|
|
||||||
if (!tabs[i].hWnd) {
|
|
||||||
Die("Couldn't create child tab");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This has to happen after the tabs are inserted,
|
|
||||||
// or else we get the wrong client area (tabs don't
|
|
||||||
// exist yet!)
|
|
||||||
GetWindowRect(hTabCtrl, &rcTab);
|
|
||||||
MapWindowPoints(NULL, hWnd, (LPPOINT)&rcTab, 2);
|
|
||||||
TabCtrl_AdjustRect(hTabCtrl, FALSE, &rcTab);
|
|
||||||
|
|
||||||
for (i = 0; i < tabCount; i++) {
|
|
||||||
SetWindowPos(tabs[i].hWnd,
|
|
||||||
HWND_TOP,
|
|
||||||
rcTab.left,
|
|
||||||
rcTab.top,
|
|
||||||
rcTab.right - rcTab.left,
|
|
||||||
rcTab.bottom - rcTab.top,
|
|
||||||
(i == 0) ? SWP_SHOWWINDOW : 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_COMMAND:
|
|
||||||
switch (LOWORD(wParam)) {
|
|
||||||
case IDCANCEL:
|
|
||||||
DestroyWindow(hWnd);
|
|
||||||
break;
|
|
||||||
case IDOK:
|
|
||||||
bClose = TRUE;
|
|
||||||
/* PASSTHRU */
|
|
||||||
case IDC_APPLY: {
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < tabCount; i++) {
|
|
||||||
SendMessage(tabs[i].hWnd,
|
|
||||||
WMU_SAVE_CONFIG,
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
EnableWindow(GetDlgItem(hWnd, IDC_APPLY), FALSE);
|
|
||||||
// Handle OK button (Apply + Close)
|
|
||||||
if (bClose) SendMessage(hWnd,
|
|
||||||
WM_CLOSE,
|
|
||||||
0,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// TODO: other buttons
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_CLOSE:
|
|
||||||
DestroyWindow(hWnd);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_NOTIFY:
|
|
||||||
{
|
|
||||||
LPNMHDR pnmh = (LPNMHDR)lParam;
|
|
||||||
if (pnmh->code == TCN_SELCHANGE) {
|
|
||||||
int idx = TabCtrl_GetCurSel(pnmh->hwndFrom);
|
|
||||||
if (idx < tabCount) {
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < tabCount; i++) {
|
|
||||||
if (tabs[i].hWnd) {
|
|
||||||
// If it's the child we want, show it.
|
|
||||||
// If not, hide it.
|
|
||||||
ShowWindow(tabs[i].hWnd,
|
|
||||||
(i == idx) ? SW_SHOW : SW_HIDE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If idx >= tabCount, ignore the message
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// User-defined messages
|
|
||||||
if (uMsg == WMU_SETTING_CHANGED) {
|
|
||||||
EnableWindow(GetDlgItem(hWnd, IDC_APPLY), TRUE);
|
|
||||||
} else {
|
|
||||||
// Not our message, ignore
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
// Define the config tabs
|
|
||||||
INT_PTR CALLBACK
|
|
||||||
GeneralTab_DlgProc(HWND hDlg,
|
|
||||||
UINT uMsg,
|
|
||||||
WPARAM wParam,
|
|
||||||
LPARAM lParam);
|
|
||||||
|
|
||||||
INT_PTR CALLBACK
|
|
||||||
UploadTab_DlgProc(HWND hDlg,
|
|
||||||
UINT uMsg,
|
|
||||||
WPARAM wParam,
|
|
||||||
LPARAM lParam);
|
|
Before Width: | Height: | Size: 23 KiB |
|
@ -1,270 +0,0 @@
|
||||||
// Microsoft Visual C++ generated resource script.
|
|
||||||
//
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
#define APSTUDIO_READONLY_SYMBOLS
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Generated from the TEXTINCLUDE 2 resource.
|
|
||||||
//
|
|
||||||
#define APSTUDIO_HIDDEN_SYMBOLS
|
|
||||||
#include "windows.h"
|
|
||||||
#undef APSTUDIO_HIDDEN_SYMBOLS
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
#undef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Japanese resources
|
|
||||||
|
|
||||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
|
|
||||||
#ifdef _WIN32
|
|
||||||
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
|
|
||||||
#pragma code_page(932)
|
|
||||||
#endif //_WIN32
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Icon
|
|
||||||
//
|
|
||||||
|
|
||||||
// Icon with lowest ID value placed first to ensure application icon
|
|
||||||
// remains consistent on all systems.
|
|
||||||
IDI_GRBYCFG ICON "GrbyCfg.ico"
|
|
||||||
IDI_SMALL ICON "small.ico"
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Menu
|
|
||||||
//
|
|
||||||
|
|
||||||
IDC_GRBYCFG MENU
|
|
||||||
BEGIN
|
|
||||||
POPUP "&File"
|
|
||||||
BEGIN
|
|
||||||
MENUITEM "E&xit", IDM_EXIT
|
|
||||||
END
|
|
||||||
POPUP "&Help"
|
|
||||||
BEGIN
|
|
||||||
MENUITEM "&About ...", IDM_ABOUT
|
|
||||||
END
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Accelerator
|
|
||||||
//
|
|
||||||
|
|
||||||
IDC_GRBYCFG ACCELERATORS
|
|
||||||
BEGIN
|
|
||||||
"?", IDM_ABOUT, ASCII, ALT
|
|
||||||
"/", IDM_ABOUT, ASCII, ALT
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// TEXTINCLUDE
|
|
||||||
//
|
|
||||||
|
|
||||||
1 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"resource.h\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
2 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
|
||||||
"#include ""windows.h""\r\n"
|
|
||||||
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
|
||||||
"\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
3 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"\r\n"
|
|
||||||
"\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
#endif // APSTUDIO_INVOKED
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// String Table
|
|
||||||
//
|
|
||||||
|
|
||||||
STRINGTABLE
|
|
||||||
BEGIN
|
|
||||||
IDS_APP_TITLE "GrbyCfg"
|
|
||||||
IDC_GRBYCFG "GRBYCFG"
|
|
||||||
END
|
|
||||||
|
|
||||||
#endif // Japanese resources
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// English (U.S.) resources
|
|
||||||
|
|
||||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
|
||||||
#ifdef _WIN32
|
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|
||||||
#pragma code_page(1252)
|
|
||||||
#endif //_WIN32
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Dialog
|
|
||||||
//
|
|
||||||
|
|
||||||
IDD_GENCONFIG DIALOGEX 0, 0, 210, 206
|
|
||||||
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_BORDER
|
|
||||||
EXSTYLE WS_EX_CONTROLPARENT
|
|
||||||
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
|
||||||
BEGIN
|
|
||||||
GROUPBOX "Screenshot Folder",IDC_STATIC,7,7,196,52,WS_GROUP
|
|
||||||
EDITTEXT IDC_SCRNDIR,13,19,184,14,ES_AUTOHSCROLL
|
|
||||||
PUSHBUTTON "Browse...",IDC_SCRDIRBROWSE,147,39,50,14
|
|
||||||
CONTROL "Keep screenshots after upload",IDC_KEEPIMGS,"Button",
|
|
||||||
BS_AUTOCHECKBOX | WS_TABSTOP,13,39,114,14
|
|
||||||
GROUPBOX "Launch Helper",IDC_STATIC,7,65,196,57
|
|
||||||
LTEXT "Grabby is intended to be launched via a keyboard shortcut using a separate helper program. A basic helper is bundled.",
|
|
||||||
IDC_STATIC,13,77,184,25
|
|
||||||
CONTROL "Launch Helper on Startup",IDC_LAUNCHHELPER,"Button",
|
|
||||||
BS_AUTOCHECKBOX | WS_TABSTOP,13,106,184,10
|
|
||||||
GROUPBOX "Keyboard Shortcut",IDC_STATIC,7,128,196,71
|
|
||||||
LTEXT "When the Launch Helper is running, take a screenshot with:",
|
|
||||||
IDC_STATIC,13,140,184,16
|
|
||||||
CONTROL "Win+Shift+4 (Mac)",IDC_RDMAC,"Button",
|
|
||||||
BS_AUTORADIOBUTTON | WS_GROUP,13,163,77,10
|
|
||||||
CONTROL "Win+Shift+S (Win10)",IDC_RDWIN,"Button",
|
|
||||||
BS_AUTORADIOBUTTON,96,163,101,10
|
|
||||||
CONTROL "Custom",IDC_RDCUSTOM,"Button",BS_AUTORADIOBUTTON,13,175,
|
|
||||||
77,14
|
|
||||||
EDITTEXT IDC_CUSTOMKEY,96,175,101,14,ES_AUTOHSCROLL | WS_GROUP
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_UPLOADCONFIG DIALOGEX 0, 0, 210, 154
|
|
||||||
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_BORDER
|
|
||||||
EXSTYLE WS_EX_CONTROLPARENT
|
|
||||||
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
|
||||||
BEGIN
|
|
||||||
GROUPBOX "Uploader",IDC_STATIC,7,7,196,88
|
|
||||||
LTEXT "Enter the URL to use. Use ""%f"" to represent the filename, if it should be included in the URL.",
|
|
||||||
IDC_STATIC,11,19,186,17
|
|
||||||
EDITTEXT IDC_URLINPUT,13,43,184,12,ES_AUTOHSCROLL
|
|
||||||
CONTROL "Encode filename in URL (for query parameters)",
|
|
||||||
IDC_ENCODEFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,
|
|
||||||
61,166,10
|
|
||||||
LTEXT "HTTP method to use:",IDC_STATIC,13,77,68,12,
|
|
||||||
SS_CENTERIMAGE
|
|
||||||
COMBOBOX IDC_UPLOADMETHOD,87,77,110,30,CBS_DROPDOWNLIST |
|
|
||||||
CBS_SORT | CBS_UPPERCASE | WS_VSCROLL | WS_TABSTOP
|
|
||||||
GROUPBOX "Authentication",IDC_STATIC,7,101,196,40
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_CONFIGDIALOG DIALOGEX 0, 0, 234, 254
|
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
|
|
||||||
WS_SYSMENU
|
|
||||||
CAPTION "Options"
|
|
||||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
|
||||||
BEGIN
|
|
||||||
DEFPUSHBUTTON "OK",IDOK,65,233,50,14
|
|
||||||
PUSHBUTTON "Cancel",IDCANCEL,121,233,50,14
|
|
||||||
CONTROL "",IDC_TABVIEW,"SysTabControl32",0x0,7,7,220,220
|
|
||||||
PUSHBUTTON "Apply",IDC_APPLY,177,233,50,14,WS_DISABLED
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// DESIGNINFO
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
GUIDELINES DESIGNINFO
|
|
||||||
BEGIN
|
|
||||||
IDD_GENCONFIG, DIALOG
|
|
||||||
BEGIN
|
|
||||||
LEFTMARGIN, 7
|
|
||||||
RIGHTMARGIN, 203
|
|
||||||
VERTGUIDE, 13
|
|
||||||
VERTGUIDE, 90
|
|
||||||
VERTGUIDE, 96
|
|
||||||
VERTGUIDE, 197
|
|
||||||
TOPMARGIN, 7
|
|
||||||
BOTTOMMARGIN, 199
|
|
||||||
HORZGUIDE, 19
|
|
||||||
HORZGUIDE, 33
|
|
||||||
HORZGUIDE, 39
|
|
||||||
HORZGUIDE, 53
|
|
||||||
HORZGUIDE, 59
|
|
||||||
HORZGUIDE, 65
|
|
||||||
HORZGUIDE, 77
|
|
||||||
HORZGUIDE, 102
|
|
||||||
HORZGUIDE, 106
|
|
||||||
HORZGUIDE, 122
|
|
||||||
HORZGUIDE, 128
|
|
||||||
HORZGUIDE, 140
|
|
||||||
HORZGUIDE, 156
|
|
||||||
HORZGUIDE, 163
|
|
||||||
HORZGUIDE, 173
|
|
||||||
HORZGUIDE, 193
|
|
||||||
HORZGUIDE, 199
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_UPLOADCONFIG, DIALOG
|
|
||||||
BEGIN
|
|
||||||
LEFTMARGIN, 7
|
|
||||||
RIGHTMARGIN, 203
|
|
||||||
VERTGUIDE, 13
|
|
||||||
VERTGUIDE, 81
|
|
||||||
VERTGUIDE, 87
|
|
||||||
VERTGUIDE, 197
|
|
||||||
TOPMARGIN, 7
|
|
||||||
BOTTOMMARGIN, 147
|
|
||||||
HORZGUIDE, 19
|
|
||||||
HORZGUIDE, 36
|
|
||||||
HORZGUIDE, 43
|
|
||||||
HORZGUIDE, 61
|
|
||||||
HORZGUIDE, 71
|
|
||||||
HORZGUIDE, 77
|
|
||||||
HORZGUIDE, 89
|
|
||||||
HORZGUIDE, 95
|
|
||||||
HORZGUIDE, 101
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_CONFIGDIALOG, DIALOG
|
|
||||||
BEGIN
|
|
||||||
LEFTMARGIN, 7
|
|
||||||
RIGHTMARGIN, 227
|
|
||||||
VERTGUIDE, 115
|
|
||||||
VERTGUIDE, 121
|
|
||||||
VERTGUIDE, 171
|
|
||||||
VERTGUIDE, 177
|
|
||||||
TOPMARGIN, 7
|
|
||||||
BOTTOMMARGIN, 247
|
|
||||||
HORZGUIDE, 227
|
|
||||||
HORZGUIDE, 233
|
|
||||||
END
|
|
||||||
END
|
|
||||||
#endif // APSTUDIO_INVOKED
|
|
||||||
|
|
||||||
#endif // English (U.S.) resources
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef APSTUDIO_INVOKED
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Generated from the TEXTINCLUDE 3 resource.
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
#endif // not APSTUDIO_INVOKED
|
|
||||||
|
|
|
@ -1,188 +0,0 @@
|
||||||
<?xml version="1.0" encoding="shift_jis"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="GrbyCfg"
|
|
||||||
ProjectGUID="{BBB3E933-71CC-4EF7-BF56-52371B9AF938}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="Debug"
|
|
||||||
IntermediateDirectory="Debug"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\CommonCfg\Export"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
CompileAs="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="comctl32.lib ole32.lib shell32.lib shlwapi.lib"
|
|
||||||
OutputFile="$(OutDir)/GrbyCfg.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/GrbyCfg.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="Release"
|
|
||||||
IntermediateDirectory="Release"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;_WINDOWS"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="3"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CompileAs="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="comctl32.lib ole32.lib shell32.lib shlwapi.lib"
|
|
||||||
OutputFile="$(OutDir)/GrbyCfg.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
<ProjectReference
|
|
||||||
ReferencedProjectIdentifier="{61829180-05C1-4865-B9C3-FEB983AD6997}"
|
|
||||||
Name="CommonCfg"/>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\Dialog.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\GeneralCfg.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\GrbyCfg.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\stdafx.c">
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\UploadCfg.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\Dialog.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\GrbyCfg.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\Resource.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\stdafx.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\GrbyCfg.ico">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\GrbyCfg.rc">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\small.ico">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<File
|
|
||||||
RelativePath=".\ReadMe.txt">
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,53 +0,0 @@
|
||||||
========================================================================
|
|
||||||
WIN32 APPLICATION : GrbyCfg Project Overview
|
|
||||||
========================================================================
|
|
||||||
|
|
||||||
AppWizard has created this GrbyCfg application for you.
|
|
||||||
This file contains a summary of what you will find in each of the files that
|
|
||||||
make up your GrbyCfg application.
|
|
||||||
|
|
||||||
|
|
||||||
GrbyCfg.vcproj
|
|
||||||
This is the main project file for VC++ projects generated using an Application Wizard.
|
|
||||||
It contains information about the version of Visual C++ that generated the file, and
|
|
||||||
information about the platforms, configurations, and project features selected with the
|
|
||||||
Application Wizard.
|
|
||||||
|
|
||||||
GrbyCfg.cpp
|
|
||||||
This is the main application source file.
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
AppWizard has created the following resources:
|
|
||||||
|
|
||||||
GrbyCfg.rc
|
|
||||||
This is a listing of all of the Microsoft Windows resources that the
|
|
||||||
program uses. It includes the icons, bitmaps, and cursors that are stored
|
|
||||||
in the RES subdirectory. This file can be directly edited in Microsoft
|
|
||||||
Visual C++.
|
|
||||||
|
|
||||||
Resource.h
|
|
||||||
This is the standard header file, which defines new resource IDs.
|
|
||||||
Microsoft Visual C++ reads and updates this file.
|
|
||||||
GrbyCfg.ico
|
|
||||||
This is an icon file, which is used as the application's icon (32x32).
|
|
||||||
This icon is included by the main resource file GrbyCfg.rc.
|
|
||||||
|
|
||||||
small.ico
|
|
||||||
This is an icon file, which contains a smaller version (16x16)
|
|
||||||
of the application's icon. This icon is included by the main resource
|
|
||||||
file GrbyCfg.rc.
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
Other standard files:
|
|
||||||
|
|
||||||
StdAfx.h, StdAfx.cpp
|
|
||||||
These files are used to build a precompiled header (PCH) file
|
|
||||||
named GrbyCfg.pch and a precompiled types file named StdAfx.obj.
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
Other notes:
|
|
||||||
|
|
||||||
AppWizard uses "TODO:" comments to indicate parts of the source code you
|
|
||||||
should add to or customize.
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
|
@ -1,11 +0,0 @@
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
INT_PTR CALLBACK
|
|
||||||
UploadTab_DlgProc(HWND hDlg,
|
|
||||||
UINT uMsg,
|
|
||||||
WPARAM wParam,
|
|
||||||
LPARAM lParam)
|
|
||||||
{
|
|
||||||
// TODO: anything
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
//{{NO_DEPENDENCIES}}
|
|
||||||
// Microsoft Visual C++ generated include file.
|
|
||||||
// Used by GrbyCfg.rc
|
|
||||||
//
|
|
||||||
#define IDC_MYICON 2
|
|
||||||
#define IDD_CONFIGDIALOG 9
|
|
||||||
#define IDD_GRBYCFG_DIALOG 102
|
|
||||||
#define IDS_APP_TITLE 103
|
|
||||||
#define IDM_ABOUT 104
|
|
||||||
#define IDM_EXIT 105
|
|
||||||
#define IDD_GENCONFIG 106
|
|
||||||
#define IDI_GRBYCFG 107
|
|
||||||
#define IDI_SMALL 108
|
|
||||||
#define IDC_GRBYCFG 109
|
|
||||||
#define IDR_MAINFRAME 128
|
|
||||||
#define IDD_UPLOADCONFIG 130
|
|
||||||
#define IDC_TABVIEW 1000
|
|
||||||
#define IDC_APPLY 1001
|
|
||||||
#define IDC_SCRNDIR 1004
|
|
||||||
#define IDC_SCRDIRBROWSE 1005
|
|
||||||
#define IDC_KEEPIMGS 1006
|
|
||||||
#define IDC_URLINPUT 1007
|
|
||||||
#define IDC_LAUNCHHELPER 1007
|
|
||||||
#define IDC_ENCODEFILE 1008
|
|
||||||
#define IDC_RDMAC 1008
|
|
||||||
#define IDC_UPLOADMETHOD 1009
|
|
||||||
#define IDC_RDWIN 1009
|
|
||||||
#define IDC_RDCUSTOM 1010
|
|
||||||
#define IDC_CUSTOMKEY 1011
|
|
||||||
#define IDC_STATIC -1
|
|
||||||
|
|
||||||
// Next default values for new objects
|
|
||||||
//
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
#define _APS_NO_MFC 1
|
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 130
|
|
||||||
#define _APS_NEXT_COMMAND_VALUE 32771
|
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1012
|
|
||||||
#define _APS_NEXT_SYMED_VALUE 110
|
|
||||||
#endif
|
|
||||||
#endif
|
|
Before Width: | Height: | Size: 23 KiB |
|
@ -1,8 +0,0 @@
|
||||||
// stdafx.cpp : source file that includes just the standard includes
|
|
||||||
// GrbyCfg.pch will be the pre-compiled header
|
|
||||||
// stdafx.obj will contain the pre-compiled type information
|
|
||||||
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
// TODO: reference any additional headers you need in STDAFX.H
|
|
||||||
// and not in this file
|
|
|
@ -1,26 +0,0 @@
|
||||||
// stdafx.h : include file for standard system include files,
|
|
||||||
// or project specific include files that are used frequently, but
|
|
||||||
// are changed infrequently
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
|
||||||
// Windows Header Files:
|
|
||||||
#include <windows.h>
|
|
||||||
#include <commctrl.h>
|
|
||||||
#include <tchar.h>
|
|
||||||
#define _WIN32_DCOM
|
|
||||||
#define COBJMACROS
|
|
||||||
#define CINTERFACE
|
|
||||||
#include <ShlObj.h>
|
|
||||||
#include <ObjBase.h>
|
|
||||||
// C RunTime Header Files
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <memory.h>
|
|
||||||
|
|
||||||
#include <Config.h>
|
|
||||||
#include "Dialog.h"
|
|
||||||
#include "resource.h"
|
|
29
Resource.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
//{{NO_DEPENDENCIES}}
|
||||||
|
// Microsoft Visual C++ generated include file.
|
||||||
|
// Used by Grabby.rc
|
||||||
|
//
|
||||||
|
|
||||||
|
#define IDS_APP_TITLE 103
|
||||||
|
|
||||||
|
#define IDR_MAINFRAME 128
|
||||||
|
#define IDD_GRABBY_DIALOG 102
|
||||||
|
#define IDD_ABOUTBOX 103
|
||||||
|
#define IDM_ABOUT 104
|
||||||
|
#define IDM_EXIT 105
|
||||||
|
#define IDI_GRABBY 107
|
||||||
|
#define IDI_SMALL 108
|
||||||
|
#define IDC_GRABBY 109
|
||||||
|
#define IDC_MYICON 2
|
||||||
|
#define IDC_STATIC -1
|
||||||
|
// Next default values for new objects
|
||||||
|
//
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
|
#define _APS_NO_MFC 130
|
||||||
|
#define _APS_NEXT_RESOURCE_VALUE 129
|
||||||
|
#define _APS_NEXT_COMMAND_VALUE 32771
|
||||||
|
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||||
|
#define _APS_NEXT_SYMED_VALUE 110
|
||||||
|
#endif
|
||||||
|
#endif
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
@ -9,7 +9,6 @@
|
||||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||||
// Windows Header Files:
|
// Windows Header Files:
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <shlwapi.h>
|
|
||||||
// C RunTime Header Files
|
// C RunTime Header Files
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|