C ++ _tWinMain запускается более одного раза? - PullRequest
0 голосов
/ 16 января 2019

Я использую DuiLib и Cef.
и мне нравится, что мой _tWinMain звонил 2 раза.
1: когда я открываю приложение, вызывается main ();
2 Когда я создаю окно, main () вызывается 2nd.

вот код:

vector<wstring> StartArgs;
map<wstring, wstring> argsMaps;
void GetArgMap() {
    for (int i = 1; i < StartArgs.size(); ++i) {
        wstring argStr = StartArgs[i];
        vector<wstring> argVec;
        split(argStr, L':', argVec);
        if (argVec.size() >= 2) {
            wstring k = argVec[0];
            wstring v = argVec[1];
            argsMaps.insert(map<wstring, wstring>::value_type(k,v));
        }
    }
}

wstring GetArgForKey(wstring key) {

    wstring ret = argsMaps[key];
    if (lstrcmpW(ret.c_str(), L"")) {
        return ret;
    }
    else {
        return L"null";
    }
}

bool CheckParamAvialble(wstring param) {
    if (lstrcmpW(param.c_str(), L"null")) {
        return true;
    }
    else {
        return false;
    }
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,
    int nCmdShow)
{   

    ShowMessageBox(L"this is test alert!", L"WARNING");
    int argCount = 0;
    LPWSTR cmdline = GetCommandLine();
    //cmdline is  [m:1 h:0 a:500000 n:xxx c:xxx u:usera o:TOKEN]
    LPWSTR* szArgList = CommandLineToArgvW(cmdline, &argCount);
    for (int i = 0; i < argCount; ++i) {
        wstring a = szArgList[i];
        StartArgs.push_back(a);
    }

    if (argCount >= 7) {
        wstring mString = GetArgForKey(L"m");
        if (!CheckParamAvialble(mString))
        {
            ShowMessageBox(L"arg m is wrong!", L"Error");
            return 0;
        }
        /*
            do something with other args
        */
            CPaintManagerUI::SetInstance(hInstance);
            InitResource();
            HRESULT Hr = ::CoInitialize(NULL);
            if (FAILED(Hr)) return 0;
            CefMainArgs args(hInstance);
            CefRefPtr<SimpleApp> app(new SimpleApp);
            int exitCode = CefExecuteProcess(args, app, NULL);
            if (exitCode >= 0)
            {
                return exitCode;
            }
            CefSettings settings;
            CefInitialize(args, settings, app.get(), NULL);
            CefRefPtr<CefCommandLine> command_line;
            command_line = CefCommandLine::CreateCommandLine();
            command_line->AppendSwitch("no-proxy-server");
            MainForm *pFrame = new MainForm(_T("Forms\\MA_MainForm.xml"));
            if (pFrame == NULL) return 0;
            pFrame->Create(NULL, _T("MainForm"), UI_WNDSTYLE_FRAME, WS_EX_STATICEDGE | WS_EX_APPWINDOW, 0, 0, 600, 800);//when progrom go here,i got 2nd MessageBox[this is test alert!]
            pFrame->CenterWindow();
            CefRunMessageLoop();
            CefShutdown();
            return 0;
    }
    else 
    {
        ShowMessageBox(L"something wrong and exit", L"Error");
        return 0;
    }
}

и странная вещь
Второй вызов main () не вызовет мою точку останова, он просто покажет окно сообщения [это тестовое предупреждение!] Снова.
и если я покажу другое окно, оно покажет 3-е окно сообщения [это тестовое предупреждение!]
просто покажите сообщение несколько раз, без перерыва, без исключения.
Большое спасибо.

1 Ответ

0 голосов
/ 16 января 2019

Читали ли вы, как работает Chromium Embedded Framework ? Он создаст несколько процессов, обычно путем создания дополнительных копий основного исполняемого файла. Когда это произойдет, вы получите другой процесс, отображающий диалоговое окно «Это тестовое предупреждение». Поскольку это другой процесс, ваши точки останова не будут достигнуты, если у вас не настроен отладчик для отладки любых порожденных дочерних процессов.

В результате вы видите ожидаемое поведение.

...