求助C++大佬写个简单功能
本帖最后由 朱朱你堕落了 于 2024-9-13 15:59 编辑请用C++实现以下功能,
比方写个A.exe,输出一个hello world吧,是个控制台程序就行,直接双击A.exe是没有输出的,或是运行不起来的,给他加个参数xyz吧
再写个B.exe,B.exe来调用A.exe,必须用参数abc方式才能启动A.exe,正常打印hello world出来,B直接启动A.exe,不加参数的话,无反应,
即启动不起来。
请提供一下这个demo的C++源码,谢谢。
可能我没说清楚,B.exe请使用标准API CreateProcess启动A.exe 本帖最后由 42328669425 于 2024-9-13 16:08 编辑
参考一下
我们将创建两个程序:A.exe 和 B.exe。
1. A.exe:当接收到参数xyz时,输出 "Hello World"。
2. B.exe:调用 A.exe 并传递参数xyz 。
以下是C++源码:
A.cpp
#include <iostream>
#include <string>
int main(int argc, char* argv[]) {
if (argc == 2 && std::string(argv) == "xyz") {
std::cout << "Hello World" << std::endl;
} else {
return 1; // 非预期参数或无参数时,返回非零值
}
return 0;
}
B.cpp
#include <iostream>
#include <cstdlib>
int main() {
char command;
std::sprintf(command, "A.exe xyz");
int result = system(command);
if (result != 0) {
std::cout << "A.exe did not run successfully." << std::endl;
}
return 0;
}
编译和运行步骤
1. 将上述代码分别保存为A.cpp和B.cpp 。
2. 使用C++编译器(如g++)编译这两个文件:g++ A.cpp -o A.exe
g++ B.cpp -o B.exe
3. 运行B.exe :./B.exe
说明
A.cpp检查命令行参数,如果参数为xyz ,则输出 "Hello World",否则返回非零值。
B.cpp使用system函数调用A.exe并传递参数xyz 。如果A.exe运行成功并返回零值,则表示 "Hello World" 已输出。
A.exe
#include <iostream>
#include <string>
int main(int argc, char* argv[]) {
if (argc != 2 || std::string(argv) != "xyz") {
std::cerr << "Usage: A.exe xyz" << std::endl;
return 1;
}
std::cout << "hello world" << std::endl;
return 0;
}
B.exe
#include <iostream>
#include <cstdlib>
#include <string>
int main(int argc, char* argv[]) {
if (argc != 2 || std::string(argv) != "abc") {
std::cerr << "Usage: B.exe abc" << std::endl;
return 1;
}
// 调用A.exe并传递参数xyz
std::string command = "A.exe xyz";
int result = std::system(command.c_str());
if (result != 0) {
std::cerr << "Failed to run A.exe" << std::endl;
return 1;
}
return 0;
}
// CMakeProject1.cpp: 定义应用程序的入口点。
//
#include "CMakeProject1.h"
using namespace std;
int main(int argc, char* argv[])
{
if (std::string(argv) == "abc") {
std::cout << "Hello World" << std::endl;
}
return 0;
}
我用VS2022给你试了一下。 #include <stdio.h>
#include <conio.h>
int main(int argc, char *argv[]){
system("afile.exe xyz");
getch();
}
#include <iostream.h>
#include <string>
#include <conio.h>
using namespace std;
int main(int argc, char *argv[]){
if(argc>1){
if(string(argv)=="xyz"){
puts("hello world.");
}
}
getch();
}
A.cpp
#include <iostream>
#include <cstring>
int main(int argc, char* argv[]) {
// 检查参数是否正确
if (argc == 2 && std::strcmp(argv, "xyz") == 0) {
std::cout << "Hello, World!" << std::endl;
}
return 0;
}
B.cpp
#include <windows.h>
#include <iostream>
int main() {
// A.exe的路径,可以根据实际情况修改
const char* aExePath = "A.exe";
const char* aExeCmd = "A.exe xyz";
// 启动信息
STARTUPINFO si;
PROCESS_INFORMATION pi;
// 初始化
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// 使用CreateProcess启动A.exe并传递参数
if (!CreateProcess(NULL, // No module name (use command line)
(LPSTR)aExeCmd, // Command line with parameters
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
std::cerr << "CreateProcess failed (" << GetLastError() << ")." << std::endl;
return 1;
}
// 等待A.exe运行结束
WaitForSingleObject(pi.hProcess, INFINITE);
// 关闭句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
A.exe (A.cpp):
#include <iostream>
int main(int argc, char* argv[]) {
if (argc > 1 && strcmp(argv, "xyz") == 0) { // 检查参数是否为 "xyz"
std::cout << "Hello, world!" << std::endl;
} else {
// 参数不正确,什么也不做
}
return 0;
}
B.exe (B.cpp):
#include <windows.h>
#include <stdio.h>
#include <string>
int main() {
std::string commandLine = "A.exe xyz"; // 设置 A.exe 的命令行参数
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (CreateProcess(NULL, const_cast<char*>(commandLine.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
// A.exe 启动成功,等待子进程结束
WaitForSingleObject(pi.hProcess, INFINITE);
} else {
printf("启动A.exe失败!\n"); // 启动失败提示
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
} 编译器:Visual Studio 2022
源码:A程序
B程序
执行结果:将生成的 a.exe 和 b.exe 放到同一个文件夹中
简单功能用kimi吧 本帖最后由 Eaglecad 于 2024-9-13 17:44 编辑
A.cpp,这块代码基本上大同小异,区别不大,都需要使用main的第一个参数 其代表参数个数及第二个指针数组参数,其代表多少个对应的参数
#include <iostream>
#include <cstring>
int main(int argc, char* argv[]) {
// 检查参数是否正确
if (argc == 2 && std::strcmp(argv, "xyz") == 0) {
std::cout << "Hello, World!" << std::endl;
}else{
return -1;
}
return 0;
}
B.cpp,主要需要关注创建进程的参数,第一个参数可传入EXE,第二个参数可传入它对应的参数
#include <windows.h>
#include <iostream>
int main() {
// A.exe的路径,可以根据实际情况修改,两个EXE不同目录,建议使用绝对路径
char szExe[] = "A.exe";//EXE
char szPara[] = "xyz";//参数
// 启动信息
STARTUPINFO si;
//进程信息
PROCESS_INFORMATION pi;
// 初始化
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// 使用CreateProcess启动A.exe并传递参数,第一个参数为EXE路径,第二个参数为命令行参数,第三个参数为进程属性,第四个参数为线程属性,第五个参数为是否继承父进程句柄,第六个参数为创建标识,0为默认参数,可修改为CREATE_NEW_CONSOLE,以新终端显示输出,第七个是环境变量,第八个是工作路径,第九个是启动信息,第十个是进程信息
if (!CreateProcess(szExe, szPara,NULL, NULL,FALSE, 0,NULL, NULL, &si,&pi)){
std::cerr << "CreateProcess failed, code : " << GetLastError() << std::endl;
return -1;
}
// 等待A.exe运行结束
WaitForSingleObject(pi.hProcess, INFINITE);
// 关闭句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
分别编译两个程序,再使用B.exe调用A.exe即可。
当然,也可以把B.cpp的main参数解析下,使用命令行,输入B.exe xyz即可调用A.exe,输入其他则不调用
#include <windows.h>
#include <iostream>
int main(int argc, char* argv[]) {
// A.exe的路径,可以根据实际情况修改,两个EXE不同目录,建议使用绝对路径
char szExe = "A.exe";//EXE
char szPara = "xyz";//默认参数 可设置为空字符串,不是NULL
// 检查参数是否正确
if (argc >= 2) {
strncpy(szPara, argv,256);
}
// 启动信息
STARTUPINFO si;
//进程信息
PROCESS_INFORMATION pi;
// 初始化
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// 使用CreateProcess启动A.exe并传递参数,第一个参数为EXE路径,第二个参数为命令行参数,第三个参数为进程属性,第四个参数为线程属性,第五个参数为是否继承父进程句柄,第六个参数为创建标识,0为默认参数,可修改为CREATE_NEW_CONSOLE,以新终端显示输出,第七个是环境变量,第八个是工作路径,第九个是启动信息,第十个是进程信息
if (!CreateProcess(szExe, szPara,NULL, NULL,FALSE, 0,NULL, NULL, &si,&pi)){
std::cerr << "CreateProcess failed, code : " << GetLastError() << std::endl;
return -1;
}
// 等待A.exe运行结束
WaitForSingleObject(pi.hProcess, INFINITE);
// 关闭句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
页:
[1]
2