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

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

一律使用createprocessW可以吗?

谢谢。

不懂的,不会的,学习的,就别顶了,我会自己关注帖子,谢谢合作。
另外别贴一大堆API参数说明。
...全文
1366 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)

1,183

社区成员

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

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