我现在遇到的情况是,一个程序在普通运行时可以以GUI方式运行;但也可以接受以参数的方式运行,并且在以参数方式启动时需要返回值,而且需要在CMD中运行时需要在CMD中输出。不知道这如何操作?例如:
1:一个程序Project1.exe中有一个Edit和一个Button,正常使用时就是启动程序,在Edit中填入一个数字,然后点击Button,进行乘2操作得到100。2:在另外一个程序Project2.exe中通过参数启动如ShellExecute(Self.Handle,‘Open’,'\Project1.exe','50',nil,SW_SHOWNORMAL),进行这个操作之后实现的效果就相当于在Edit中填入50,然后点击Button,但是这个时候需要返回值即100,而且Project2.exe需要得到这个返回值.3:如果是通过CMD启动程序,输入“Project1.exe 50”,需要在CMD中输出100.
现在需要的是上面三种清空都需要同时满足,请高手帮忙了。

解决方案 »

  1.   

    在程序启动后判断一下是否有命令行参数,如果有则调用AllocConsole产生一个控制台,然后相应的api处理相关的控制台操作,不在进行窗口部分的操作。
    如果没有参数则,还按照原先的过程来。
      

  2.   

    新建一个VCL工程,然后修改工程文件里面的代码.
    增加命令行参数就是使用控制台,否则使用窗口
    program Project1;uses
      Forms,Windows,
      Unit1 in 'Unit1.pas' {Form1};{$R *.res}var
      str:string ;
      len:DWORD;
    begin
      str := ParamStr( 1 );
      if Length( str ) > 0 then
        begin
          AllocConsole();
          WriteConsole( GetStdHandle(STD_OUTPUT_HANDLE) , PChar(str) , Length(str), len , nil );
        end
      else
        begin
          Application.Initialize;
          Application.CreateForm(TForm1, Form1);
          Application.Run;
        end
    end.
      

  3.   

    好像要动Elf格式???
    这个也有点古老了吧……
    而且似乎不怎么简单
      

  4.   

    没太清楚楼主意思,之前用过传参的一段代码就是这样:procedure TFrmMain.BitBtn1Click(Sender: TObject);
    var
      Parm1,Parm2: string;
    begin
      if trim(copy(self.MaskEdit1.Text,1,3))= '' then
      begin
        MessageBox(Handle,'请先输入收款机IP!','信息提示',MB_ICONWARNING+MB_OK);
        exit;
      end;
      Parm1 := '-i ' + CutBlank(MaskEdit1.EditText) + ' put test1.dat';
      Parm2 := '-i ' + CutBlank(MaskEdit1.EditText) + ' get return1.dat';
      ShellExecute (Handle,'open','TFTP.exe',PChar(Parm1),nil,SW_MINIMIZE);
      sleep(2000);
      ShellExecute (Handle,'open','TFTP.exe',PChar(Parm2),nil,SW_MINIMIZE);
      sleep(1000); 
      if FileComp('test1.dat','return1.dat')= true then
        MessageBox(Handle,'测试成功!','信息提示',MB_ICONINFORMATION + MB_OK)
      else
        MessageBox(Handle,'测试失败!','信息提示',MB_ICONWARNING + MB_OK);
      if fileexists('return1.dat') then
      begin
        FileSetAttr('return1.dat', 0);
        deletefile('return1.dat');
      end;
    end;
      

  5.   

    谢谢各位,我现在的情况的难点是怎么去获得返回值,我原本想使用GetCommandLine,但当使用Project2.exe调用Project1.exe时,不希望显示控制台,而且也不希望使用消息机制,因为Project1.exe和Project2.exe都是多实例的,而且Project2.exe的窗口名称也是不一定的。我现在想的是这三种情况可能同时满足吗?通过Project2.exe调用和直接在CMD中启动的效果要不一样,我觉得这个太奇怪了吧,除非通过特定的参数来表征。
      

  6.   

    可以在Project1.exe时候检查自己的父进程是什么。如果是Project2.exe则不显示控制台
    还能在Project2.exe中创建一个全局互斥体 CreateMutex什么的。子进程就能够判断了。
      

  7.   

    谢谢各位了,我觉得上面几位仁兄提到的技术都能够实现返回值的事,但是可能我在实现时都不会用,因为BOSS说两个Project之间应该松散,不能耦合的太紧。不管怎样谢谢各位了。