【问题标题】:how to pass variable argument to exe?如何将变量参数传递给exe?
【发布时间】:2011-07-23 06:50:33
【问题描述】:

好的,假设我有 b.exe,它接受一个字符串参数。 我想在 a.cpp 中调用 b.exe,使用 system:

    string s1 = "hallo";
    system("b.exe s1");
    printf("s1 after invoke = %s",s1);

这是 b.cpp 中的代码:

    int main(string s)
    {
         s = "hello world";
         return 0; 
    }

我想要的是,当我运行 a.exe 时,输出将是:

    s1 after invoke = hello world

可以这样做吗?基本上,我只想将变量传递给 exe,但它必须是通过引用,而不仅仅是通过值,因为我希望在我调用的 exe 中处理和修改该变量。我已经在互联网上搜索了解决方案,但它只为我提供了将变量按值传递给 exe 的方法,而不是通过引用传递..

任何建议都将不胜感激,但如果可能,我希望以上述更正代码和包含文件的形式提出建议(如果有)。谢谢你的帮助:)

【问题讨论】:

  • 进程间通信的经典问题!一个简单的解决方案是在两个进程之间共享内存。如果您使用的是 Linux,请搜索 mmap() 并查看示例程序。 :-)

标签: c++ visual-studio-2008 pass-by-reference exe invoke


【解决方案1】:

无法在不同进程之间修改命令行参数。 s1 只有 A.CPP 知道,s 只有 B.CPP 知道。

【讨论】:

    【解决方案2】:

    大家好,我知道这是一篇旧帖子,但每一点都有帮助:)

    使用变量向外部调用的 .exe 发送参数可以很容易地通过使用 .c_str() 附加一个用于系统调用的字符串变量来完成

    读回原始问题后,这家伙似乎想从 .exe 中获取一个变量,这是不可能的,但对于我正在搜索的内容,因为这是返回的第一个 Google 链接,我认为很多其他人将从中受益,所以..

    例子:

    //声明一些变量

    void runapp();
    
    string ip;
    string img;
    string tri = "notepad.exe";
    string loadexe;
    string space =  " "; //Just a simple ascii space used between arguments
    

    //为系统调用编译你的字符串

        ip = argv[1];
        img = argv[2];
    
        loadexe = tri + space + ip + space + img; // compiled string to use for system call
    

    //调用你的.exe

    system(loadexe.c_str());
    

    //下面的完整源代码

    #include<iostream>
    #include<stdio.h>
    #include<string>
    
    using namespace std;
    
    void runapp();
    
    string ip;
    string img;
    string tri = "notepad.exe"; // your .exe to load
    string loadexe;
    string space =  " "; //Just a simple ascii space used between arguments
    
    void main(int argc , char *argv[])
    {   
        ip = argv[1];
        img = argv[2];
    
        loadexe = tri + space + ip + space + img;
    
        }else{
            //bla bla bla
    }
    
    void runapp()
    {
        system(loadexe.c_str());
    }
    

    问候

    字母

    【讨论】:

      【解决方案3】:

      不,这是不可能的。此外, main 不接受字符串作为参数。

      您的字符串 s1 位于保存 a.cpp 的进程的地址空间中。您不能在进程之间通过引用传递项目,这是您在将 s1 传递给运行 b.exe 的进程时试图实现的。当您修复语法错误时会发生以下情况:b.exe 复制字符串的内容,并将它们保存在自己的地址空间中。

      您需要研究进程间通信以实现类似的目标,但没有简单的方法。

      【讨论】:

        【解决方案4】:

        这是不可能的。你能做的最好的就是按值传递字符串。至于字符串,我的意思是 char 数组。

        其实main的官方原型更像

        int main(int argc, char** argv);
        

        如果你想让你的程序用 C++ 编译,你别无选择

        【讨论】:

          【解决方案5】:

          您的main(string) 语法不正确。在 C++ 中main 可以有两个有效的签名:

          int main ();
          int main (int argc, char **argv);
          

          其中argc 包含传递给可执行文件的参数数量,argv 指向这些参数的数组。

          您可以将多个参数传递给b.exe 并以此为基础编写程序。更多信息您可以搜索main()的签名以及它的使用方式。

          【讨论】:

            【解决方案6】:

            一个简单但当然不是最漂亮的解决方案是使用临时文件:

            伪代码: 呼叫 A) 在调用 B) 之前,先完成 A) 中需要的所有操作。 从 A),将变量输出到临时文件。 从 A) 呼叫 B。 从临时文件中导入变量。清除此文件。 做所有你需要做的事情 B) 将变量从 B) 输出到临时文件 出口 B) 从临时文件输入变量到 A) 做标准输出 出口A)

            否则,您需要研究消息传递接口 (M.P.I.),这并不是最简单的解决方案。

            【讨论】:

              【解决方案7】:

              不可能在两个进程之间直接修改变量,但您可以执行类似的操作来获得相同的最终结果。

              最简单的方法可能是使用_popen()。基本思路是这样的:

              • 要将字符串参数从 A 传递到 B,您可以将其作为命令行参数传递。 B 可以从 main() 中的 argv[] 数组中读取。

              • 但是要将信息返回给 B,您需要一些其他技术。 _popen() 在内部使用管道,并为您完成大部分设置工作,因此 A 可以使用 fgets() 或任何其他基于 FILE* 的函数从 B 读回输出。然后 B 可以执行 printf( “你好世界”); “返回”字符串,A 可以从 _popen() 返回的 FILE* 中读取该字符串。

              有关更多详细信息和示例,请参阅MSDN page on _popen()。

              【讨论】:

                猜你喜欢
                • 2015-06-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-01-05
                • 2016-08-19
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多