From 618dfb51d93898632830f1b87443d3f748780871 Mon Sep 17 00:00:00 2001 From: Daniel Wilhelm Date: Fri, 18 Apr 2014 17:05:53 +0200 Subject: 3.5 --- library/Taskbar_Seven/Taskbar_Seven.vcproj | 409 +++++++++++++++++++++++++++++ library/Taskbar_Seven/dllmain.cpp | 27 ++ library/Taskbar_Seven/taskbar.cpp | 160 +++++++++++ library/Taskbar_Seven/taskbar.h | 62 +++++ 4 files changed, 658 insertions(+) create mode 100644 library/Taskbar_Seven/Taskbar_Seven.vcproj create mode 100644 library/Taskbar_Seven/dllmain.cpp create mode 100644 library/Taskbar_Seven/taskbar.cpp create mode 100644 library/Taskbar_Seven/taskbar.h (limited to 'library/Taskbar_Seven') diff --git a/library/Taskbar_Seven/Taskbar_Seven.vcproj b/library/Taskbar_Seven/Taskbar_Seven.vcproj new file mode 100644 index 00000000..bf8e0993 --- /dev/null +++ b/library/Taskbar_Seven/Taskbar_Seven.vcproj @@ -0,0 +1,409 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/library/Taskbar_Seven/dllmain.cpp b/library/Taskbar_Seven/dllmain.cpp new file mode 100644 index 00000000..7db39bff --- /dev/null +++ b/library/Taskbar_Seven/dllmain.cpp @@ -0,0 +1,27 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// + +#define WIN32_LEAN_AND_MEAN +#include + + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/library/Taskbar_Seven/taskbar.cpp b/library/Taskbar_Seven/taskbar.cpp new file mode 100644 index 00000000..4baf2392 --- /dev/null +++ b/library/Taskbar_Seven/taskbar.cpp @@ -0,0 +1,160 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#include "taskbar.h" + +#define WIN32_LEAN_AND_MEAN +#include "windows.h" +#include + +#include +#include +#include + + +namespace +{ +void writeString(const std::wstring& input, wchar_t* output, size_t outputBufferLen) +{ + const size_t newSize = min(input.length() + 1, outputBufferLen); //including null-termination + memcpy(output, input.c_str(), newSize * sizeof(wchar_t)); + output[newSize-1] = 0; //if output buffer is too small... +} + + +std::wstring numberToHexString(const long number) +{ + wchar_t result[100]; + swprintf(result, 100, L"0x%08x", number); + return std::wstring(result); +} + + +std::wstring writeErrorMsg(const wchar_t* input, HRESULT hr) +{ + std::wstring output(input); + output += L" ("; + output += numberToHexString(hr); + output += L": "; + output += _com_error(hr).ErrorMessage(); + output += L")"; + return output; +} + + +using TaskbarSeven::TBHandle; +typedef std::map TaskBarHandleMap; + +TaskbarSeven::TBHandle generateHandle() +{ + static TBHandle handle = 0; + return ++handle; //don't return 0! 0 is reserved for indicating failure +} + +TaskBarHandleMap taskBarHandles; + +std::wstring lastErrorMessage; +} +//################################################################################################## + + +TaskbarSeven::TBHandle TaskbarSeven::init() //call on app initializaiton; returns handle +{ + ITaskbarList3* pto = NULL; + HRESULT hr = CoCreateInstance(CLSID_TaskbarList, + NULL, + CLSCTX_ALL, + IID_PPV_ARGS(&pto)); + if (FAILED(hr)) + { + lastErrorMessage = writeErrorMsg(L"Error calling \"CoCreateInstance\".", hr); + return 0; + } + + TBHandle newHandle = ::generateHandle(); + taskBarHandles[newHandle] = pto; + return newHandle; +} + + +void TaskbarSeven::release(TBHandle handle) //release handle on app exit +{ + TaskBarHandleMap::const_iterator iter = taskBarHandles.find(handle); + if (iter != taskBarHandles.end()) + { + if (iter->second != NULL) + iter->second->Release(); + taskBarHandles.erase(iter); + } +} + + +bool TaskbarSeven::setStatus(TBHandle handle, + void* hwnd, //HWND: window assciated to the taskbar icon + TaskBarStatus status) +{ + TBPFLAG flag = TBPF_NORMAL; + switch (status) + { + case STATUS_NOPROGRESS: + flag = TBPF_NOPROGRESS; + break; + case STATUS_INDETERMINATE: + flag = TBPF_INDETERMINATE; + break; + case STATUS_NORMAL: + flag = TBPF_NORMAL; + break; + case STATUS_ERROR: + flag = TBPF_ERROR; + break; + case STATUS_PAUSED: + flag = TBPF_PAUSED; + break; + } + + ITaskbarList3* pto = taskBarHandles[handle]; + if (pto) + { + HRESULT hr = pto->SetProgressState(static_cast(hwnd), //[in] HWND hwnd, + flag); //[in] TBPFLAG tbpFlags + if (FAILED(hr)) + { + lastErrorMessage = writeErrorMsg(L"Error calling \"SetProgressState\".", hr); + return false; + } + } + return true; +} + + +bool TaskbarSeven::setProgress(TBHandle handle, + void* hwnd, //HWND: window assciated to the taskbar icon + size_t current, + size_t total) +{ + ITaskbarList3* pto = taskBarHandles[handle]; + + if (pto) + { + HRESULT hr = pto->SetProgressValue( + static_cast(hwnd), //[in] HWND hwnd, + current, //[in] ULONGLONG ullCompleted, + total); //[in] ULONGLONG ullTotal + if (FAILED(hr)) + { + lastErrorMessage = writeErrorMsg(L"Error calling \"SetProgressValue\".", hr); + return false; + } + } + return true; +} + + +void TaskbarSeven::getLastError(wchar_t* errorMessage, size_t errorBufferLen) +{ + writeString(lastErrorMessage, errorMessage, errorBufferLen); +} diff --git a/library/Taskbar_Seven/taskbar.h b/library/Taskbar_Seven/taskbar.h new file mode 100644 index 00000000..835f02ec --- /dev/null +++ b/library/Taskbar_Seven/taskbar.h @@ -0,0 +1,62 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef TASKBAR_SEVEN_DLL_H +#define TASKBAR_SEVEN_DLL_H + +#ifdef TASKBAR_SEVEN_DLL_EXPORTS +#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllexport) +#else +#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllimport) +#endif + + +namespace TaskbarSeven +{ +enum TaskBarStatus +{ + STATUS_NOPROGRESS, + STATUS_INDETERMINATE, + STATUS_NORMAL, + STATUS_ERROR, + STATUS_PAUSED +}; + +typedef size_t TBHandle; + + +//COM needs to be initialized before calling any of these functions! CoInitializeEx/CoUninitialize +DLL_FUNCTION_DECLARATION +TBHandle init(); //returns handle; 0 on failure + +DLL_FUNCTION_DECLARATION +void release(TBHandle handle); //release taskbar handle + +DLL_FUNCTION_DECLARATION +bool setStatus(TBHandle handle, + void* hwnd, //HWND: window assciated to the taskbar icon + TaskBarStatus status); + + +DLL_FUNCTION_DECLARATION +bool setProgress(TBHandle handle, + void* hwnd, //HWND: window assciated to the taskbar icon + size_t current, + size_t total); + +//if any of the functions above returns 'false', this message returns last error +void getLastError(wchar_t* errorMessage, size_t errorBufferLen); + + +//function typedefs +typedef TBHandle (*initFct)(); +typedef void (*releaseFct)(TBHandle handle); +typedef bool (*setStatusFct)(TBHandle handle, void* hwnd, TaskBarStatus status); +typedef bool (*setProgressFct)(TBHandle handle, void* hwnd, size_t current, size_t total); +typedef void (*getLastErrorFct)(wchar_t* errorMessage, size_t errorBufferLen); +} + +#endif //TASKBAR_SEVEN_DLL_H \ No newline at end of file -- cgit