【问题标题】:passing file path as argument in shellexecute在 shellexecute 中将文件路径作为参数传递
【发布时间】:2013-02-26 20:48:13
【问题描述】:

我希望我的其他 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 它给出的错误如下:warning C4129: 's': unrecognized character escape sequence警告 C4129: 'D' : 无法识别的字符转义序列

【问题讨论】:

  • 请告诉我们出了什么问题。编译器错误?运行时失败?并提供确切的信息。此外,它拼写为spawn。无需在此处传递窗口句柄。通过0。也不需要传递动词,传递NULL。另外两个参数也传递NULL 而不是""
  • 这真的归结为如何正确调用函数,如果你不能这样做,我强烈建议不要进入 Windows API。
  • 我想知道的主要是如何使用路径作为参数。
  • 您已经在使用它作为参数。我不明白你为什么不告诉我们出了什么问题?你寻求帮助,但不会透露细节。我的意思是,我猜这个问题是 ShellExecute 实际上是 ShellExecuteW 并且需要宽字符串。但如果你不告诉我们错误,那只是一个疯狂的猜测。
  • 它给了我错误的行:HINSTANCE ShellExecute(HWND, "open", szPath,"","",SW_SHOW);作为语法错误:'string'

标签: c++ shellexecute createprocess


【解决方案1】:

在您的代码中:

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 是一个不好调用的函数。它的错误处理特别弱。请改用ShellExecuteEx。 Raymond Chen在Why does ShellExecute return SE_ERR_ACCESSDENIED for nearly everything?讨论ShellExecute的错误处理

【讨论】:

  • 转义字符序列警告该怎么办
  • 这是什么现在我的意思是我知道存在类型不匹配但我需要为此做什么样的转换。错误 C2664:“ShellExecuteW”:无法将参数 2 从“const char [5]”转换为“LPCWSTR”1> 指向的类型不相关;转换需要 reinterpret_cast、C-style cast 或 function-style cast
  • 解决这个问题的两种方法。要么调用 ShellExecuteA 并坚持使用 ANSI 字符集。实现此目的的其他方法是将项目选项切换到 MBCS。或者您可以使用 Unicode。你想做什么?
  • 好吧,我猜的差不多了。感谢您收听并提供我要求的所有额外信息。干得好!
猜你喜欢
  • 2014-05-15
  • 2020-07-27
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2011-04-20
相关资源
最近更新 更多