Overhaul repository structure to add config
I wish I didn't end up doing this all at once, but ah well. Quick rundown: - CommonCfg contains config/registry functions shared between Grabby and GrbyCfg. - GrbyCfg provides a dialog for configuring Grabby. git-svn-id: svn://vcs.sdm.2ki.xyz/Grabby/trunk@16 27729192-006e-004d-b9b5-06fbd0ef7001
160
CommonCfg/CommonCfg.vcproj
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
<?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>
|
141
CommonCfg/Config.c
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
#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;
|
||||||
|
}
|
86
CommonCfg/Export/Config.h
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
#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);
|
196
CommonCfg/MultiString.c
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
#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;
|
||||||
|
}
|
29
CommonCfg/ReadMe.txt
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
========================================================================
|
||||||
|
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.
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
280
CommonCfg/RegHelper.c
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
#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;
|
||||||
|
}
|
68
CommonCfg/RegHelper.h
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
// 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)
|
65
CommonCfg/UploadConfig.c
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
#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
CommonCfg/stdafx.c
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#include "stdafx.h"
|
17
CommonCfg/stdafx.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// 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"
|
18
Grabby.sln
|
@ -1,5 +1,13 @@
|
||||||
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.vcproj", "{700E5DD7-DD00-46D9-92DF-2C132940F53D}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Grabby", "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
|
||||||
|
@ -13,6 +21,14 @@ 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
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#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
|
||||||
|
@ -43,7 +44,7 @@ void Die(LPTSTR lpContextMsg)
|
||||||
_T("Catastrophic Error"),
|
_T("Catastrophic Error"),
|
||||||
MB_OK | MB_ICONERROR);
|
MB_OK | MB_ICONERROR);
|
||||||
} else {
|
} else {
|
||||||
_sntprintf(lpszFullMsg, iFullLen, lpszFmt, lpContextMsg, lpszError);
|
StringCchPrintf(lpszFullMsg, iFullLen, lpszFmt, lpContextMsg, lpszError);
|
||||||
MessageBox(NULL,
|
MessageBox(NULL,
|
||||||
lpszFullMsg,
|
lpszFullMsg,
|
||||||
_T("Fatal Error"),
|
_T("Fatal Error"),
|
||||||
|
@ -62,16 +63,24 @@ int APIENTRY _tWinMain(HINSTANCE hInstance,
|
||||||
SYSTEMTIME stNow = {0};
|
SYSTEMTIME stNow = {0};
|
||||||
RECT capRegion = {0};
|
RECT capRegion = {0};
|
||||||
Screen *scrn = CreateScreen();
|
Screen *scrn = CreateScreen();
|
||||||
#define OUTPUT_DIR_LEN 96
|
Config *cfg;
|
||||||
TCHAR szOutputDir[OUTPUT_DIR_LEN + 1];
|
TCHAR szFullOutPath[MAX_PATH];
|
||||||
#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");
|
||||||
|
@ -86,16 +95,12 @@ 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,
|
||||||
FULL_OUT_PATH_LEN,
|
MAX_PATH,
|
||||||
"%s\\scrn_%04d%02d%02d_%02d%02d%02d.bmp",
|
"%s\\Screenshot at %04d-%02d-%02d %02d.%02d.%02d.bmp",
|
||||||
szOutputDir,
|
cfg->ScreenshotDir,
|
||||||
stNow.wYear,
|
stNow.wYear,
|
||||||
stNow.wMonth,
|
stNow.wMonth,
|
||||||
stNow.wDay,
|
stNow.wDay,
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
@ -1,4 +1,4 @@
|
||||||
//Microsoft Visual C++ generated resource script.
|
// Microsoft Visual C++ generated resource script.
|
||||||
//
|
//
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
|
|
||||||
|
@ -10,12 +10,58 @@
|
||||||
#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)
|
||||||
LANGUAGE 17, 1
|
#ifdef _WIN32
|
||||||
|
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
|
||||||
#pragma code_page(932)
|
#pragma code_page(932)
|
||||||
|
#endif //_WIN32
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
@ -24,95 +70,10 @@ LANGUAGE 17, 1
|
||||||
|
|
||||||
// Icon with lowest ID value placed first to ensure application icon
|
// Icon with lowest ID value placed first to ensure application icon
|
||||||
// remains consistent on all systems.
|
// remains consistent on all systems.
|
||||||
|
IDI_GRABBY ICON "Grabby.ico"
|
||||||
IDI_GRABBY ICON "Grabby.ico"
|
IDI_SMALL ICON "small.ico"
|
||||||
IDI_SMALL ICON "small.ico"
|
IDI_ICON1 ICON "icon1.ico"
|
||||||
|
#endif // English (U.S.) resources
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
IDC_GRABBY "GRABBY"
|
|
||||||
IDS_APP_TITLE "Grabby"
|
|
||||||
END
|
|
||||||
|
|
||||||
#endif
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@ -126,3 +87,4 @@ END
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
#endif // not APSTUDIO_INVOKED
|
#endif // not APSTUDIO_INVOKED
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
<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"
|
||||||
|
@ -32,8 +33,10 @@
|
||||||
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"
|
||||||
|
@ -67,18 +70,22 @@
|
||||||
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"
|
||||||
|
@ -107,6 +114,9 @@
|
||||||
</Configuration>
|
</Configuration>
|
||||||
</Configurations>
|
</Configurations>
|
||||||
<References>
|
<References>
|
||||||
|
<ProjectReference
|
||||||
|
ReferencedProjectIdentifier="{61829180-05C1-4865-B9C3-FEB983AD6997}"
|
||||||
|
Name="CommonCfg"/>
|
||||||
</References>
|
</References>
|
||||||
<Files>
|
<Files>
|
||||||
<Filter
|
<Filter
|
||||||
|
@ -159,12 +169,15 @@
|
||||||
<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
Normal file
After Width: | Height: | Size: 766 B |
36
Grabby/resource.h
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
//{{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
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
@ -9,6 +9,7 @@
|
||||||
#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>
|
||||||
|
@ -16,4 +17,4 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
#include <Strsafe.h>
|
#include <Strsafe.h>
|
11
GrbyCfg/Dialog.c
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#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);
|
||||||
|
}
|
25
GrbyCfg/Dialog.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#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)
|
4
GrbyCfg/General.h
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Define the dialog proc
|
||||||
|
DEF_DLGPROC(GeneralTab);
|
182
GrbyCfg/GeneralCfg.c
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
/* 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;
|
||||||
|
}
|
272
GrbyCfg/GrbyCfg.c
Normal file
|
@ -0,0 +1,272 @@
|
||||||
|
#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;
|
||||||
|
}
|
16
GrbyCfg/GrbyCfg.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#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);
|
BIN
GrbyCfg/GrbyCfg.ico
Normal file
After Width: | Height: | Size: 23 KiB |
270
GrbyCfg/GrbyCfg.rc
Normal file
|
@ -0,0 +1,270 @@
|
||||||
|
// 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
|
||||||
|
|
188
GrbyCfg/GrbyCfg.vcproj
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
<?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>
|
53
GrbyCfg/ReadMe.txt
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
========================================================================
|
||||||
|
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.
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
11
GrbyCfg/UploadCfg.c
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
INT_PTR CALLBACK
|
||||||
|
UploadTab_DlgProc(HWND hDlg,
|
||||||
|
UINT uMsg,
|
||||||
|
WPARAM wParam,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
// TODO: anything
|
||||||
|
return FALSE;
|
||||||
|
}
|
0
GrbyCfg/Uploader.h
Normal file
42
GrbyCfg/resource.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
//{{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
|
BIN
GrbyCfg/small.ico
Normal file
After Width: | Height: | Size: 23 KiB |
8
GrbyCfg/stdafx.c
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
// 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
|
26
GrbyCfg/stdafx.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// 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
|
@ -1,29 +0,0 @@
|
||||||
//{{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
|
|