我知道下面的代码曾经是 C 语言,但是,我在 Visual Studio 2008 中将其编写为 C++ 程序,并且运行良好(保存为 C++)。 但是,该程序是 C 代码,对吗? (或者是吗?)。
因此,当我尝试在 Visual Studio 中将其编译为 C 时(转到 -> 文件属性 -> c/c++ -> 高级 -> 编译为 -> 将其更改为“编译为 C 代码”),然后我得到了很多错误,主要是它无法识别 LPSTR 类型。 所以,我想我的问题是:它是C还是C++代码如果是C,为什么当我将其更改为编译C代码时它不起作用?
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <strsafe.h>
#include <direct.h>
#include <string.h>
#include <conio.h>
int main(VOID)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
//allocate memory
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
//create child process
if (!CreateProcess(NULL,
L"C:\\Windows\\Notepad.exe",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi))
{
fprintf(stderr, "create process failed");
return -1;
}
//parent waits for child to complete
WaitForSingleObject(pi.hProcess, INFINITE);
printf("Child Complete");
//close handle
CloseHandle(pi.hProcess);
CloseHandle(pi.hthread);
}
它可以像 C 一样干净地编译。唯一的错误是由 CloseHandle(pi.hthread)
触发的,因为它不是
PROCESS_INFORMATION
的成员。您正在寻找
hThread
(大写 T)。
conio.h
不是标准 C 的一部分,因此您可能需要避免这种情况。
LPSTR
是在 windows.h 中定义的,既然你已经包含它,它不应该给出任何错误。它是类型定义的:
typedef char* PSTR, *LPSTR;
对于代码中的其他 typedef 变量,您必须检查它们的标头是否正确。尝试包括
Winbase.h
如果是C,那么它就不是那么好的一个,对于C++来说也不是那么好的一个。两种语言都有自己的初始化变量的方法,但您的代码没有使用它们。特别是在 C 中(以及 C++ 中的 POD),有用于初始化变量的初始化器。假设这里两个丑陋的宏都扩展到类型:
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
如果你有一个兼容 C99 的编译器,第一个就更好了
STARTUPINFO si = { .cb = sizeof si };
如果由于某种原因您需要一个函数将整个内存块清零,最好使用标准函数
memset
。但是,如果您在 C 中使用正确的初始值设定项(或 C++ 中的构造函数),您应该很少需要明确地这样做。