File indexing completed on 2024-12-01 09:53:47

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 2008 Jarosław Staniek <staniek@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include <QDir>
0009 #include <QWidget>
0010 
0011 #include <qt_windows.h>
0012 
0013 // TODO move to a shared lib
0014 static int runDll(WId windowId, const QString &libraryName, const QByteArray &functionName, const QString &arguments)
0015 {
0016     HMODULE libHandle = LoadLibraryW((LPCWSTR)libraryName.utf16());
0017     if (!libHandle) {
0018         return 0;
0019     }
0020     typedef int(WINAPI * FunctionType)(HWND, HMODULE, LPCWSTR, int);
0021 #ifdef _WIN32_WCE
0022     QString functionNamestr = QString(functionName);
0023     FunctionType function = (FunctionType)GetProcAddressW(libHandle, functionNamestr.utf16());
0024 #else
0025     FunctionType function = (FunctionType)GetProcAddress(libHandle, functionName.constData());
0026 #endif
0027     if (!function) {
0028         return 0;
0029     }
0030     int result = function((HWND)windowId, libHandle, (LPCWSTR)arguments.utf16(), SW_SHOW);
0031     FreeLibrary(libHandle);
0032     return result;
0033 }
0034 
0035 static int runDll(WId windowId, const QString &libraryName, const QByteArray &functionName, const QByteArray &arguments)
0036 {
0037     HMODULE libHandle = LoadLibraryW((LPCWSTR)libraryName.utf16());
0038     if (!libHandle) {
0039         return 0;
0040     }
0041     typedef int(WINAPI * FunctionType)(HWND, HMODULE, LPCSTR, int);
0042 #ifdef _WIN32_WCE
0043     QString functionNamestr = QString(functionName);
0044     FunctionType function = (FunctionType)GetProcAddressW(libHandle, functionNamestr.utf16());
0045 #else
0046     FunctionType function = (FunctionType)GetProcAddress(libHandle, functionName.constData());
0047 #endif
0048     if (!function) {
0049         return 0;
0050     }
0051     int result = function((HWND)windowId, libHandle, (LPCSTR)arguments.constData(), SW_SHOW);
0052     FreeLibrary(libHandle);
0053     return result;
0054 }
0055 
0056 // TODO move to a shared lib
0057 static int runDll(QWidget *parent, const QString &libraryName, const QByteArray &functionName, const QString &arguments)
0058 {
0059     return runDll(parent ? parent->winId() : 0, libraryName, functionName, arguments);
0060 }
0061 
0062 // Windows implementation using "OpenAs_RunDLL" entry
0063 static bool displayNativeOpenWithDialog(const QList<QUrl> &lst, QWidget *window)
0064 {
0065     QStringList fnames;
0066     for (const QUrl &url : lst) {
0067         fnames += url.isLocalFile() ? QDir::toNativeSeparators(url.toLocalFile()) : url.toString();
0068     }
0069     int result = runDll(window, QLatin1String("shell32.dll"), "OpenAs_RunDLLW", fnames.join(QLatin1Char(' ')));
0070     return result == 0;
0071 }