Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 74
1

Как передать новую командную строку классу Dlg

28.08.2014, 11:11. Просмотров 692. Ответов 2
Метки нет (Все метки)

Здравствуйте! Есть проект, exe-шка которого, будет запускаться из другого приложения с помощью функции CreateProcess:

C++
1
2
3
4
5
6
7
8
9
    if (VoltDC.GetCheck() == 1)
        CreateProcess(L"C:\\SuperObj.exe", L"VoltMeterDC01", NULL, 
                    NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (VoltAC.GetCheck() == 1)
        CreateProcess(L"C:\\SuperObj.exe", L"VoltMeter01", NULL, 
                    NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (Spectr.GetCheck() == 1)
        CreateProcess(L"C:\\SuperObj.exe", L"TestMFCApp01", NULL, 
                    NULL, FALSE, 0, NULL, NULL, &si, &pi);
При тех или иных установках CheckBox'ов запускается одна и та же программа только с разными командными строками (второй параметр в функции). Но программа заново запускаться каждый раз не будет т.е. вызывается функция

C++
1
BOOL CSuperObjApp::InitInstance()
где проверяется запущен ли уже экземпляр этой программы: если нет, то запускается программа если да, то программа не запускается, НО мне нужно передать новую командную строку в CSuperObjDlg. В InitInstance новая командная строка считывается, но как её передать уже существующему экземпляру программы?

Что пробовал и какие результаты:
пробовал объявить глобальную статическую переменную и записать в неё значение командной строки
результат: в классе CSuperObjDlg строка пустая.

пробовал передать указатель на строку в функции:

C++
1
::SendMessage(hwnd, WM_REBUILD_OBJ, 0, (LPARAM)&lpCmdLine);
результат: сообщение передается, обрабатывается но командная строка старая т.е. от предыдущей попытки запуска.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
BOOL CSuperObjApp::InitInstance()
{
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);
    CWinApp::InitInstance();
 
    lpCmdLine = GetCommandLine(); // lpCmdLine  статическая переменная класса CSuperObjApp
    extern_lpCmdLine = GetCommandLine(); // extern_lpCmdLine  - глобальная статическая переменная 
    CString CmdString = lpCmdLine;
    MessageBox(NULL, CmdString, L"ACHTUNG!", 0); // выводится сообщение с НОВОЙ КС
    MessageBox(NULL, extern_lpCmdLine, L"ACHTUNG!", 0); // выводится сообщение  новой КС
    bool m_bStartProject = false;
    CString cmdStr = CString(m_lpCmdLine);
    if (cmdStr.Find(L".zpx") != -1)
        m_bStartProject = true;
    else
        m_bStartProject = false;
 
    static CMutex m_RunOnceMutex(FALSE, _T("SuperObj"));
    static CSingleLock m_RunOnceLock(&m_RunOnceMutex);
    if (!m_RunOnceLock.Lock(0))
    {
        if (m_bStartProject == false)
        {
            HWND hwnd = FindWindow(NULL, _T("SuperObj"));
            if (hwnd != NULL)
                ::SendMessage(hwnd, WM_REBUILD_OBJ, 0, (LPARAM)&lpCmdLine);
            CString str = lpCmdLine;
            MessageBox(NULL, str, L"ACHTUNG!", 0);
            return FALSE;
        }
    }
 
    AfxEnableControlContainer();
    CShellManager *pShellManager = new CShellManager;
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
    SetRegistryKey(_T("Локальные приложения, созданные с помощью мастера приложений"));
 
    CSuperObjDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        //  с помощью кнопки "ОК"
    }
    else if (nResponse == IDCANCEL)
    {
        //  с помощью кнопки "Отмена"
    }
    else if (nResponse == -1)
    {
        TRACE(traceAppMsg, 0, "Предупреждение. Не удалось создать диалоговое окно, поэтому работа приложения неожиданно завершена.\n");
        TRACE(traceAppMsg, 0, "Предупреждение. При использовании элементов управления MFC для диалогового окна невозможно #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n");
    }
    if (pShellManager != NULL)
    {
        delete pShellManager;
    }
    return FALSE;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2014, 11:11
Ответы с готовыми решениями:

Как отослать команду в командную строку
Вопрос состоит в том что когда я вызываю програму через system(), то мой проект виснет а когда...

Как лучше делать командную строку?
Задача обеспечить текстовый ввод с клавы не только значений переменных, но и команд. В гуях обычно...

Как передать строку из слов и пробелов через командную строку?
Я сделал запуск проги через командную строку. Теперь считываю параметры. Ничего сложного. Один...

Как передать значение из поля в командную строку?
Подскажите, пожалуйста чайнику, думаю это не составит проблемы. Короче, есть база данных в...

2
Заблокирован
Автор FAQ
28.08.2014, 14:20 2
Всегда читаю и удивляюсь, геткоммандлайн, лапша из кода и это для MFC где уже тьма всего готового

MFC и параметры командной строки
0
66 / 63 / 21
Регистрация: 01.05.2014
Сообщений: 247
29.08.2014, 00:21 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
BOOL CSuperObjApp::InitInstance()
{   
 
/*----------------------------------------------------------------------------
    какой-то код...
----------------------------------------------------------------------------*/
 
    if (m_bStartProject == false)
    {
        HWND hwnd = FindWindow(NULL, _T("SuperObj"));
        if (hwnd != NULL)
            SendMsg(hwnd,lpCmdLine);
        return FALSE;
    }
}
 
void CSuperObjApp::SendMsg(HWND hwnd, const TCHAR* Str)
{
    COPYDATASTRUCT cds;
    cds.dwData = 1;
    cds.cbData = sizeof(TCHAR) * ( lstrlen(Str) + 1 );
    cds.lpData = (void*)Str;
    SendMessage(hwnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds);
}
 
//
// CSuperObjDlg
//
 
/*----------------------------------------------------------------------------
    Добавить в файл заголовок:
afx_msg BOOL OnCopyData(CWnd*,COPYDATASTRUCT*);
----------------------------------------------------------------------------*/
 
BEGIN_MESSAGE_MAP(CSuperObjDlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_WM_COPYDATA()
END_MESSAGE_MAP()
 
BOOL CSuperObjDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pcds) 
{
    if (pcds->dwData == 1)
    {
        LPCTSTR Str = (LPCTSTR)(pcds->lpData);
        /*----------------------------------------------------------------------------
            Данные получены, обработка...
        ----------------------------------------------------------------------------*/
    }
    return CDialog::OnCopyData(pWnd, pcds);
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2014, 00:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как передать параметр в командную строку через Delphi?
Есть куча параметров, набирать их лен Команды Run compmgmt.msc clipbrd.exe cleanmgr.exe ...

Как передать параметр из поля формы в командную строку?
С помощью ASPSMARTUPLOAD гружу файл в базу, т.е есть страничка с формой form.asp и ее action - файл...

Как получить и передать параметры из другой программы (через командную строку)?
Как получить и передать параметры из другой программы (через командную строку)

JS: Передать параметр в командную строку
На предприятии есть программа для управления компьютерами - лаунчер, в него попросили добавить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.