2017-01-10 4 views
0

Visual StudioでC++で書かれたコードを実行しようとしているとき、ShellExecuteはipconfigを表示せず、chromeも起動しません。私は警告もエラーもありません。ShallExecuteによって呼び出されたcmdに関する問題は始まりますが、immediatlyで止まりますが、VSと同じ問題がありましたが、stdafx.hヘッダーを追加しました。私はファイルに同じコードを書いて、それをg ++でコンパイルして実行し、mingwで動作します。だから、これは、Visual Studioのコードです:これは、ファイル上のコード(私はIPCONFIGの一部を追加いけないが)であるVSE(ビジュアルスタジオエンタープライズ)のC++でShellExecuteが動作しない

#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; 
} 

VSプロジェクトは

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

[MSDN] [1]のShellExecuteには、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経由ではなく、現在のコードが不必要に試行されるためです。

しかし、第3に、コンソールプログラムを直接実行した結果は、通常、コンソールプログラムが終了するとポップアップして消えるコンソールウィンドウです。そして、このためにはcmdが仕事をすることができます。 /kオプションをcmdに使用すると、指定されたコマンドを実行した後にに保たれます。と表示されます。

第4に、このコードにMicrosoft _Tというものがたくさんあります。それは2000年以来時代遅れになっています。現代のWindowsでは、ワイド文字列を使用します。 L"Hello!"

第五に、

(LPCWSTR)google.c_str() 

におけるCのキャストはことを行うことはありません。

コンパイラにシャットダウンするように指示しているのは、あなたがよく知っているからです。しかし、あなたは絶対にしません。 googleはシンプルでstd::stringで、ワイド文字列には、wchar_t const*をキャストしています。それは決してうまくいかないでしょう。

また、現代のWindowsではワイド文字のテキストを使用します。つまり、L"Hello!"のような幅広いリテラルと、wstringのようなワイド文字列を意味します。マクロシンボルUNICODEを定義してから<windows.h>を含むようにしてください(これは、VSプロジェクトで定義されているようですが、それはキャスト付きの呼び出しがコンパイルされているためです)。

他のニュースではなく、コードの正確性について

が、ちょうどアドバイス:

  • 意味をなさない#ifdef _WIN32 Windows固有のプログラムの場合:_WIN32は常に定義され、またに64 bit Windows。だからあなたはそれを単純化することができます。

  • "stdafx.h"ヘッダーは、Visual Studioでプリコンパイル済みヘッダーとして使用される規則です。 Visual C++のプリコンパイルされたヘッダーは、プリプロセスのセマンティクスを変更します。特に、多数の初心者を抱えていたすべての翻訳単位でヘッダーを最初に組み込む必要があります。インクルードを削除するだけで、プロジェクトの設定でプリコンパイル済みヘッダーを無効にすることを強くお勧めします(プリコンパイルされたヘッダーが非標準ルールのペナルティを受けるのに十分なビルド時間を短縮するかどうかチェックする価値があります)。

  • 変更された変数を宣言する代わりに、式で組み合わせたconstをよく宣言できます。これにより、コードを理解したり、コードを証明したりすることが容易になります。あなたはできるだけ早く寛大にconstを振りかけるだけです。

+0

パーフェクト、私はそれをしました。溶液。 – Teshtek

関連する問題