Recently, a program needs to be developed from C ++ to start a C # program and pass parameters.
The specific method is: Call CreateProcess () on the C ++ side to start the C # side and pass relevant parameters. On the C # side, use main (string [] ARGs) to receive command line parameters.
C ++Sending code:
Int main (INT argc, char * argv [])
{
Char * filename = "C: \ csharp.exe ";
Char * Params = "parameter 1 parameter 2 parameter 3"; // pass three parameters
Process_information PII;
Startupinfo ⅱ;
Memset (& ⅱ, 0, sizeof (ⅱ ));
Ii. cb = sizeof (II );
Ii. wshowwindow = sw_show;
Ii. dwflags = startf_useshowwindow;
CreateProcess (filename, Params, null, false, null, & ⅱ, & PII );
Return 0;
}
C #Acceptor code:
Static void main (string [] ARGs)
{
String MSG = "";
If (ARGs. length> 0)
{
Console. writeline ("parameter quantity:" + args. Length );
For (INT I = 0; I <args. length; I ++)
{
MSG = ARGs [I];
Console. writeline ("parameter" + I + ":" + MSG );
}
}
Else
{
Console. writeline ("command line parameters not obtained ");
}
Console. readkey ();
}
The result is as follows:
If you change Params in C ++:
Char * Params = ""; // pass 0 Parameters
Or
Char * Params = "parameter 1"; // pass 1 parameter
If you change Params in C ++:
Char * Params = "parameter 1 parameter 2"; // pass two parameters
Analysis: The parameter received on the CSHARP side is one fewer than the parameter sent by the VC side, that is, the first parameter sent by the VC side is not received on the CSHARP side.
I think it is interesting to see this result. I think what will happen if I send the result from the VC client in CSHARP?
CSHARP Sender:
PROCESS p = new process ();
P. startinfo. filename = "C: \ vc.exe"; // program name
P. startinfo. Arguments = "parameter 1 parameter 2 parameter 3"; // program execution Parameter
P. Start (); // start
C ++ receiving end:
Int main (INT argc, char * argv [])
{
If (argc> 0)
{
Cout <"the number of parameters is" <argc <Endl;
For (INT I = 0; I <argc; I ++)
{
Char * MSG = argv [I];
Cout <"parameter" <I <":" <MSG <Endl;
}
}
Else
Cout <"command line parameters not obtained" <Endl;
Char II;
Cin> II;
Return 0;
}
Execution result:
Analysis: only three parameters "parameter 1 parameter 2 parameter 3" are clearly sent on the CSHARP side, but four parameters are received on the C ++ receiving end, the first parameter is the name of the VC program.
The reason is that the main (INT argc, char * argv []) entry function of C/C ++ differs from main (string [] argv) of C # entry function. C/C ++ receives the program name as the first parameter, but C # does not. As follows:
VC end:
Int main (INT argc, char * argv [])
{
If (argc> 0)
{
Cout <"the number of parameters is" <argc <Endl;
For (INT I = 0; I <argc; I ++)
{
Char * MSG = argv [I];
Cout <"parameter" <I <":" <MSG <Endl;
}
}
Else
Cout <"command line parameters not obtained" <Endl;
Return 0;
}
Run: C: \ vc.exe 1 2 3
Result:
Analysis: In the command line, there are four parameters: "C: \ vc.exe", "1", "2", and "3". The first "C: \ vc.exe" is the program name, the other three "1", "2", and "3" are the real parameters, but the four parameters are received and displayed, c ++ regards the program name as the first argument of the command line.
CSHARP end:
Static void main (string [] ARGs)
{
String MSG = "";
If (ARGs. length> 0)
{
Console. writeline ("parameter quantity:" + args. Length );
For (INT I = 0; I <args. length; I ++)
{
MSG = ARGs [I];
Console. writeline ("parameter" + I + ":" + MSG );
}
}
Else
{
Console. writeline ("command line parameters not obtained ");
}
Console. readkey ();
}
Run: C: \ csharp.exe 1 2 3
Result:
Analysis: There are four parameters in the command line: "C: \ csharp.exe" "1" "2" "3", and the first "C: \ csharp.exe" is the program name, the other three are the real parameters. However, the program name is not displayed in the running result, which is visible. Unlike C ++, the program name is not considered as the first real argument of the command line in C.
Therefore, when passing command line parameters from C/C ++ to C #, you must add a useless parameter before these parameters. For example, if the parameter to be accepted by C # is "1 2 3", the command line parameter in C/C ++ is "*** 1 2 3 ". On the contrary, when C # transmits command line parameters to C/C ++, the parameters received by C/C ++ should be counted from the second one, because the first parameter is the program name.