2

我希望我的其他 c++ 程序从另一个文件运行,所以我使用 shell 执行。亩代码是:

#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 它给出的错误如下:警告C4129:'s':无法识别的字符转义序列警告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);

如果您确实想检查从返回时的错误ShellExecute,那么ShellExecute调用的函数是错误的。它的错误处理特别弱。改为使用ShellExecuteExShellExecuteRaymond Chen在Why does ShellExecute return SE_ERR_ACCESSDENIED for几乎所有事情中讨论了错误处理?

于 2013-03-11T15:50:58.383 回答