я хочу, чтобы моя другая программа на C ++ запускалась из другого файла, поэтому я использую shell execute. Му код:
#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");
}
Но у меня возникла проблема, как ожидалось спецификатор типа с «открытым», и я не могу определить путь с помощью 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’: escape-последовательность нераспознанного символа
В вашем коде у вас есть:
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 ++ как escape-символ. Так что вам нужно избежать этого:
s.run("C:\\Users\\saira\\...\\phase_1_solver.exe");
Если вы не собираетесь проверять возвращаемое значение, вы можете просто написать:
ShellExecute(0, NULL, szPath, NULL, NULL, SW_SHOW);
Если вы хотите проверить на наличие ошибок по возвращении из ShellExecute
, затем ShellExecute
плохая функция для вызова. Его обработка ошибок особенно слаба. использование ShellExecuteEx
вместо. Раймонд Чен обсуждает обработку ошибок ShellExecute
в Почему ShellExecute возвращает SE_ERR_ACCESSDENIED почти для всего?
Других решений пока нет …