createprocess- C语言,怎样实现获取调用其他程序的输入输出?

问题描述

C语言,怎样实现获取调用其他程序的输入输出?

各位,我的目的是获取调用其他程序hello.exe输出的信息。网上查找一下代码,但是实现不了!!

为什么呢?

我选择用LCC-win32为编译器。

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
#include <windows.h>

int main(int argc,char *argv[])
{
SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;

HANDLE outHandle;
outHandle = CreateFile("aa.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,&sa,CREATE_ALWAYS,0,NULL); 

PROCESS_INFORMATION processInfo;
    STARTUPINFO startUpInfo;

memset(&startUpInfo, 0, sizeof(STARTUPINFO));
memset(&processInfo ,0, sizeof(PROCESS_INFORMATION));

startUpInfo.cb = sizeof(STARTUPINFO);
    startUpInfo.dwFlags = STARTF_USESTDHANDLES;
startUpInfo.wShowWindow=SW_SHOWNORMAL;

    startUpInfo.hStdOutput = outHandle;

if(!CreateProcess("hello.exe",NULL, NULL, NULL, FALSE,
        CREATE_NEW_CONSOLE, NULL, NULL,
        &startUpInfo, &processInfo)){

CloseHandle(outHandle);
printf("open hello.exe error");

}else{

DWORD filesize=1000;
char * buffer = malloc(filesize + 1);
memset(buffer, 0, filesize+1);
DWORD readsize;
ReadFile(outHandle,buffer,filesize,&readsize,NULL);
printf("%sn",buffer);
free(buffer); 

WaitForSingleObject(processInfo.hProcess,INFINITE);
printf("open hello.exe ok");

CloseHandle(outHandle); 

CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);

}

return 0;
}
时间: 2025-01-27 00:39:31

createprocess- C语言,怎样实现获取调用其他程序的输入输出?的相关文章

Go语言调用其它程序并获得程序输出的方法_Golang

本文实例讲述了Go语言调用其它程序并获得程序输出的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "exec" // "os/exec" in go1     "fmt" ) func main(){     cmd := exec.Command("ls", "-l")     buf, err := cmd.Output()   

C/C++中手动获取调用堆栈

C/C++中手动获取调用堆栈 当我们的程序core掉之后,如果能获取到core时的函数调用堆栈将非常有利于定位问题.在Windows下可以使用SEH机制:在Linux下通过gdb使用coredump文件即可. 但有时候由于某些错误导致堆栈被破坏,发生拿不到调用堆栈的情况. 一些基础预备知识本文不再详述,可以参考以下文章: 函数调用栈的获取原理分析 寄存器.函数调用与栈帧 需要知道的信息: 函数调用对应的call指令本质上是先压入下一条指令的地址到堆栈,然后跳转到目标函数地址 函数返回指令ret则

C语言内存释放与调用子函数时间变长

问题描述 C语言内存释放与调用子函数时间变长 各位大神,你们好: 小弟最近用C语言编程遇到这样一个问题(代码比较多,就不粘了,见谅): 在子函数A中用malloc申请内存,在调用函数A的B函数中释放申请的内存.重复运行100次函数B,发现:在函数B中若不释放A的申请的内存,每次A运行的时间基本一样,而内存占用量持续上升:若在函数B中释放A申请的内存,占用内存问题解决了,然后每次调用A的时间又持续上升. 完全没有搞明白这是个什么情况,你们怎么看? 解决方案 堆上的内存申请和释放一定要一一对应,用完

c语言-C语言在函数中调用指数组的问题

问题描述 C语言在函数中调用指数组的问题 #include <stdio.h> int i=5; void output_array ( int array[] ){ int a; for ( a=0; a<i; a++ ){ printf ( "%i%s", &array[a], "t" ); //warning: format specifies type 'int' but the argument has type 'int *'

c-C语言中函数数组调用问题

问题描述 C语言中函数数组调用问题 5C 定义的二维数组为全局变量,在主函数中有多个子函数要用到它.请问下大家,子函数中计算的此二维数组的值间能传递么?还是也需要调用呢?~~ 解决方案 可以传引用或者指针,或者定义为全局变量.那就直接用不用传了. 解决方案二: 传递数组地址或指针,C中没有引用 解决方案三: 你用全局变量,每个函数里面都可以改啊. 解决方案四: 全局的直接访问就行了,就是要注意不要把里面的数据乱改,导致读取出问题 解决方案五: 你使用全局变量,每个函数都可以去访问它并且修改它,会

java-JAVA swing 怎么获取调用程序界面中的文本框,并向光标位置填写密码?

问题描述 JAVA swing 怎么获取调用程序界面中的文本框,并向光标位置填写密码? 然后用重定向输出的方法自动填写密码 解决方案 Java有直接可调用密码框方法啊.可以参考下面的代码. import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import ja

如何获取调用类库的程序名称

问题描述 我在类库写了一个函数,不知道该如何获取调用这个类库的程序名称?Application.ProductName这是在winform程序中才能使用 解决方案 解决方案二:System.Reflection.Assembly.GetExecutingAssembly().FullName

go语言通过反射获取和设置结构体字段值的方法_Golang

本文实例讲述了go语言通过反射获取和设置结构体字段值的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: type MyStruct struct {         N int } n := MyStruct{ 1 } // get immutable := reflect.ValueOf(n) val := immutable.FieldByName("N").Int() fmt.Printf("N=%d\n", val) // prints

ASP.NET中实现获取调用方法名_实用技巧

本文实例讲述了ASP.NET中实现获取调用方法名的技巧.分享给大家供大家参考.具体实现方法如下: 在写记录日志功能时,需要记录日志调用方所在的模块名.命名空间名.类名以及方法名,想到使用的是反射(涉及到反射请注意性能),但具体是哪一块儿还不了解,于是搜索,整理如下:   需要添加相应的命名空间: 复制代码 代码如下: using System; using System.Diagnostics; using System.Reflection; 如果仅是获取当前方法名,可以使用如下代码: 复制代