- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我收到这些错误,但我到处寻找答案,但没有找到解决方案:
launcher.c:107:12: warning: implicit declaration of function 'putenv'
launcher.c:116:10: warning: passing argument 2 of 'CreateProcessA' makes pointer from integer without a cast
c:\cs30200\mingw32\bin\../lib/gcc/mingw32/4.5.1/../../../../include/winbase.h:1250:24:
note: expected 'LPSTR' but argument is of type 'int'
我的错误在
putenv()
与
CreateProcess()
.我知道
putenv()
返回
int
,但我无法让新的命令提示符显示新的行标题。但是,我也遇到了
getpid()
的问题给我相同的数字开始每个程序。我以前让它工作过,现在我找不到哪里出了问题。
#include <windows.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
void printError(char* functionName);
#define INFO_BUFFER_SIZE 32767
int main(void)
{
int numInput;
int x=1,y=1;
static char *promptCmd = "PROMPT=Speak$sUp:$G";
DWORD dwExitCode = 0;
STARTUPINFO si;
PROCESS_INFORMATION pi;
pid_t pid;
pid = getpid();
STARTUPINFO suNW;
PROCESS_INFORMATION piNW;
suNW.cb = sizeof(suNW);
suNW.lpReserved = NULL;
suNW.dwFlags = 0;
suNW.cbReserved2 = 0;
suNW.lpReserved2 = NULL;
suNW.lpDesktop = NULL;
suNW.lpTitle = "What is your command?";
suNW.dwX = x;
suNW.dwY = y;
suNW.dwXSize = CW_USEDEFAULT;
suNW.dwYSize = CW_USEDEFAULT;
suNW.dwFillAttribute = FOREGROUND_INTENSITY| FOREGROUND_GREEN|FOREGROUND_RED|BACKGROUND_RED;
suNW.dwFlags = STARTF_USEPOSITION|STARTF_USEFILLATTRIBUTE;
suNW.wShowWindow = TRUE;
suNW.hStdInput = NULL;
suNW.hStdOutput = NULL;
suNW.hStdError = NULL;
HANDLE hProc;
hProc = pi.hProcess;
GetStartupInfo(&si);
const size_t full_size=256;
TCHAR sysLoc[INFO_BUFFER_SIZE],lpCommandLine[5][INFO_BUFFER_SIZE];
char * progLoc;
GetSystemDirectory(sysLoc, INFO_BUFFER_SIZE); //Get location of System32 folder
progLoc = getenv("ProgramFiles(x86)"); //Get location of Program Files folder x64
if (progLoc==NULL) progLoc = getenv("ProgramFiles"); //If running x86 get location of Program Files folder
snprintf(lpCommandLine[1],full_size,"%s\\notepad.exe",sysLoc);
snprintf(lpCommandLine[2],full_size,"%s\\cmd.exe",sysLoc);
snprintf(lpCommandLine[3],full_size,"%s\\nslookup.exe",sysLoc);
snprintf(lpCommandLine[4],full_size,"%s\\charmap.exe",sysLoc);
snprintf(lpCommandLine[5],full_size,"%s\\Windows NT\\Accessories\\wordpad.exe",progLoc);
runProgram:
printf("Which program would you like to run:\n");
printf("0: Quit\n");
printf("1: Run Notepad\n");
printf("*2: Run cmd shell\n");
printf("#3: Run NS LooKUp\n");
printf("4: Run Character Map\n");
printf("5: Run WordPad\n");
printf("Enter your choice now: ");
scanf("%d", &numInput);
switch(numInput)
{
case 0:
exit(0);
case 1:
if(TRUE==CreateProcessA(NULL,lpCommandLine[1], NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
printf("Started program 1 with pid = %i",getpid());//pid);
}
else printError(lpCommandLine[1]);
printf("\n\n");
goto runProgram;
break;
case 2:
if (CreateProcess(
lpCommandLine[2], // LPCTSTR lpApplicationName
promptCmd,//putenv(promptCmd), // LPTSTR lpCommandLine
NULL, // LPSECURITY_ATTRIBUTES lpProcessAttributes
NULL, // LPSECURITY_ATTRIBUTES lpThreadAttributes
FALSE,//TRUE, // BOOL bInheritHandles
CREATE_NEW_CONSOLE, // DWORD dwCreationFlags
NULL, // LPVOID lpEnvironment
NULL, // LPCTSTR lpCurrentDirectory
&suNW, // LPSTARTUPINFO lpStartupInfo
&piNW // LPPROCESS_INFORMATION lpProcessInformation
))
{
printf("Started program 2 with pid = %i \n",getpid());//pid);
printf(" waiting for program 2 to terminate...\n");
WaitForSingleObject(piNW.hProcess,INFINITE);
CloseHandle(piNW.hThread);
GetExitCodeProcess(piNW.hProcess,&dwExitCode);
CloseHandle(piNW.hProcess);
}
else printError(lpCommandLine[2]);
printf(" program 2 exited with a return value %i\n", dwExitCode);
printf("\n\n");
goto runProgram;
break;
case 3:
if(CreateProcessA(NULL, lpCommandLine[3], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){
printf("Started program 3 with pid = %i \n",getpid());//pid);
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
goto runProgram;
}
else printError(lpCommandLine[3]);
printf("\n");
goto runProgram;
break;
case 4:
if(CreateProcessA(NULL,lpCommandLine[4], NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
printf("Started program 4 with pid = %i \n",getpid());//pid);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
else printError(lpCommandLine[4]);
printf("\n\n");
goto runProgram;
break;
case 5:
if(CreateProcessA(NULL,lpCommandLine[5], NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
printf("Started program 5 with pid = %i \n",getpid());//pid);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
else printError(lpCommandLine[5]);
printf("\n\n");
goto runProgram;
break;
}
return 0;
}
/****************************************************************
The following function can be used to print out "meaningful"
error messages. If you call a Win32 function and it returns
with an error condition, then call this function right away and
pass it a string containing the name of the Win32 function that
failed. This function will print out a reasonable text message
explaining the error and then (if chosen) terminate the program.
*/
void printError(char* functionName)
{
LPVOID lpMsgBuf;
int error_no;
error_no = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
error_no,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
fprintf(stderr, "\n%s failed on error %d: ", functionName, error_no);
fprintf(stderr, (char*)lpMsgBuf);
// Free the buffer.
LocalFree( lpMsgBuf );
//ExitProcess(1); // terminate the program
}//printError
最佳答案
getpid
返回 的进程 ID调用 过程。新创建的进程的进程ID通过lpProcessInformation
返回参数,在 dwProcessId
field 。所以不要调用 getpid
更改您的代码如下:
printf("Started program 1 with pid = %i", pi.dwProcessId);
至于
putenv
,它还修改了
的环境调用 过程。在 Windows 上,它也只会更改 CRT 的环境副本,而不是真正的进程环境。要更改流程环境,您应该使用
SetEnvironmentVariable
.子进程环境只要
lpEnvironment
就会继承父进程的环境的
CreateProcess
设置为
NULL
.
PROMPT=...
程序开始时的流程环境:
SetEnvironmentVariableA("PROMPT", "Speak$sUp:$G");
然后让 children 在
CreateProcess
中无所事事地继承它.
关于c - 使用 putenv 和 getpid 在 C 中使用 CreateProcess 获取错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66627850/
我正在使用 Android Studio。我想在 github 上分享我的项目,但我遇到了很多问题。 首先,Android studio找不到git.exe。我可以用某种方式解决那个问题,但现在是下一
今天,我刚刚使用 Android SDK 管理器更新了 Windows 7 上的 Android SDK,并在 Eclipse 中构建期间开始出现错误 "Error executing aapt: C
由于某种原因创建进程打开cmd即使未指定按 Enter 键会导致命令行中弹出更多 cmd 实例。 #include #include void main() { PROCESS_INFOR
这个问题已经有答案了: Unhandled Error with CreateProcess [duplicate] (2 个回答) 已关闭 4 年前。 我的目标是在我的程序中执行外部可执行文件。首先
当使用 CreateProcess 运行另一个程序时,捕获标准输出的推荐方法是什么?也就是说,将第二个程序打印到 stdout 的任何内容,并以第一个程序可以分析它的数组结束? 这两个程序都是用 C
这个问题在这里已经有了答案: Unhandled Error with CreateProcess [duplicate] (2 个答案) 关闭 4 年前。 我的目标是在我的程序中执行一个外部可执行
我的以下代码有问题: int main(int argc, char **argv) { PROCESS_INFORMATION pi; STARTUPINFO si; prin
forking() 和 CreateProcess(带有所有必需的参数)对于 Linux 和 WinXP 是否分别是相同的? 如果它们不同,那么有人可以解释两种情况下发生的情况的差异吗? 谢谢 最佳答
我正在寻找 Delphi 中 CreateProcess 的快速替代方案,以在 exe 中执行某些计算,包括 XML 中的多个返回值。目前,我正在调用带有特定参数的 C#-exe。这些电话之一需要大约
我有我的主应用程序,从我的主应用程序我将调用另一个 模块(第三方)在我的主应用程序中执行一个小操作,当我调用该模块时..它处理特定时间说 5 秒。而它的处理它在命令窗口中显示了一些信息..现在我的主应
我注意到了这种行为: 当前目录下有2个可执行文件,分别名为“somefile”和“somefile.abc”。 CreateProcessA(NULL, "somefile", ...) - 失败,错
C 初学者警告!!! 我正在用 c 编写一个应用程序,该应用程序应该在“cmd.exe”上下文中运行用户定义的命令并将输出写入变量。例如,如果命令变量是“dir C:\”,则 c 程序应使用 Crea
我正在尝试使用 CreateProcess() 启动服务器。这是代码: int APIENTRY WinMain(HINSTANCE hInstance, H
所以我使用这段代码来启动带有参数的控制台应用程序: #include #include using namespace std; void StartProgram(char argv[]) {
我刚刚安装了代码块 我在安装时遇到错误(无法在 gcc gnu 中配置的路径中找到编译器可执行文件) 所以我安装了编译器MinGW出现这个错误 错误: *CreateProcess:没有这样的文件或目
我正在尝试弄清楚如何使用 CreateProcess() 函数,但我不太精通 C++。我已经尝试了一些方法来尝试让错误消失,但应用程序似乎没有按照我期望的方式执行。 我想做的是将“cmd.exe/c
我有一个应用程序,用户可以在其中将文件上传到远程服务器,接收该文件的同一台服务器应该运行该应用程序。我正在使用 CreateProcess 方法。问题是,文件目录已经在 std::字符串中定义,我很难
如果程序A被用户以管理员身份执行,程序A是否可以使用CreateProcess() windows函数以管理员权限启动程序B?提前谢谢你 最佳答案 答案是肯定的。如果启动程序以提升的方式运行,您可以以
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在尝试在 windows 7 上的 windows visual studio 2012 professional 上使用 visual c++ 打开一个程序。代码将顺利运行,但实际上不会打开程序
我是一名优秀的程序员,十分优秀!