2

他の C++ プログラムを別のファイルから実行したいので、シェル実行を使用しています。Muコードは:

#pragma comment(lib,"shell32.lib")  
#include "windows.h"
#include<Shellapi.h>

#include<stdio.h>
#include<iostream>
using namespace std;

class spwan{
public:
    //char szPath[] = "";
    void run(char path[]);
};

void spwan::run(char szPath[]){
HINSTANCE ShellExecute(HWND,  "open", szPath,"","",SW_SHOW);    
    cout<<"program executed";
}

int main ()
{
 spwan s;
 s.run("path to the file");
}

しかし、「open」を使用したタイプ指定子が期待されるような問題があり、szPath を使用してパスを定義できません。どんな助けでも。

エラーはより具体的には次のとおりです。行のエラーが表示されます:HINSTANCE ShellExecute(HWND、「open」、szPath、「」、「」、SW_SHOW); 構文エラーとして:「文字列」

私がこのようなパスを与えているとき:- C:\Users\saira\Documents\Visual Studio 2010\Projects\phase_1_solver\Debug\phase_1_solver.exe その与えるエラー: warning C4129: 's' : unrecognized character escape sequence warning C4129: 'D' : 認識されない文字エスケープ シーケンス

4

1 に答える 1

2

あなたのコードには次のものがあります:

HINSTANCE ShellExecute(HWND,  "open", szPath,"","",SW_SHOW);

それは関数の宣言です。あなたは実際に関数を呼び出すつもりだったと思います:

HINSTANCE retval = ShellExecute(HWND,  "open", szPath,"","",SW_SHOW);

さて、それもコンパイルされません。タイプなのでHWND。私はあなたが必要だと思います:

HINSTANCE retval = ShellExecute(0, "open", szPath, NULL, NULL, SW_SHOW);

さらに、実際に動詞を指定する必要はありません。パスのデフォルトの動詞で十分です。

HINSTANCE retval = ShellExecute(0, NULL, szPath, NULL, NULL, SW_SHOW);

そして、次のような文字列を渡しているように聞こえます。

s.run("C:\Users\saira\...\phase_1_solver.exe");

バックスラッシュはC++のエスケープ文字として使用されるため、これは適切ではありません。だからあなたはそれを逃れる必要があります:

s.run("C:\\Users\\saira\\...\\phase_1_solver.exe");

戻り値をテストしない場合は、次のように記述できます。

ShellExecute(0, NULL, szPath, NULL, NULL, SW_SHOW);

からの戻り時にエラーをチェックしたい場合ShellExecuteShellExecute、を呼び出すのは不適切な関数です。そのエラー処理は特に弱いです。ShellExecuteEx代わりに使用してください。Raymond Chenが、ShellExecuteがほぼすべてに対してSE_ERR_ACCESSDENIEDを返す理由のエラー処理について説明してShellExecuteます。

于 2013-03-11T15:50:58.383 に答える