/src/ShellExtension/PdnShell.cpp

http://paint-mono.googlecode.com/ · C++ · 149 lines · 111 code · 30 blank · 8 comment · 16 complexity · a3ceee3d6643de81dc5ae2701a42333e MD5 · raw file

  1. /////////////////////////////////////////////////////////////////////////////////
  2. // Paint.NET //
  3. // Copyright (C) Rick Brewster, Tom Jackson, and past contributors. //
  4. // Portions Copyright (C) Microsoft Corporation. All Rights Reserved. //
  5. // See src/Resources/Files/License.txt for full licensing and attribution //
  6. // details. //
  7. // . //
  8. /////////////////////////////////////////////////////////////////////////////////
  9. #pragma warning (disable: 4530)
  10. #include <windows.h>
  11. #include <comcat.h>
  12. #include "PdnShell.h"
  13. #include "ClassFactory.h"
  14. #pragma data_seg(".text")
  15. #define INITGUID
  16. #include <initguid.h>
  17. #include <shlguid.h>
  18. #include "PdnGuid.h"
  19. #pragma data_seg()
  20. #include <iostream>
  21. using namespace std;
  22. HINSTANCE g_hInstance;
  23. volatile LONG g_lRefCount;
  24. #ifndef NDEBUG
  25. void TraceOut(const char *szFormat, ...)
  26. {
  27. va_list marker;
  28. va_start(marker, szFormat);
  29. char buffer[2048];
  30. _vsnprintf_s(buffer, sizeof(buffer), (sizeof(buffer) / sizeof(buffer[0])) - 1, szFormat, marker);
  31. OutputDebugStringA(buffer);
  32. FILE *flog = NULL;
  33. errno_t err = fopen_s(&flog, "C:\\log.txt", "a");
  34. if (0 == err && NULL != flog)
  35. {
  36. fprintf(flog, "%s\n", buffer);
  37. fclose(flog);
  38. }
  39. }
  40. #endif
  41. const WCHAR *GuidToString(GUID guid)
  42. {
  43. static WCHAR szGuid[128];
  44. StringFromGUID2(guid, szGuid, 128);
  45. return szGuid;
  46. }
  47. extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReasonForCall, LPVOID lpvReserved)
  48. {
  49. TraceEnter();
  50. TraceOut("hInstance=%p, dwReasonForCall=%u, lpvReserved=%p", hInstance, dwReasonForCall, lpvReserved);
  51. switch (dwReasonForCall)
  52. {
  53. case DLL_PROCESS_ATTACH:
  54. g_hInstance = hInstance;
  55. break;
  56. case DLL_THREAD_ATTACH:
  57. break;
  58. case DLL_THREAD_DETACH:
  59. break;
  60. case DLL_PROCESS_DETACH:
  61. g_hInstance = NULL;
  62. break;
  63. }
  64. TraceLeave();
  65. return TRUE;
  66. }
  67. STDAPI DllCanUnloadNow()
  68. {
  69. HRESULT hr;
  70. TraceEnter();
  71. if (0 == g_lRefCount)
  72. {
  73. hr = S_OK;
  74. }
  75. else
  76. {
  77. hr = S_FALSE;
  78. }
  79. TraceLeaveHr(hr);
  80. return hr;
  81. }
  82. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
  83. {
  84. TraceEnter();
  85. CClassFactory *pFactory = NULL;
  86. HRESULT hr = S_OK;
  87. TraceOut("rclsid=%s, riid=%s, ppv=%p", GuidToString(rclsid), GuidToString(riid), ppv);
  88. if (SUCCEEDED(hr))
  89. {
  90. if (NULL == ppv)
  91. {
  92. hr = E_INVALIDARG;
  93. }
  94. }
  95. if (SUCCEEDED(hr))
  96. {
  97. TraceOut("Calling IsEqualCLSID(rclsid, CLSID_PdnShellExtension");
  98. if (!IsEqualCLSID(rclsid, CLSID_PdnShellExtension))
  99. {
  100. hr = CLASS_E_CLASSNOTAVAILABLE;
  101. }
  102. }
  103. if (SUCCEEDED(hr))
  104. {
  105. TraceOut("Creating CClassFactory instance");
  106. pFactory = new CClassFactory(rclsid);
  107. if (NULL == pFactory)
  108. {
  109. hr = E_OUTOFMEMORY;
  110. }
  111. }
  112. if (SUCCEEDED(hr))
  113. {
  114. hr = pFactory->QueryInterface(riid, ppv);
  115. pFactory->Release();
  116. }
  117. TraceLeaveHr(hr);
  118. return hr;
  119. }