2017-01-10 6 views
0

Когда я пытаюсь запустить свой код, выписанный в C++ на визуальной студии, ShellExecute не показывает мне ipconfig, а также не запускает хром , У меня нет никаких предупреждений или ошибок. Проблема в том, что cmd вызван ShallExecute, он запускается, но он останавливается немедленно, у меня была такая же проблема с VS, но я добавил заголовок stdafx.h. Также Chrome не запускается. Я пишу тот же код в файле, и я запускаю его, скомпилированный g ++, на mingw, и он работает. Так что это код на визуальной студии:ShellExecute в C++ на VSE (предприятие Visual Studio) 2015 не работает

VS ПРОЕКТЕ

#include "stdafx.h" 
#include <iostream> 
#include <windows.h> 
#include <shellapi.h> 
#include <string> 

#include <stdlib.h> 
#ifdef _WIN32 
#define WINPAUSE system("pause") 
#endif 

using namespace std; 

int main() { 
    cout << "Hello World!" << endl; 
    for (int i = 0; i<10; i++) { 
     if (i % 2 == 0) 
      cout << "\t" << i << "\t dispari!" << endl; 
     else 
      cout << "\t" << i << "\t dispari!!!" << endl; 
    } 
    ShellExecute(NULL, _T("open"), _T("cmd"), _T(" /C ipconfig"), _T(" C:\ "), SW_SHOW); 
    cout << "\nLancio google.com" << endl; 
    string google = "https://www.google.it/search?as_q="; 
    string ricerca = ""; 
    cout << "Inserisci la tua ricerca su google :" << endl; 
    getline(cin, ricerca); 
    google += ricerca; 
    ShellExecute(0, 0,(LPCWSTR)google.c_str(), 0, 0, SW_SHOW); 
    cout << "Tutto andato a buon fine" << endl; 
    return 0; 
} 

Это код на файл (я не добавить часть Ipconfig)

first.cpp

#include <iostream> 
#include <windows.h> 
#include <shellapi.h> 
#include <string> 

#include <stdlib.h> 


using namespace std; 

int main() { 
    cout << "Hello World!" << endl; 
    for (int i = 0; i<10; i++) { 
     if (i % 2 == 0) 
      cout << "\t" << i << "\t dispari!" << endl; 
     else 
      cout << "\t" << i << "\t dispari!!!" << endl; 
    } 

    cout << "\nLancio google.com" << endl; 
    string google = "https://www.google.it/search?as_q="; 
    string ricerca = ""; 
    cout << "Inserisci la tua ricerca su google :" << endl; 
    getline(cin, ricerca); 
    google += ricerca; 
    ShellExecute(0, 0,(LPCSTR)google.c_str(), 0, 0, SW_SHOW); 
    cout << "Tutto andato a buon fine" << endl; 
    return 0; 
} 

По любым вопросам или нечеткой концепции спросите меня.

UPDATE: Вот решение, кажется, работает

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include <windows.h> 

using namespace std; 

int main() { 
    cout << "Hello World!" << endl; 
    ShellExecute(0, 0, L"cmd.exe", L"/k help", 0, SW_SHOW); 
    cout << "\nLancio google.com" << endl; 
    wstring google = L"https://www.google.it/search?as_q="; 
    wstring ricerca = L""; 
    cout << "Inserisci la tua ricerca su google :" << endl; 
    wcin >> ricerca; 
    google += ricerca; 
    LPCWSTR googlata = google.c_str(); 
    ShellExecute(NULL , L"open", L"chrome.exe", googlata, 0, SW_SHOWDEFAULT); 
    return 0; 
    system("pause"); 
} 
+0

Для ShellExecute в [MSDN] [1] есть замечание о необходимости использования CoInitializeEx. Может быть, это поможет? [1]: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx –

ответ

1

Ну есть несколько вопросов.

Во-первых, в Windows Vista и Windows 7 ipconfig требуется повышение привилегий. Для этого с помощью ShellExecute вы можете использовать глагол runas. Затем, если UAC, User Access Control, включен, вы получите глупый предупреждающий ящик с просьбой подтвердить, что вы действительно хотите запустить опасную программу ipconfig.

То есть, если вы запустите его напрямую, а не через cmd, так как ваш текущий код без проблем пытается.

Но, в-третьих, результатом запуска консольной программы является, как правило, консольное окно, которое появляется и исчезает, когда заканчивается консольная программа. И для этого с помощью cmd можно выполнить эту работу. Просто используйте опцию /k для cmd, которая сообщает об этом . после выполнения указанной команды.

В-четвертых, в этом коде есть много файлов Microsoft _T. Он устарел с 2000 года. Для современных Windows просто используют широкие символьные строки, например. L"Hello!".

В-пятых, литая C в

(LPCWSTR)google.c_str() 

Никогда не делать этого.

Вы говорите компилятору, чтобы он заткнулся, потому что, вы говорите, вы знаете лучше. Но вы абсолютно этого не делаете. google - это простой std::string, и вы используете отличную строку символов, wchar_t const*. Это никогда не сработает.

Опять же, в современных Windows просто используйте текст с широким символом. Это означает, что широкие литералы, такие как L"Hello!", и широкие строки, такие как wstring.Определите макрокоманду UNICODE перед включением <windows.h> (по-видимому, он определен в вашем проекте VS, так как вызов с литой в нем компилируется, но все же).


В других новостях, а не о правильности этого кодекса, а просто совет:

  • Для Windows, конкретной программы #ifdef _WIN32 не имеет смысла: _WIN32 всегда определяется, и в 64- бит Windows. Поэтому вы можете это упростить.

  • Заголовок "stdafx.h" является условным обозначением, используемым Visual Studio для предварительно скомпилированного заголовка. Предварительно скомпилированные заголовки Visual C++ изменяют семантику предварительной обработки, в частности, что этот заголовок должен быть включен в первую очередь в каждую блок переводов, что вызвало много новичков. Я настоятельно рекомендую вам просто отключить предварительно скомпилированные заголовки в настройках проекта и удалить include (в гораздо более крупном проекте может оказаться целесообразным проверить, сократили ли предварительно скомпилированные заголовки время сборки, чтобы принять наказание за нестандартные правила).

  • Вместо объявления переменных, которые были изменены, вы можете часто объявлять const -ants, которые объединены в выражениях. Это упрощает понимание или подтверждение кода, потому что это меньше, чем может измениться. Просто посыпать const щедро, почти везде, где сможете.

+0

Отлично, я сделал это, пожалуйста, также проверьте, действительно ли решение. – Teshtek