diff options
author | Fredrik Orderud <forderud@gmail.com> | 2015-10-31 22:11:27 +0100 |
---|---|---|
committer | Fredrik Orderud <forderud@gmail.com> | 2015-11-02 08:00:09 +0000 |
commit | 4abafae33c9b911e8458f31b7611991d9430217b (patch) | |
tree | c265a8934ae68a0fa9bb4b89344c6f0a2d1b49a5 | |
parent | 0215031cceaaa667f1bafd04f3f40e5bf0676121 (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.cpp | 26 |
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."); |