diff options
Diffstat (limited to 'plugins/ShellExt/src')
| -rw-r--r-- | plugins/ShellExt/src/main.cpp | 19 | ||||
| -rw-r--r-- | plugins/ShellExt/src/shlcom.cpp | 19 | ||||
| -rw-r--r-- | plugins/ShellExt/src/stdafx.h | 3 | 
3 files changed, 40 insertions, 1 deletions
diff --git a/plugins/ShellExt/src/main.cpp b/plugins/ShellExt/src/main.cpp index 1de8cef3e8..b7b66556e6 100644 --- a/plugins/ShellExt/src/main.cpp +++ b/plugins/ShellExt/src/main.cpp @@ -108,10 +108,27 @@ STDAPI DllUnregisterServer()  /////////////////////////////////////////////////////////////////////////////////////////
 +static TCHAR tszLogPath[MAX_PATH];
 +
 +void logA(const char *format, ...)
 +{
 +	FILE *out = _tfopen(tszLogPath, _T("a+"));
 +	if (out) {
 +		va_list args;
 +		va_start(args, format);
 +		vfprintf(out, format, args);
 +		va_end(args);
 +		fclose(out);
 +	}
 +}
 +
  extern "C" __declspec(dllexport) int Load(void)
  {
  	mir_getLP(&pluginInfoEx);
 -	
 +
 +	GetTempPath(SIZEOF(tszLogPath), tszLogPath);
 +	_tcscat_s(tszLogPath, SIZEOF(tszLogPath), _T("shlext.log"));
 +
  	InvokeThreadServer();
  	HookEvent(ME_OPT_INITIALISE, OnOptionsInit);
  	DllRegisterServer();
 diff --git a/plugins/ShellExt/src/shlcom.cpp b/plugins/ShellExt/src/shlcom.cpp index 6f659e5280..485050add2 100644 --- a/plugins/ShellExt/src/shlcom.cpp +++ b/plugins/ShellExt/src/shlcom.cpp @@ -521,12 +521,14 @@ BOOL __stdcall ProcessRequest(HWND hwnd, LPARAM param)  			GetClassNameA(hwnd, szBuf, sizeof(szBuf));
  			if ( lstrcmpA(szBuf, MIRANDACLASS) != 0) {
  				// opened but not valid.
 +				logA("ProcessRequest(%d, %p): class %s differs from %s\n", pid, hwnd, szBuf, MIRANDACLASS);
  				CloseHandle(hMirandaWorkEvent);
  				return true;
  			}
  		}
  		// if the event object exists,  a shlext.dll running in the instance must of created it.
  		if (hMirandaWorkEvent != 0) {
 +			logA("ProcessRequest(%d, %p): window found\n", pid, hwnd);
  			// prep the request
  			ipcPrepareRequests(IPC_PACKET_SIZE, lParam->ipch, REQUEST_ICONS | REQUEST_GROUPS | REQUEST_CONTACTS | REQUEST_NEWICONS);
 @@ -538,6 +540,7 @@ BOOL __stdcall ProcessRequest(HWND hwnd, LPARAM param)  			// bits as sent or a series of *_NOTIMPL bits where the request bit were, if there are no
  			// contacts to speak of,  don't bother showing this instance of Miranda }
  			if (replyBits != REPLY_FAIL && lParam->ipch->ContactsBegin != NULL) {
 +				logA("ProcessRequest(%d, %p): IPC succeeded\n", pid, hwnd);
  				// load the address again, the server side will always overwrite it
  				lParam->ipch->pClientBaseAddress = lParam->ipch;
  				// fixup all the pointers to be relative to the memory map
 @@ -588,6 +591,7 @@ HRESULT TShlComRec::QueryInterface(REFIID riid, void **ppvObject)  	if (riid == IID_IContextMenu || riid == IID_IContextMenu2 || riid == IID_IContextMenu3) {
  		*ppvObject = (IContextMenu3*)this;
  		RefCount++;
 +		logA("TShlComRec[%p] retrieved as IContextMenu3: %d\n", this, RefCount);
  		return S_OK;
  	}
 @@ -596,16 +600,20 @@ HRESULT TShlComRec::QueryInterface(REFIID riid, void **ppvObject)  	if (riid == IID_IShellExtInit) {
  		*ppvObject = (IShellExtInit*)this;
  		RefCount++;
 +		logA("TShlComRec[%p] retrieved as IContextMenu3: %d\n", this, RefCount);
  		return S_OK;
  	}
  	*ppvObject = NULL;
 +	logA("TShlComRec[%p] failed as {%08x-%04x-%04x-%08%x08x}\n",
 +		riid.Data1, riid.Data2, riid.Data3, &riid.Data4[0], &riid.Data4[4]);
  	return CLASS_E_CLASSNOTAVAILABLE;
  }
  ULONG TShlComRec::AddRef()
  {
  	RefCount++;
 +	logA("TShlComRec[%p] added ref: %d\n", this, RefCount);
  	return RefCount;
  }
 @@ -643,9 +651,12 @@ ULONG TShlComRec::Release()  			DeleteDC(hMemDC);
  		// free the instance (class record) created
 +		logA("TShlComRec[%p] final release\n", this);
  		delete this;
  		dllobject.ObjectCount--;
  	} 
 +	else logA("TShlComRec[%p] release ref: %d\n", this, RefCount);
 +
  	return ret;
  }
 @@ -1009,6 +1020,7 @@ ULONG TClassFactoryRec::Release()  {
  	ULONG result = --RefCount;
  	if (result == 0) {
 +		logA("TClassFactoryRec released\n");
  		delete this;
  		dllobject.FactoryCount--;
  	}
 @@ -1027,11 +1039,13 @@ HRESULT TClassFactoryRec::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void  	if (riid == IID_IContextMenu) {
  		TShlComRec *p = new TShlComRec();
  		*ppvObject = (IContextMenu3*)p;
 +		logA("TClassFactoryRec created as IContextMenu3: %p\n", p);
  		return S_OK;
  	}
  	if (riid == IID_IShellExtInit) {
  		TShlComRec *p = new TShlComRec();
  		*ppvObject = (IShellExtInit*)p;
 +		logA("TClassFactoryRec created as IShellExtInit: %p\n", p);
  		return S_OK;
  	}
 @@ -1515,15 +1529,20 @@ STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)  {
  	if (rclsid == CLSID_ISHLCOM && riid == IID_IClassFactory && FindWindowA(MIRANDACLASS, NULL) != 0) {
  		*ppv = new TClassFactoryRec();
 +		logA("DllGetClassObject succeeded\n");
  		return S_OK;
  	}
  	*ppv = NULL;
 +	logA("DllGetClassObject {%08x-%04x-%04x-%08x%08x} failed\n",
 +		rclsid.Data1, rclsid.Data2, rclsid.Data3, &rclsid.Data4[0], &rclsid.Data4[4]);
 +
  	return CLASS_E_CLASSNOTAVAILABLE;
  }
  STDAPI DllCanUnloadNow()
  {
 +	logA("DllCanUnloadNow: %d %d\n", dllobject.FactoryCount, dllobject.ObjectCount);
  	if (dllobject.FactoryCount == 0 && dllobject.ObjectCount == 0)
  		return S_OK;
  	return S_FALSE;
 diff --git a/plugins/ShellExt/src/stdafx.h b/plugins/ShellExt/src/stdafx.h index 65d8b69adf..a5753b7a91 100644 --- a/plugins/ShellExt/src/stdafx.h +++ b/plugins/ShellExt/src/stdafx.h @@ -45,5 +45,8 @@ int     IsCOMRegistered();  HRESULT RemoveCOMRegistryEntries();
  extern  HINSTANCE hInst;
 +extern  HANDLE hLogger;
  int OnOptionsInit(WPARAM wParam, LPARAM lParam);
 +
 +void logA(const char *format, ...);
\ No newline at end of file  | 
