summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFredrik Orderud <forderud@gmail.com>2015-10-31 22:11:27 +0100
committerFredrik Orderud <forderud@gmail.com>2015-11-02 08:00:09 +0000
commit4abafae33c9b911e8458f31b7611991d9430217b (patch)
treec265a8934ae68a0fa9bb4b89344c6f0a2d1b49a5
parent0215031cceaaa667f1bafd04f3f40e5bf0676121 (diff)
RAII wrapper for command-line arguments in WinMain.
Fixes a memory leak. Introduce scoping to ensure that CoUninitialize is performed after argument cleanup. Task-number: QTBUG-49148 Change-Id: Icc53f87361c492ab9c53290626bab6758b337098 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
-rw-r--r--src/activeqt/control/qaxservermain.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/activeqt/control/qaxservermain.cpp b/src/activeqt/control/qaxservermain.cpp
index ae3f5b5..96cd503 100644
--- a/src/activeqt/control/qaxservermain.cpp
+++ b/src/activeqt/control/qaxservermain.cpp
@@ -243,15 +243,23 @@ EXTERN_C int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR,
if (run) {
if (SUCCEEDED(CoInitialize(0))) {
- int argc;
- QVector<char*> argv(8);
- qWinMain(hInstance, hPrevInstance, unprocessed.data(), nShowCmd, argc, argv);
- qAxInit();
- if (runServer)
- QAxFactory::startServer();
- nRet = ::main(argc, argv.data());
- QAxFactory::stopServer();
- qAxCleanup();
+ {
+ struct Arg {
+ int c;
+ QVector<char*> v;
+
+ Arg() : v(8) {}
+ ~Arg() { Q_FOREACH (char *arg, v) free(arg); }
+ } arg;
+
+ qWinMain(hInstance, hPrevInstance, unprocessed.data(), nShowCmd, arg.c, arg.v);
+ qAxInit();
+ if (runServer)
+ QAxFactory::startServer();
+ nRet = ::main(arg.c, arg.v.data());
+ QAxFactory::stopServer();
+ qAxCleanup();
+ }
CoUninitialize();
} else {
qErrnoWarning("CoInitialize() failed.");