[SHELLEXT][MYDOCS][INF] Add mydocs.dll and .mydocs file extension (#2624)
[reactos.git] / dll / shellext / mydocs / mydocs.cpp
diff --git a/dll/shellext/mydocs/mydocs.cpp b/dll/shellext/mydocs/mydocs.cpp
new file mode 100644 (file)
index 0000000..c5954c1
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * PROJECT:     mydocs
+ * LICENSE:     LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
+ * PURPOSE:     MyDocs implementation
+ * COPYRIGHT:   Copyright 2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
+ */
+
+#include "precomp.hpp"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mydocs);
+
+BEGIN_OBJECT_MAP(ObjectMap)
+    OBJECT_ENTRY(CLSID_MyDocsDropHandler, CMyDocsDropHandler)
+END_OBJECT_MAP()
+
+CComModule gModule;
+LONG g_ModuleRefCnt = 0;
+
+STDAPI DllCanUnloadNow(void)
+{
+    if (g_ModuleRefCnt)
+        return S_FALSE;
+    return gModule.DllCanUnloadNow();
+}
+
+STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+{
+    TRACE("CLSID:%s,IID:%s\n", wine_dbgstr_guid(&rclsid), wine_dbgstr_guid(&riid));
+
+    HRESULT hr = gModule.DllGetClassObject(rclsid, riid, ppv);
+
+    TRACE("-- pointer to class factory: %p\n", *ppv);
+
+    return hr;
+}
+
+STDAPI DllRegisterServer(void)
+{
+    HRESULT hr = gModule.DllRegisterServer(FALSE);
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
+    return S_OK;
+}
+
+STDAPI DllUnregisterServer(void)
+{
+    HRESULT hr = gModule.DllUnregisterServer(FALSE);
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
+    return S_OK;
+}
+
+STDAPI_(BOOL) DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID fImpLoad)
+{
+    TRACE("%p 0x%x %p\n", hInstance, dwReason, fImpLoad);
+    if (dwReason == DLL_PROCESS_ATTACH)
+    {
+        gModule.Init(ObjectMap, hInstance, NULL);
+        DisableThreadLibraryCalls(hInstance);
+    }
+    else if (dwReason == DLL_PROCESS_DETACH)
+    {
+        gModule.Term();
+    }
+    return TRUE;
+}