帮忙解释一下createprocess,createprocessA,createprocessW的区别

wts 2009-06-05 01:55:32
如题。
有个程序,调用createprocessW的就可以启动,而调用createprocess就可能不成功。
调用createprocess的时候,返回值是成功的,但程序却根本没启动。
而大部分的程序,用createprocess都可以成功启动。
所以就有点困惑了,createprocess,createprocessW,createprocessA都有什么区别?
什么时候,应该使用哪个API?

一律使用createprocessW可以吗?

谢谢。

不懂的,不会的,学习的,就别顶了,我会自己关注帖子,谢谢合作。
另外别贴一大堆API参数说明。
...全文
1824 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuqin3 2009-11-08
  • 打赏
  • 举报
回复 1
CreateProcessA -> The ANSI version of this function
CreateProcessW -> The Unicode version of this function
dinoalex 2009-06-12
  • 打赏
  • 举报
回复 1
实际上Windows的内部都采用宽字符,所以前者只是把字符串转换成宽字符格式,然后调用后者。

可以理解为,就算是A,win也会转成W
dinoalex 2009-06-12
  • 打赏
  • 举报
回复
在WIN32系统中Windows的内部都采用宽字符
shadowstar 2009-06-12
  • 打赏
  • 举报
回复
对于16位的应用程序,或者在Win9x下运行的程序,有的不支持..W函数。
wts 2009-06-12
  • 打赏
  • 举报
回复
能回答一下,后半段问题么?
那createprocessA在Windows平台什么时候用到呢?启动dos程序?启动16位程序?
换句话说,就是我自己开发的程序,完全不必考虑A的情况?就没有特殊情况么?
shadowstar 2009-06-12
  • 打赏
  • 举报
回复
如果你都用宽字符就可以都用..W
wts 2009-06-12
  • 打赏
  • 举报
回复
我用的Delphi2007 感觉和2009好像差不多。
按照楼上两位的说法,那是不是在Windows平台上,无论启动什么软件,我都可以用W方式?因为这个API是我主动调用的,所以传入参数是宽还是窄,完全由我来决定,是这样吧?

换句话说,就是我自己开发的程序,完全不必考虑A的情况?就没有特殊情况么?
shadowstar 2009-06-12
  • 打赏
  • 举报
回复
如果你的程序是定义了UNICODE,用的就是带W的,否则就是A。

两者没有任何区别,除了字符宽度不一样。

这里是Delphi版,Delphi没有那样的定义,旧版的Delphi用的都是..A,2009以后版本默认都是..W。

同样一个语句,你可以用A或者W两种方式来调用,只要把字符宽度转换一下。

var
sa: AnsiString;
sw: WideString;
begin
sa := 'c:\1.exe';
sw := 'c:\1.exe';
CreateProcessA(.. PAnsiChar(sa) ..);
CreateProcessW(.. PWideChar(sw) ..);
end;
wts 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dinoalex 的回复:]
在Win32位API中,创建进程是由CreateProcess()完成的。这实际上是个宏定义,

Windows NT 头文件使用宏,如下所示选择相应的 API:
#ifdef UNICODE
#define CreateProcess CreateProcessW
#else
#define CreateProcess CreateProcessA
#endif // !UNICODE

根据不同的情况定义成CreateProcessA ()或CreateProcessW()之一

两个函数的区别仅在于字符串的表达,前者采用ASCII字符,而后者采用“宽字…
[/Quote]

谢谢,解释的比较清楚。
那createprocessA在Windows平台什么时候用到呢?启动dos程序?启动16位程序?
wts 2009-06-12
  • 打赏
  • 举报
回复
OK,基本明白了,谢谢各位!
shadowstar 2009-06-11
  • 打赏
  • 举报
回复
操作系统版本
Delphi版本
二次调用代码
dinoalex 2009-06-11
  • 打赏
  • 举报
回复
在Win32位API中,创建进程是由CreateProcess()完成的。这实际上是个宏定义,

Windows NT 头文件使用宏,如下所示选择相应的 API:
#ifdef UNICODE
#define CreateProcess CreateProcessW
#else
#define CreateProcess CreateProcessA
#endif // !UNICODE

根据不同的情况定义成CreateProcessA ()或CreateProcessW()之一

两个函数的区别仅在于字符串的表达,前者采用ASCII字符,而后者采用“宽字符”、即Unicode。

实际上Windows的内部都采用宽字符,所以前者只是把字符串转换成宽字符格式,然后调用后者。

那么你选择用CreateProcessW 较好
wts 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 dinoalex 的回复:]
不成功的可能是你所调用的是程式所影射的不是一个程式,如所影射的是DLL
[/Quote]

不懂你的意思,能具体说说吗?
dinoalex 2009-06-06
  • 打赏
  • 举报
回复
不成功的可能是你所调用的是程式所影射的不是一个程式,如所影射的是DLL
wts 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 CoolSlob 的回复:]
在调用createprocess后,尝试ShowMessage(SysErrorMessage(GetLastError)))看看
[/Quote]

提示是:拒绝访问
wts 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 CoolSlob 的回复:]
看来垃圾回复不是个别现象了,看把楼主给惹得。。。
[/Quote]

这个没什么,只要是认真回复就是欢迎的。
日总是我哥 2009-06-06
  • 打赏
  • 举报
回复
在调用createprocess后,尝试ShowMessage(SysErrorMessage(GetLastError)))看看
日总是我哥 2009-06-06
  • 打赏
  • 举报
回复
CreateProcResult := CreateProcess(nil,PChar(AppPath), nil, nil, false,
DETACHED_PROCESS, nil, PChar(appDir), StartUpInfo, ProcessInformation);
-----------
把变量声明也贴出来,特别是StartUpInfo的声明。

[Quote=引用 6 楼 duzif 的回复:]
其实windows api中很多函数都有这三种表示方法,实际上完成功能的是两个宽字符版本CreateProcessW和窄字符版本CreateProcessA
CreateProcess则默认的调用CreateProcessW
[/Quote]
需要说明的是,在Delphi2009版本之前,CreateProcess默认是声明为CreateProcessA,到了Delphi2009之后,由于支持Unicode,所有api函数默认使用宽字符调用形式。
日总是我哥 2009-06-06
  • 打赏
  • 举报
回复
看来垃圾回复不是个别现象了,看把楼主给惹得。。。
wts 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dinoalex 的回复:]
CreateProcessA -> The ANSI version of this function

CreateProcessW -> The Unicode version of this function

请参照http://msdn.microsoft.com/en-us/library/ms682425.aspx
[/Quote]

这个我也知道啊。就是不知道如何决定用哪个
加载更多回复(8)
源码下载地址: https://pan.quark.cn/s/8d2c461c797c JavaWeb程序设计构成了掌握Web交互式应用程序开发的核心领域,对于初学者来说,精通这一技术具有决定性意义。在“JavaWeb程序设计(第三版)作业答案”中,我们可以预期获得针对该教材习题的一系列深入解析,从而协助学习者强化知识体系。 JavaWeb所包含的技术组件涵盖了Servlet、JSP(JavaServer Pages)、JDBC(Java Database Connectivity)以及各类框架如Spring MVC、Struts等。Servlet是Java平台提供的一种扩展服务器功能的接口,能够处理HTTP请求并生成相应的反馈。JSP则是一种用于构建动态网页的工具,它支持开发者将HTML代码与Java代码进行整合编写,从而简化了Web应用程序的开发流程。 作业答案通常会涉及以下几个核心内容: 1. **Servlet基础**:可能包含Servlet生命周期、init(), service(), destroy()方法的应用,以及如何在web.xml文件中设定Servlet的映射关系。 2. **JSP基础**:JSP的九大内置对象,如request、response、session、application等的使用,以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的实际操作。 3. **HTTP协议理解**:GET和POST请求方法的差异,请求头与响应头的应用,以及会话管理的概念阐释。 4. **JDBC数据库操作**:与数据库建立连接,执行SQL指令,处理查询结果集,以及...

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧