removed synwinxt
This commit is contained in:
parent
c5e551ccae
commit
5657348453
|
@ -28,5 +28,4 @@ add_subdirectory(synergy)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
add_subdirectory(synwinhk)
|
add_subdirectory(synwinhk)
|
||||||
add_subdirectory(synwinxt)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -131,7 +131,6 @@ CMSWindowsScreen::CMSWindowsScreen(
|
||||||
if (m_isPrimary && !m_noHooks) {
|
if (m_isPrimary && !m_noHooks) {
|
||||||
m_hook.loadLibrary();
|
m_hook.loadLibrary();
|
||||||
}
|
}
|
||||||
m_shellEx.loadLibrary();
|
|
||||||
|
|
||||||
m_screensaver = new CMSWindowsScreenSaver();
|
m_screensaver = new CMSWindowsScreenSaver();
|
||||||
m_desks = new CMSWindowsDesks(
|
m_desks = new CMSWindowsDesks(
|
||||||
|
@ -1885,13 +1884,6 @@ CMSWindowsScreen::getDraggingFilename()
|
||||||
return m_draggingFilename;
|
return m_draggingFilename;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsScreen::clearDraggingFilename()
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG1 "clearing stored dragging file name"));
|
|
||||||
m_shellEx.clearDraggingFilename();
|
|
||||||
}
|
|
||||||
|
|
||||||
const CString&
|
const CString&
|
||||||
CMSWindowsScreen::getDropTarget() const
|
CMSWindowsScreen::getDropTarget() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "platform/MSWindowsShellEx.h"
|
|
||||||
#include "platform/MSWindowsHook.h"
|
#include "platform/MSWindowsHook.h"
|
||||||
#include "synergy/PlatformScreen.h"
|
#include "synergy/PlatformScreen.h"
|
||||||
#include "synwinhk/synwinhk.h"
|
#include "synwinhk/synwinhk.h"
|
||||||
|
@ -118,7 +117,6 @@ public:
|
||||||
virtual bool isPrimary() const;
|
virtual bool isPrimary() const;
|
||||||
virtual void fakeDraggingFiles(CString str);
|
virtual void fakeDraggingFiles(CString str);
|
||||||
virtual CString& getDraggingFilename();
|
virtual CString& getDraggingFilename();
|
||||||
virtual void clearDraggingFilename();
|
|
||||||
virtual const CString&
|
virtual const CString&
|
||||||
getDropTarget() const;
|
getDropTarget() const;
|
||||||
|
|
||||||
|
@ -322,7 +320,6 @@ private:
|
||||||
MOUSEKEYS m_oldMouseKeys;
|
MOUSEKEYS m_oldMouseKeys;
|
||||||
|
|
||||||
CMSWindowsHook m_hook;
|
CMSWindowsHook m_hook;
|
||||||
CMSWindowsShellEx m_shellEx;
|
|
||||||
|
|
||||||
static CMSWindowsScreen*
|
static CMSWindowsScreen*
|
||||||
s_screen;
|
s_screen;
|
||||||
|
|
|
@ -1,92 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2014 Bolton Software Ltd.
|
|
||||||
*
|
|
||||||
* This package is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* found in the file COPYING that should have accompanied this file.
|
|
||||||
*
|
|
||||||
* This package is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "platform/MSWindowsShellEx.h"
|
|
||||||
|
|
||||||
#include "synergy/XScreen.h"
|
|
||||||
#include "base/Log.h"
|
|
||||||
|
|
||||||
static const char* g_name = "synwinxt";
|
|
||||||
|
|
||||||
CMSWindowsShellEx::CMSWindowsShellEx() :
|
|
||||||
m_getDraggingFilenameFunc(NULL),
|
|
||||||
m_clearDraggingFilenameFunc(NULL),
|
|
||||||
m_instance(NULL)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CMSWindowsShellEx::~CMSWindowsShellEx()
|
|
||||||
{
|
|
||||||
if (m_instance != NULL) {
|
|
||||||
FreeLibrary(m_instance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsShellEx::loadLibrary()
|
|
||||||
{
|
|
||||||
OSVERSIONINFO osvi;
|
|
||||||
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
|
|
||||||
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
||||||
GetVersionEx(&osvi);
|
|
||||||
|
|
||||||
if (osvi.dwMajorVersion < 6) {
|
|
||||||
LOG((CLOG_INFO "skipping shell extension library load, %s.dll not supported before vista", g_name));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// load library
|
|
||||||
m_instance = LoadLibrary(g_name);
|
|
||||||
if (m_instance == NULL) {
|
|
||||||
LOG((CLOG_ERR "failed to load shell extension library, %s.dll is missing or invalid", g_name));
|
|
||||||
throw XScreenOpenFailure();
|
|
||||||
}
|
|
||||||
|
|
||||||
// look up functions
|
|
||||||
m_getDraggingFilenameFunc = (GetDraggingFilenameFunc)GetProcAddress(m_instance, "getDraggingFilename");
|
|
||||||
m_clearDraggingFilenameFunc = (ClearDraggingFilenameFunc)GetProcAddress(m_instance, "clearDraggingFilename");
|
|
||||||
|
|
||||||
if (m_getDraggingFilenameFunc == NULL ||
|
|
||||||
m_clearDraggingFilenameFunc == NULL) {
|
|
||||||
LOG((CLOG_ERR "failed to load shell extension function, %s.dll could be out of date", g_name));
|
|
||||||
throw XScreenOpenFailure();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HINSTANCE
|
|
||||||
CMSWindowsShellEx::getInstance() const
|
|
||||||
{
|
|
||||||
return m_instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsShellEx::getDraggingFilename(char* filename) const
|
|
||||||
{
|
|
||||||
if (m_getDraggingFilenameFunc == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_getDraggingFilenameFunc(filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsShellEx::clearDraggingFilename()
|
|
||||||
{
|
|
||||||
if (m_getDraggingFilenameFunc == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_clearDraggingFilenameFunc();
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2014 Bolton Software Ltd.
|
|
||||||
*
|
|
||||||
* This package is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* found in the file COPYING that should have accompanied this file.
|
|
||||||
*
|
|
||||||
* This package is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "synwinxt/synwinxt.h"
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <Windows.h>
|
|
||||||
|
|
||||||
//! Loads and provides functions for the Windows shell extension
|
|
||||||
class CMSWindowsShellEx
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CMSWindowsShellEx();
|
|
||||||
virtual ~CMSWindowsShellEx();
|
|
||||||
|
|
||||||
void loadLibrary();
|
|
||||||
HINSTANCE getInstance() const;
|
|
||||||
void getDraggingFilename(char* filename) const;
|
|
||||||
void clearDraggingFilename();
|
|
||||||
|
|
||||||
private:
|
|
||||||
HINSTANCE m_instance;
|
|
||||||
GetDraggingFilenameFunc
|
|
||||||
m_getDraggingFilenameFunc;
|
|
||||||
ClearDraggingFilenameFunc
|
|
||||||
m_clearDraggingFilenameFunc;
|
|
||||||
};
|
|
|
@ -1,42 +0,0 @@
|
||||||
# synergy -- mouse and keyboard sharing utility
|
|
||||||
# Copyright (C) 2013 Bolton Software Ltd.
|
|
||||||
#
|
|
||||||
# This package is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the GNU General Public License
|
|
||||||
# found in the file COPYING that should have accompanied this file.
|
|
||||||
#
|
|
||||||
# This package is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
file(GLOB headers "*.h")
|
|
||||||
file(GLOB sources "*.cpp" "*.def")
|
|
||||||
|
|
||||||
if (SYNERGY_ADD_HEADERS)
|
|
||||||
list(APPEND sources ${headers})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories(
|
|
||||||
../
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(synwinxt SHARED ${sources})
|
|
||||||
target_link_libraries(synwinxt
|
|
||||||
arch base common ${libs})
|
|
||||||
|
|
||||||
# copy the dlls (and supporting files) from the lib dir to
|
|
||||||
# the bin dir, so that synergyc and synergys can easily find them.
|
|
||||||
# we should leave the other libraries compiling to the lib dir,
|
|
||||||
# so that the bin dir remains tidy. the path is relative to the
|
|
||||||
# build dir (in this case, that's: build\src\lib\platform).
|
|
||||||
add_custom_command(
|
|
||||||
TARGET synwinxt
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND xcopy /Y /Q
|
|
||||||
..\\..\\..\\..\\lib\\${CMAKE_CFG_INTDIR}\\synwinxt.*
|
|
||||||
..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}\\
|
|
||||||
)
|
|
|
@ -1,108 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2013 Bolton Software Ltd.
|
|
||||||
*
|
|
||||||
* This package is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* found in the file COPYING that should have accompanied this file.
|
|
||||||
*
|
|
||||||
* This package is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "synwinxt/ClassFactory.h"
|
|
||||||
#include "synwinxt/DataHandlerExtension.h"
|
|
||||||
|
|
||||||
#include <Shlwapi.h>
|
|
||||||
|
|
||||||
extern LONG g_refCount;
|
|
||||||
extern void log(const char *str, ...);
|
|
||||||
|
|
||||||
CClassFactory::CClassFactory() :
|
|
||||||
m_refCount(1)
|
|
||||||
{
|
|
||||||
log("> CClassFactory::ctor, g_refCount=%d", g_refCount);
|
|
||||||
InterlockedIncrement(&g_refCount);
|
|
||||||
log("< CClassFactory::ctor, g_refCount=%d", g_refCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
CClassFactory::~CClassFactory()
|
|
||||||
{
|
|
||||||
log("> CClassFactory::dtor, g_refCount=%d", g_refCount);
|
|
||||||
InterlockedDecrement(&g_refCount);
|
|
||||||
log("< CClassFactory::dtor, g_refCount=%d", g_refCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE
|
|
||||||
CClassFactory::QueryInterface(REFIID riid, void **ppvObject)
|
|
||||||
{
|
|
||||||
log("> CClassFactory::QueryInterface");
|
|
||||||
static const QITAB qit[] =
|
|
||||||
{
|
|
||||||
QITABENT(CClassFactory, IClassFactory),
|
|
||||||
{ 0 },
|
|
||||||
};
|
|
||||||
HRESULT hr = QISearch(this, qit, riid, ppvObject);
|
|
||||||
|
|
||||||
log("< CClassFactory::QueryInterface, hr=%d", hr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG STDMETHODCALLTYPE
|
|
||||||
CClassFactory::AddRef()
|
|
||||||
{
|
|
||||||
log("> CClassFactory::AddRef, m_refCount=%d", m_refCount);
|
|
||||||
LONG r = InterlockedIncrement(&m_refCount);
|
|
||||||
log("< CClassFactory::AddRef, r=%d, m_refCount=%d", r, m_refCount);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG STDMETHODCALLTYPE
|
|
||||||
CClassFactory::Release()
|
|
||||||
{
|
|
||||||
log("> CClassFactory::Release, m_refCount=%d", m_refCount);
|
|
||||||
LONG r = InterlockedDecrement(&m_refCount);
|
|
||||||
if (r == 0) {
|
|
||||||
delete this;
|
|
||||||
}
|
|
||||||
|
|
||||||
log("< CClassFactory::Release, r=%d", r);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE
|
|
||||||
CClassFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject)
|
|
||||||
{
|
|
||||||
log("> CClassFactory::CreateInstance");
|
|
||||||
if (pUnkOuter != NULL) {
|
|
||||||
return CLASS_E_NOAGGREGATION;
|
|
||||||
}
|
|
||||||
|
|
||||||
CDataHandlerExtension* pExtension = new CDataHandlerExtension();
|
|
||||||
HRESULT hr = pExtension->QueryInterface(riid, ppvObject);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
delete pExtension;
|
|
||||||
}
|
|
||||||
|
|
||||||
log("< CClassFactory::CreateInstance, hr=%d", hr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE
|
|
||||||
CClassFactory::LockServer(BOOL fLock)
|
|
||||||
{
|
|
||||||
log("> CClassFactory::LockServer, g_refCount=%d", g_refCount);
|
|
||||||
if (fLock) {
|
|
||||||
InterlockedIncrement(&g_refCount);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
InterlockedDecrement(&g_refCount);
|
|
||||||
}
|
|
||||||
log("< CClassFactory::LockServer, g_refCount=%d", g_refCount);
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2013 Bolton Software Ltd.
|
|
||||||
*
|
|
||||||
* This package is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* found in the file COPYING that should have accompanied this file.
|
|
||||||
*
|
|
||||||
* This package is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <Windows.h>
|
|
||||||
|
|
||||||
class CClassFactory : public ::IClassFactory
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CClassFactory();
|
|
||||||
~CClassFactory();
|
|
||||||
|
|
||||||
// IUnknown overrides
|
|
||||||
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
|
|
||||||
ULONG STDMETHODCALLTYPE AddRef();
|
|
||||||
ULONG STDMETHODCALLTYPE Release();
|
|
||||||
|
|
||||||
// IClassFactory overrides
|
|
||||||
HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject);
|
|
||||||
HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock);
|
|
||||||
|
|
||||||
private:
|
|
||||||
LONG m_refCount;
|
|
||||||
};
|
|
|
@ -1,103 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2013 Bolton Software Ltd.
|
|
||||||
*
|
|
||||||
* This package is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* found in the file COPYING that should have accompanied this file.
|
|
||||||
*
|
|
||||||
* This package is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "DataHandlerExtension.h"
|
|
||||||
|
|
||||||
#include <Shlwapi.h>
|
|
||||||
#include <comutil.h>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
extern LONG g_refCount;
|
|
||||||
extern GUID g_CLSID;
|
|
||||||
extern void setDraggingFilename(const char* str);
|
|
||||||
extern void log(const char* str, ...);
|
|
||||||
|
|
||||||
CDataHandlerExtension::CDataHandlerExtension() :
|
|
||||||
m_refCount(1)
|
|
||||||
{
|
|
||||||
log("> CDataHandlerExtension::ctor, g_refCount=%d", g_refCount);
|
|
||||||
InterlockedIncrement(&g_refCount);
|
|
||||||
log("< CDataHandlerExtension::ctor, g_refCount=%d", g_refCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
CDataHandlerExtension::~CDataHandlerExtension()
|
|
||||||
{
|
|
||||||
log("> CDataHandlerExtension::dtor, g_refCount=%d", g_refCount);
|
|
||||||
InterlockedDecrement(&g_refCount);
|
|
||||||
log("< CDataHandlerExtension::dtor, g_refCount=%d", g_refCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE
|
|
||||||
CDataHandlerExtension::QueryInterface(REFIID riid, void **ppvObject)
|
|
||||||
{
|
|
||||||
log("> CDataHandlerExtension::QueryInterface");
|
|
||||||
static const QITAB qit[] =
|
|
||||||
{
|
|
||||||
QITABENT(CDataHandlerExtension, IPersistFile),
|
|
||||||
QITABENT(CDataHandlerExtension, IDataObject),
|
|
||||||
{ 0 },
|
|
||||||
};
|
|
||||||
HRESULT hr = QISearch(this, qit, riid, ppvObject);
|
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
log("< CDataHandlerExtension::QueryInterface, hr=FAILED");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log("< CDataHandlerExtension::QueryInterface, hr=%d", hr);
|
|
||||||
}
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG STDMETHODCALLTYPE
|
|
||||||
CDataHandlerExtension::AddRef()
|
|
||||||
{
|
|
||||||
log("> CDataHandlerExtension::AddRef, m_refCount=%d", m_refCount);
|
|
||||||
LONG r = InterlockedIncrement(&m_refCount);
|
|
||||||
log("< CDataHandlerExtension::AddRef, r=%d, m_refCount=%d", r, m_refCount);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG STDMETHODCALLTYPE
|
|
||||||
CDataHandlerExtension::Release()
|
|
||||||
{
|
|
||||||
log("> CDataHandlerExtension::Release, m_refCount=%d", m_refCount);
|
|
||||||
LONG r = InterlockedDecrement(&m_refCount);
|
|
||||||
if (r == 0) {
|
|
||||||
delete this;
|
|
||||||
}
|
|
||||||
log("< CDataHandlerExtension::Release, r=%d", r);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE
|
|
||||||
CDataHandlerExtension::Load(__RPC__in LPCOLESTR pszFileName, DWORD dwMode)
|
|
||||||
{
|
|
||||||
log("> CDataHandlerExtension::Load");
|
|
||||||
std::string fileName = _bstr_t(pszFileName);
|
|
||||||
setDraggingFilename(fileName.c_str());
|
|
||||||
log("< CDataHandlerExtension::Load");
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE
|
|
||||||
CDataHandlerExtension::GetClassID(__RPC__out CLSID *pClassID)
|
|
||||||
{
|
|
||||||
log("> CDataHandlerExtension::GetClassID");
|
|
||||||
*pClassID = g_CLSID;
|
|
||||||
log("< CDataHandlerExtension::GetClassID");
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2013 Bolton Software Ltd.
|
|
||||||
*
|
|
||||||
* This package is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* found in the file COPYING that should have accompanied this file.
|
|
||||||
*
|
|
||||||
* This package is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <shlobj.h>
|
|
||||||
|
|
||||||
class CDataHandlerExtension : public IDataObject, public IPersistFile
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CDataHandlerExtension();
|
|
||||||
~CDataHandlerExtension();
|
|
||||||
|
|
||||||
// IUnknown overrides
|
|
||||||
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
|
|
||||||
ULONG STDMETHODCALLTYPE AddRef();
|
|
||||||
ULONG STDMETHODCALLTYPE Release();
|
|
||||||
|
|
||||||
// IDataObject overrides
|
|
||||||
HRESULT STDMETHODCALLTYPE GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE GetDataHere(FORMATETC *pformatetc, STGMEDIUM *pmedium) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE QueryGetData(__RPC__in_opt FORMATETC *pformatetc) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(__RPC__in_opt FORMATETC *pformatectIn, __RPC__out FORMATETC *pformatetcOut) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE SetData(FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE EnumFormatEtc(DWORD dwDirection, __RPC__deref_out_opt IEnumFORMATETC **ppenumFormatEtc) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE DAdvise(__RPC__in FORMATETC *pformatetc, DWORD advf, __RPC__in_opt IAdviseSink *pAdvSink, __RPC__out DWORD *pdwConnection) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE DUnadvise(DWORD dwConnection) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE EnumDAdvise(__RPC__deref_out_opt IEnumSTATDATA **ppenumAdvise) { return E_NOTIMPL; }
|
|
||||||
|
|
||||||
// IPersistFile overrides
|
|
||||||
HRESULT STDMETHODCALLTYPE IsDirty() { return E_NOTIMPL; };
|
|
||||||
HRESULT STDMETHODCALLTYPE Load(__RPC__in LPCOLESTR pszFileName, DWORD dwMode);
|
|
||||||
HRESULT STDMETHODCALLTYPE Save(__RPC__in_opt LPCOLESTR pszFileName, BOOL fRemember) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE SaveCompleted(__RPC__in_opt LPCOLESTR pszFileName) { return E_NOTIMPL; }
|
|
||||||
HRESULT STDMETHODCALLTYPE GetCurFile(__RPC__deref_out_opt LPOLESTR *ppszFileName) { return E_NOTIMPL; }
|
|
||||||
|
|
||||||
// IPersist overrides
|
|
||||||
HRESULT STDMETHODCALLTYPE GetClassID(__RPC__out CLSID *pClassID);
|
|
||||||
|
|
||||||
private:
|
|
||||||
LONG m_refCount;
|
|
||||||
};
|
|
|
@ -1,331 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2013 Bolton Software Ltd.
|
|
||||||
*
|
|
||||||
* This package is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* found in the file COPYING that should have accompanied this file.
|
|
||||||
*
|
|
||||||
* This package is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "synwinxt/synwinxt.h"
|
|
||||||
#include "synwinxt/ClassFactory.h"
|
|
||||||
#include "arch/win32/ArchMiscWindows.h"
|
|
||||||
|
|
||||||
#include <Windows.h>
|
|
||||||
#include <strsafe.h>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
#pragma comment(lib, "Shlwapi.lib")
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#pragma comment(linker, "-section:sharedData,rws")
|
|
||||||
#pragma data_seg("sharedData")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static BYTE g_draggingFilename[MAX_PATH] = { 0 };
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#pragma data_seg()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// {1BE208B1-BC21-4E39-8BB6-A5DC3F51479E}
|
|
||||||
GUID g_CLSID = {0x1be208b1, 0xbc21, 0x4e39, {0x8b, 0xb6, 0xa5, 0xdc, 0x3f, 0x51, 0x47, 0x9e}};
|
|
||||||
LONG g_refCount = 0;
|
|
||||||
HINSTANCE g_instance = NULL;
|
|
||||||
|
|
||||||
HRESULT registerInprocServer(CHAR* module, const CLSID& clsid, CHAR* threadModel);
|
|
||||||
HRESULT registerShellExtDataHandler(CHAR* fileType, const CLSID& clsid);
|
|
||||||
HRESULT unregisterShellExtDataHandler(CHAR* fileType, const CLSID& clsid);
|
|
||||||
HRESULT unregisterInprocServer(const CLSID& clsid);
|
|
||||||
|
|
||||||
void
|
|
||||||
log(const char* str, ...)
|
|
||||||
{
|
|
||||||
char buf[2048];
|
|
||||||
|
|
||||||
va_list ptr;
|
|
||||||
va_start(ptr, str);
|
|
||||||
vsprintf_s(buf, str, ptr);
|
|
||||||
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << "synwinxt-" << VERSION << ": " << buf << std::endl;
|
|
||||||
OutputDebugStringA(ss.str().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL APIENTRY
|
|
||||||
DllMain(HMODULE module, DWORD reason, LPVOID reserved)
|
|
||||||
{
|
|
||||||
log("> DllMain, reason=%d", reason);
|
|
||||||
|
|
||||||
switch (reason) {
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
g_instance = module;
|
|
||||||
DisableThreadLibraryCalls(module);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
break;
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
break;
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
log("< DllMain");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//#pragma comment(linker, "/export:DllGetClassObject,PRIVATE")
|
|
||||||
STDAPI
|
|
||||||
DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppvObj)
|
|
||||||
{
|
|
||||||
log("> DllGetClassObject");
|
|
||||||
|
|
||||||
HRESULT hr = E_OUTOFMEMORY;
|
|
||||||
*ppvObj = NULL;
|
|
||||||
|
|
||||||
CClassFactory *classFactory = new CClassFactory();
|
|
||||||
if (classFactory != NULL) {
|
|
||||||
hr = classFactory->QueryInterface(riid, ppvObj);
|
|
||||||
classFactory->Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
log("< DllGetClassObject, hr=%d", hr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
//#pragma comment(linker, "/export:DllCanUnloadNow,PRIVATE")
|
|
||||||
STDAPI
|
|
||||||
DllCanUnloadNow()
|
|
||||||
{
|
|
||||||
log("> DllCanUnloadNow, g_refCount=%d", g_refCount);
|
|
||||||
int r = g_refCount > 0 ? S_FALSE : S_OK;
|
|
||||||
log("< DllCanUnloadNow, g_refCount=%d, r=%d", g_refCount, r);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
//#pragma comment(linker, "/export:DllRegisterServer,PRIVATE")
|
|
||||||
STDAPI
|
|
||||||
DllRegisterServer()
|
|
||||||
{
|
|
||||||
log("> DllRegisterServer");
|
|
||||||
|
|
||||||
/*HRESULT hr;
|
|
||||||
|
|
||||||
CHAR module[MAX_PATH];
|
|
||||||
if (GetModuleFileName(g_instance, module, ARRAYSIZE(module)) == 0) {
|
|
||||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
||||||
log("< DllRegisterServer, hr=%d", hr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = registerInprocServer(
|
|
||||||
module,
|
|
||||||
g_CLSID,
|
|
||||||
"Apartment");
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
hr = registerShellExtDataHandler(
|
|
||||||
"*",
|
|
||||||
g_CLSID);
|
|
||||||
}
|
|
||||||
|
|
||||||
log("< DllRegisterServer, hr=%d", hr);
|
|
||||||
*/
|
|
||||||
|
|
||||||
log("< DllRegisterServer");
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//#pragma comment(linker, "/export:DllUnregisterServer,PRIVATE")
|
|
||||||
STDAPI
|
|
||||||
DllUnregisterServer()
|
|
||||||
{
|
|
||||||
log("> DllUnregisterServer");
|
|
||||||
/*
|
|
||||||
HRESULT hr = S_OK;
|
|
||||||
|
|
||||||
CHAR module[MAX_PATH];
|
|
||||||
if (GetModuleFileName(g_instance, module, ARRAYSIZE(module)) == 0) {
|
|
||||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
||||||
log("< DllRegisterServer, hr=%d", hr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = unregisterInprocServer(g_CLSID);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
hr = unregisterShellExtDataHandler("*", g_CLSID);
|
|
||||||
}
|
|
||||||
|
|
||||||
log("< DllUnregisterServer, hr=%d", hr);*/
|
|
||||||
|
|
||||||
log("< DllUnregisterServer");
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
HRESULT
|
|
||||||
registerInprocServer(CHAR* module, const CLSID& clsid, CHAR* threadModel)
|
|
||||||
{
|
|
||||||
log("> registerInprocServer");
|
|
||||||
|
|
||||||
if (module == NULL || threadModel == NULL) {
|
|
||||||
return E_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
WCHAR CLASSID[MAX_PATH];
|
|
||||||
CHAR szCLSID[MAX_PATH];
|
|
||||||
StringFromGUID2(clsid, CLASSID, ARRAYSIZE(CLASSID));
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, CLASSID, -1, szCLSID, MAX_PATH, NULL, NULL);
|
|
||||||
|
|
||||||
CHAR subkey[MAX_PATH];
|
|
||||||
|
|
||||||
// create the HKCR\CLSID\{<CLSID>}\InprocServer32 key.
|
|
||||||
hr = StringCchPrintf(subkey, ARRAYSIZE(subkey), "CLSID\\%s\\InprocServer32", szCLSID);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
// set the default value of the InprocServer32 key to the
|
|
||||||
// path of the COM module.
|
|
||||||
HKEY key = CArchMiscWindows::addKey(HKEY_CLASSES_ROOT, subkey);
|
|
||||||
CArchMiscWindows::setValue(key, NULL, module);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
// set the threading model of the component.
|
|
||||||
CArchMiscWindows::setValue(key, "ThreadingModel", threadModel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log("< registerInprocServer, hr=%d", hr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT
|
|
||||||
unregisterInprocServer(const CLSID& clsid)
|
|
||||||
{
|
|
||||||
log("> unregisterInprocServer");
|
|
||||||
|
|
||||||
HRESULT hr = S_OK;
|
|
||||||
|
|
||||||
WCHAR CLASSID[MAX_PATH];
|
|
||||||
CHAR szCLSID[MAX_PATH];
|
|
||||||
StringFromGUID2(clsid, CLASSID, ARRAYSIZE(CLASSID));
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, CLASSID, -1, szCLSID, MAX_PATH, NULL, NULL);
|
|
||||||
|
|
||||||
CHAR subkey[MAX_PATH];
|
|
||||||
|
|
||||||
// delete the HKCR\CLSID\{<CLSID>} key.
|
|
||||||
hr = StringCchPrintf(subkey, ARRAYSIZE(subkey), "CLSID\\%s", szCLSID);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
hr = HRESULT_FROM_WIN32(RegDeleteTree(HKEY_CLASSES_ROOT, subkey));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
log("< unregisterInprocServer, hr=FAILED");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log("< unregisterInprocServer, hr=%d", hr);
|
|
||||||
}
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT
|
|
||||||
registerShellExtDataHandler(CHAR* fileType, const CLSID& clsid)
|
|
||||||
{
|
|
||||||
log("> registerShellExtDataHandler");
|
|
||||||
|
|
||||||
if (fileType == NULL) {
|
|
||||||
return E_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
WCHAR szCLSID[MAX_PATH];
|
|
||||||
CHAR CLASSID[MAX_PATH];
|
|
||||||
StringFromGUID2(clsid, szCLSID, ARRAYSIZE(szCLSID));
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, szCLSID, -1, CLASSID, MAX_PATH, NULL, NULL);
|
|
||||||
|
|
||||||
CHAR subkey[MAX_PATH];
|
|
||||||
|
|
||||||
// create the key HKCR\<File Type>\shellex\DataHandler
|
|
||||||
hr = StringCchPrintf(subkey, ARRAYSIZE(subkey), "%s\\shellex\\DataHandler", fileType);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
// set the default value of the key.
|
|
||||||
HKEY key = CArchMiscWindows::addKey(HKEY_CLASSES_ROOT, subkey);
|
|
||||||
CArchMiscWindows::setValue(key, NULL, CLASSID);
|
|
||||||
}
|
|
||||||
|
|
||||||
log("< registerShellExtDataHandler, hr=%d", hr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT
|
|
||||||
unregisterShellExtDataHandler(CHAR* fileType, const CLSID& clsid)
|
|
||||||
{
|
|
||||||
log("> unregisterShellExtDataHandler");
|
|
||||||
|
|
||||||
if (fileType == NULL) {
|
|
||||||
return E_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
WCHAR CLASSID[MAX_PATH];
|
|
||||||
CHAR szCLSID[MAX_PATH];
|
|
||||||
StringFromGUID2(clsid, CLASSID, ARRAYSIZE(CLASSID));
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, CLASSID, -1, szCLSID, MAX_PATH, NULL, NULL);
|
|
||||||
|
|
||||||
CHAR subkey[MAX_PATH];
|
|
||||||
|
|
||||||
// remove the HKCR\<File Type>\shellex\DataHandler key.
|
|
||||||
hr = StringCchPrintf(subkey, ARRAYSIZE(subkey), "%s\\shellex\\DataHandler", fileType);
|
|
||||||
if (SUCCEEDED(hr)) {
|
|
||||||
hr = HRESULT_FROM_WIN32(RegDeleteTree(HKEY_CLASSES_ROOT, subkey));
|
|
||||||
}
|
|
||||||
|
|
||||||
log("< unregisterShellExtDataHandler, hr=%d", hr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
std::string
|
|
||||||
getFileExt(const char* filenameCStr)
|
|
||||||
{
|
|
||||||
std::string filename = filenameCStr;
|
|
||||||
size_t findExt = filename.find_last_of(".", filename.size());
|
|
||||||
if (findExt != std::string::npos) {
|
|
||||||
return filename.substr(findExt + 1, filename.size() - findExt - 1);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
setDraggingFilename(const char* filename)
|
|
||||||
{
|
|
||||||
log("> setDraggingFilename, filename='%s'", filename);
|
|
||||||
memcpy(g_draggingFilename, filename, MAX_PATH);
|
|
||||||
log("< setDraggingFilename, g_draggingFilename='%s'", g_draggingFilename);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
clearDraggingFilename()
|
|
||||||
{
|
|
||||||
log("> clearDraggingFilename");
|
|
||||||
g_draggingFilename[0] = NULL;
|
|
||||||
log("< clearDraggingFilename, g_draggingFilename='%s'", g_draggingFilename);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
getDraggingFilename(char* filename)
|
|
||||||
{
|
|
||||||
log("> getDraggingFilename");
|
|
||||||
memcpy(filename, g_draggingFilename, MAX_PATH);
|
|
||||||
log("< getDraggingFilename, filename='%s'", filename);
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
LIBRARY "synwinxt"
|
|
||||||
EXPORTS
|
|
||||||
DllGetClassObject PRIVATE
|
|
||||||
DllCanUnloadNow PRIVATE
|
|
||||||
DllRegisterServer PRIVATE
|
|
||||||
DllUnregisterServer PRIVATE
|
|
||||||
getDraggingFilename
|
|
||||||
clearDraggingFilename
|
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2013 Bolton Software Ltd.
|
|
||||||
*
|
|
||||||
* This package is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* found in the file COPYING that should have accompanied this file.
|
|
||||||
*
|
|
||||||
* This package is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#if defined(synwinxt_EXPORTS)
|
|
||||||
#define CSYNERGYSHELLEXE_API __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define CSYNERGYSHELLEXE_API __declspec(dllimport)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef void (*GetDraggingFilenameFunc)(char*);
|
|
||||||
typedef void (*ClearDraggingFilenameFunc)();
|
|
||||||
|
|
||||||
CSYNERGYSHELLEXE_API void getDraggingFilename(char* filename);
|
|
||||||
CSYNERGYSHELLEXE_API void clearDraggingFilename();
|
|
Loading…
Reference in New Issue