朱朱你堕落了 发表于 2024-9-13 15:47

求助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 15:54

本帖最后由 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" 已输出。

Csir0103 发表于 2024-9-13 15:57

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;
}

Dream_Peng 发表于 2024-9-13 15:59

// 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给你试了一下。

JuncoJet 发表于 2024-9-13 16:19

#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();
}

HappyCrazy 发表于 2024-9-13 16:28

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;
}

K091418 发表于 2024-9-13 16:42

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;
}

DeityGlory 发表于 2024-9-13 16:49

编译器:Visual Studio 2022
源码:A程序
B程序
执行结果:将生成的 a.exe 和 b.exe 放到同一个文件夹中

小小超 发表于 2024-9-13 17:06

简单功能用kimi吧

Eaglecad 发表于 2024-9-13 17:40

本帖最后由 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
查看完整版本: 求助C++大佬写个简单功能