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

Last change on this file since 452 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

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