src/winmain/qtmain_win.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     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 }