本帖最后由 DEATHTOUCH 于 2024-9-6 17:43 编辑
是这样的,我给你看一下 CreateProcessA 的函数签名:
[C++] 纯文本查看 复制代码 WINBASEAPI
BOOL
WINAPI
CreateProcessA(
_In_opt_ LPCSTR lpApplicationName,
_Inout_opt_ LPSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCSTR lpCurrentDirectory,
_In_ LPSTARTUPINFOA lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation
);
你看第一个和第二个和第八个有什么区别吗?
首先是标注,第一个和第八个都是 _In_opt_ ,表示可选输入参数,类型是 LPCSTR ,定义为 typedef _Null_terminated_ CONST CHAR *LPCSTR, *PCSTR;
看到了吧,是 const char* 类型的。
然后第二个是 _Inout_opt_ 的标注,说明是可选的输入/输出参数,类型则是 LPSTR ,即 typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR;
所以就是普通的 char* 类型。
看这个标注就说明了第二个参数是可变的,按照微软的文档内容 https://learn.microsoft.com/zh-c ... sapi-createprocessa
此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。 因此,此参数不能是指向只读内存 (的指针,例如 const 变量或文本字符串) 。 如果此参数是常量字符串,则函数可能会导致访问冲突。
你要明白,所有 A 结尾的 Windows API 函数都是内部调用了 W 结尾的 API,因为系统内部就是按照宽字符处理的。
由于 std::string 的 c_str() 返回的是 const char* ,这样就是为了防止出现被改变的情况。
如果强行把 (s + "aaa").c_str() 转成 char* ,反而不是很好,尤其是在临时字符串操作这个。
所以最合理的做法是搞一个 char 的数组,把你需要的参数拷贝到这个数组,然后再传递给 CreateProcessA 去。
当然,这还需要保证安全,不要贪图省事,以免出现数组溢出的经典问题。
|