吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 909|回复: 11
收起左侧

[求助] 求助C++大佬写个简单功能

[复制链接]
朱朱你堕落了 发表于 2024-9-13 15:47
200吾爱币
本帖最后由 朱朱你堕落了 于 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

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
Jx29 + 1 + 1 巧了,前些天正好用易语言完成了这个功能
42328669425 + 1 + 1 好的,新加了规定吗,有没有链接,看下,才消除违规,避免一下

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
[C++] 纯文本查看 复制代码
#include <iostream>
#include <string>

int main(int argc, char* argv[]) {
    if (argc == 2 && std::string(argv[1]) == "xyz") {
        std::cout << "Hello World" << std::endl;
    } else {
        return 1; // 非预期参数或无参数时,返回非零值
    }
    return 0;
}

B.cpp
[C++] 纯文本查看 复制代码
#include <iostream>
#include <cstdlib>

int main() {
    char command[256];
    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" 已输出。

免费评分

参与人数 1热心值 +1 收起 理由
朱朱你堕落了 + 1 兄弟,论坛禁止使用GPT回复,可以参考,但不能照搬过来。

查看全部评分

Csir0103 发表于 2024-9-13 15:57
A.exe
#include <iostream>
#include <string>

int main(int argc, char* argv[]) {
    if (argc != 2 || std::string(argv[1]) != "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[1]) != "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
[C++] 纯文本查看 复制代码
// CMakeProject1.cpp: 定义应用程序的入口点。
//

#include "CMakeProject1.h"

using namespace std;

int main(int argc, char* argv[])
{
    if (std::string(argv[1]) == "abc") {
        std::cout << "Hello World" << std::endl;
    }
    return 0;
}


我用VS2022给你试了一下。
JuncoJet 发表于 2024-9-13 16:19
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <conio.h>
int main(int argc, char *argv[]){
	system("afile.exe xyz");
	getch();
}


[C++] 纯文本查看 复制代码
#include <iostream.h>
#include <string>
#include <conio.h>
using namespace std;
int main(int argc, char *argv[]){
	if(argc>1){
		if(string(argv[1])=="xyz"){
			puts("hello world.");
		}
	}
	getch();
}

HappyCrazy 发表于 2024-9-13 16:28
A.cpp
[C++] 纯文本查看 复制代码
#include <iostream>
#include <cstring>

int main(int argc, char* argv[]) {
    // 检查参数是否正确
    if (argc == 2 && std::strcmp(argv[1], "xyz") == 0) {
        std::cout << "Hello, World!" << std::endl;
    }
    return 0;
}


B.cpp
[C++] 纯文本查看 复制代码
#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
[C++] 纯文本查看 复制代码
A.exe (A.cpp):

#include <iostream>

int main(int argc, char* argv[]) {
    if (argc > 1 && strcmp(argv[1], "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 放到同一个文件夹中
结果.jpg
B.jpg
A.jpg
小小超 发表于 2024-9-13 17:06
简单功能用kimi吧
Eaglecad 发表于 2024-9-13 17:40
本帖最后由 Eaglecad 于 2024-9-13 17:44 编辑

[C++] 纯文本查看 复制代码
A.cpp,这块代码基本上大同小异,区别不大,都需要使用main的第一个参数 其代表参数个数及第二个指针数组参数,其代表多少个对应的参数
#include <iostream>
#include <cstring>
 
int main(int argc, char* argv[]) {
    // 检查参数是否正确
    if (argc == 2 && std::strcmp(argv[1], "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[5] = "A.exe";//EXE
   char szPara[256] = "xyz";//默认参数 可设置为空字符串,不是NULL
    // 检查参数是否正确
    if (argc >= 2) {
        strncpy(szPara, argv[1],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;
}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 19:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表