|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the Windows main function 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 #include "qt_windows.h" |
|
42 #include "qbytearray.h" |
|
43 #include "qstring.h" |
|
44 #include "qvector.h" |
|
45 |
|
46 /* |
|
47 This file contains the code in the qtmain library for Windows. |
|
48 qtmain contains the Windows startup code and is required for |
|
49 linking to the Qt DLL. |
|
50 |
|
51 When a Windows application starts, the WinMain function is |
|
52 invoked. WinMain calls qWinMain in the Qt DLL/library, which |
|
53 initializes Qt. |
|
54 */ |
|
55 |
|
56 QT_BEGIN_NAMESPACE |
|
57 |
|
58 #if defined(Q_OS_WINCE) |
|
59 extern void __cdecl qWinMain(HINSTANCE, HINSTANCE, LPSTR, int, int &, QVector<char *> &); |
|
60 #else |
|
61 extern void qWinMain(HINSTANCE, HINSTANCE, LPSTR, int, int &, QVector<char *> &); |
|
62 #endif |
|
63 |
|
64 QT_END_NAMESPACE |
|
65 |
|
66 QT_USE_NAMESPACE |
|
67 |
|
68 |
|
69 #if defined(QT_NEEDS_QMAIN) |
|
70 int qMain(int, char **); |
|
71 #define main qMain |
|
72 #else |
|
73 #ifdef Q_OS_WINCE |
|
74 extern "C" int __cdecl main(int, char **); |
|
75 #else |
|
76 extern "C" int main(int, char **); |
|
77 #endif |
|
78 #endif |
|
79 |
|
80 /* |
|
81 WinMain() - Initializes Windows and calls user's startup function main(). |
|
82 NOTE: WinMain() won't be called if the application was linked as a "console" |
|
83 application. |
|
84 */ |
|
85 |
|
86 #ifdef Q_OS_WINCE |
|
87 int WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPWSTR /*wCmdParam*/, int cmdShow) |
|
88 #else |
|
89 extern "C" |
|
90 int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR /*cmdParamarg*/, int cmdShow) |
|
91 #endif |
|
92 { |
|
93 QByteArray cmdParam = QString::fromWCharArray(GetCommandLine()).toLocal8Bit(); |
|
94 |
|
95 #if defined(Q_OS_WINCE) |
|
96 wchar_t appName[MAX_PATH]; |
|
97 GetModuleFileName(0, appName, MAX_PATH); |
|
98 cmdParam.prepend(QString(QLatin1String("\"%1\" ")).arg(QString::fromWCharArray(appName)).toLocal8Bit()); |
|
99 #endif |
|
100 |
|
101 int argc = 0; |
|
102 QVector<char *> argv(8); |
|
103 qWinMain(instance, prevInstance, cmdParam.data(), cmdShow, argc, argv); |
|
104 |
|
105 #if defined(Q_OS_WINCE) |
|
106 wchar_t uniqueAppID[MAX_PATH]; |
|
107 GetModuleFileName(0, uniqueAppID, MAX_PATH); |
|
108 QString uid = QString::fromWCharArray(uniqueAppID).toLower().replace(QLatin1String("\\"), QLatin1String("_")); |
|
109 |
|
110 // If there exists an other instance of this application |
|
111 // it will be the owner of a mutex with the unique ID. |
|
112 HANDLE mutex = CreateMutex(NULL, TRUE, (LPCWSTR)uid.utf16()); |
|
113 if (mutex && ERROR_ALREADY_EXISTS == GetLastError()) { |
|
114 CloseHandle(mutex); |
|
115 |
|
116 // The app is already running, so we use the unique |
|
117 // ID to create a unique messageNo, which is used |
|
118 // as the registered class name for the windows |
|
119 // created. Set the first instance's window to the |
|
120 // foreground, else just terminate. |
|
121 // Use bitwise 0x01 OR to reactivate window state if |
|
122 // it was hidden |
|
123 UINT msgNo = RegisterWindowMessage((LPCWSTR)uid.utf16()); |
|
124 HWND aHwnd = FindWindow((LPCWSTR)QString::number(msgNo).utf16(), 0); |
|
125 if (aHwnd) |
|
126 SetForegroundWindow((HWND)(((ULONG)aHwnd) | 0x01)); |
|
127 return 0; |
|
128 } |
|
129 #endif // Q_OS_WINCE |
|
130 |
|
131 int result = main(argc, argv.data()); |
|
132 #if defined(Q_OS_WINCE) |
|
133 CloseHandle(mutex); |
|
134 #endif |
|
135 return result; |
|
136 } |