source: trunk/src/activeqt/control/qaxserverdll.cpp@ 624

Last change on this file since 624 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 4.3 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the ActiveQt framework of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:BSD$
10** You may use this file under the terms of the BSD license as follows:
11**
12** "Redistribution and use in source and binary forms, with or without
13** modification, are permitted provided that the following conditions are
14** met:
15** * Redistributions of source code must retain the above copyright
16** notice, this list of conditions and the following disclaimer.
17** * Redistributions in binary form must reproduce the above copyright
18** notice, this list of conditions and the following disclaimer in
19** the documentation and/or other materials provided with the
20** distribution.
21** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
22** the names of its contributors may be used to endorse or promote
23** products derived from this software without specific prior written
24** permission.
25**
26** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
37** $QT_END_LICENSE$
38**
39****************************************************************************/
40
41#ifndef QT_NO_WIN_ACTIVEQT
42
43#include <qapplication.h>
44#include <qwidget.h>
45
46#include <qt_windows.h>
47
48QT_BEGIN_NAMESPACE
49
50bool qax_ownQApp = false;
51HHOOK qax_hhook = 0;
52
53// in qaxserver.cpp
54extern wchar_t qAxModuleFilename[MAX_PATH];
55extern bool qAxIsServer;
56extern ITypeLib *qAxTypeLibrary;
57extern unsigned long qAxLockCount();
58extern QString qAxInit();
59extern void qAxCleanup();
60extern HANDLE qAxInstance;
61static uint qAxThreadId = 0;
62
63extern HRESULT UpdateRegistry(int bRegister);
64extern HRESULT GetClassObject(const GUID &clsid, const GUID &iid, void **ppUnk);
65
66STDAPI DllRegisterServer()
67{
68 return UpdateRegistry(true);
69}
70
71STDAPI DllUnregisterServer()
72{
73 return UpdateRegistry(false);
74}
75
76STDAPI DllGetClassObject(const GUID &clsid, const GUID &iid, void** ppv)
77{
78 if (!qAxThreadId)
79 qAxThreadId = GetCurrentThreadId();
80 else if (GetCurrentThreadId() != qAxThreadId)
81 return E_FAIL;
82
83 GetClassObject(clsid, iid, ppv);
84 if (!*ppv)
85 return CLASS_E_CLASSNOTAVAILABLE;
86 return S_OK;
87}
88
89STDAPI DllCanUnloadNow()
90{
91 if (GetCurrentThreadId() != qAxThreadId)
92 return S_FALSE;
93 if (qAxLockCount())
94 return S_FALSE;
95 if (!qax_ownQApp)
96 return S_OK;
97
98 // check if qApp still runs widgets (in other DLLs)
99 QWidgetList widgets = qApp->allWidgets();
100 int count = widgets.count();
101 for (int w = 0; w < widgets.count(); ++w) {
102 // remove all Qt generated widgets
103 QWidget *widget = widgets.at(w);
104 if (widget->windowType() == Qt::Desktop || widget->objectName() == QLatin1String("Qt internal tablet widget"))
105 count--;
106 }
107 if (count)
108 return S_FALSE;
109
110 // no widgets left - destroy qApp
111 if (qax_hhook)
112 UnhookWindowsHookEx(qax_hhook);
113
114 delete qApp;
115 qax_ownQApp = false;
116
117 // never allow unloading - safety net for Internet Explorer
118 return S_FALSE;
119}
120
121
122EXTERN_C BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved)
123{
124 GetModuleFileName(hInstance, qAxModuleFilename, MAX_PATH);
125 qAxInstance = hInstance;
126 qAxIsServer = true;
127
128 if (dwReason == DLL_PROCESS_ATTACH) {
129 DisableThreadLibraryCalls(hInstance);
130 qAxInit();
131 } else if (dwReason == DLL_PROCESS_DETACH) {
132 qAxCleanup();
133 }
134
135 return true;
136}
137
138QT_END_NAMESPACE
139#endif // QT_NO_WIN_ACTIVEQT
Note: See TracBrowser for help on using the repository browser.