2014-10-29 157 views
-1

在我创建的Windows应用程序中,我试图运行一个指向.vbs的批处理文件。它运行vbs脚本,但不会根据需要修改注册表。但是,如果我手动运行该批处理文件,它将正常运行。有没有人有任何洞察力,可能是什么问题?我认为这是权限,但如果我手动点击批处理文件或如果我的程序打开它,为什么会这样?无论如何,我已经修改了批处理文件以尝试以管理员身份运行,但似乎没有任何联机工作。CreateProcess执行批处理文件

+2

以及如何的问题,它的标题连接? – 2014-10-29 15:17:33

+0

我通过程序中的CreateProcess运行该批处理文件 – limburger 2014-10-29 15:26:06

+0

CreateProcess将暗示创建的进程的一些上下文:环境块,工作目录等。它可能是导致您的问题的那些事情之一。您可能需要真正排除vbs脚本的故障并确定它不工作的原因,这将帮助您找出CreateProcess调用中要更改的内容。 – lordjeb 2014-10-29 15:29:12

回答

0

它说没有CreateProcess可以运行批处理文件。由于批处理文件不是程序,CreateProcess无法对其执行任何操作。 CMD.exe执行批处理文件。

你必须知道这一点通过测试的返回值,并通过读取文档

从帮助

返回值

如果函数成功,返回值是非零。

如果函数失败,返回值为零。要获得扩展的错误信息,请调用GetLastError。

而且从帮助

要运行一个批处理文件,则必须启动命令解释程序;将lpApplicationName设置为cmd.exe并将lpCommandLine设置为批处理文件的名称。


这是你在做什么错误

1.你有一个程序的bizzare设计。

任何程序都可以提示用户输入并写入注册表。您正在编写一个程序,该程序至少有四种不同的编写注册表(.NET,WSH,WMI,API)的方法。然后你运行一个有两种编写注册表(WMI和reg.exe)的方式的批处理。然后用两种方式(WMI,WSH)创建一个vbs文件。

2.您不测试错误。

您必须测试错误。唯一可以访问该错误的人是YOU。错误说明发生了什么。您必须修复错误或崩溃。没有错误号码,错误来源,它试图做什么以及参数的问题没有意义。

错误是预期的。例如,用户删除或移动文件。

3.您必须阅读文档

它,而你的程序是开放的。它解释了你需要告诉它以某种方式行事。只要输入随机命令(这里有很多 - 当然是无效的)输入随机参数(就像你一样)不起作用。如果你没有阅读他们,你不知道他们的意思。

4.播放无奈

,当你告诉答案,你去和文档中查找相关的一切行动,然后google一下。

你没有回复可悲的“它没有工作”。您发布错误号,错误来源,试图执行的操作以及参数。


这是怎样的错误解码

解码错误

-2147220978风格号是32个有符号整数,转换与计算器为十六进制。

在WinError.h中定义了Windows错误(小数字)和COM HResults(通常但有例外,以0x80040154中的8开头),除了8007nnnn,您可以在其中查找其包含的Window错误编号。

作为一般规则,Windows错误小于65,535(0xFFFF)。从0x80000001开始的错误是组件对象模型(COM)HResults。从0xC0000001开始的错误是NTStatus结果。起始0xD0000001的错误也是在HResult中返回的NTStatus值。

在NTStatus.h中定义了NTStatus错误(通常但不总是以0xC0000022中的C开头)。

.h文件是最好的源代码,因为它包含错误的符号名称,可以提供诸如错误来源等线索。 FormatMessage不给符号名称只描述。

可通过下载平台SDK(它的千兆字节) http://www.microsoft.com/en-us/download/details.aspx%3Fid%3D8279&sa=U&ei=w2IrULDDLsHFmAWbmIHoBg&ved=0CBwQFjAA&usg=AFQjCNHZn9-4f2NnuN9o3UWUsOF3wL7HBQ

获得这些文件如果你只是想两个文件我有他们在我的SkyDrive,所以我可以引用它们无论我去哪里。 https://skydrive.live.com/redir?resid=E2F0CE17A268A4FA!121

注意互联网错误(12,000 - 12,999)是Windows错误,但也在上面提供的wininet.h中指定。

在其他.h文件中定义了错误。但是99%在上述三个中。 HRESULTS和NTSTATUS代码

最显著位的HRESULT,并在NTSTATUS两个最显著位

结构上的错误设置。因此Hresults在错误时启动8,而NTStatus在错误时启动C.接下来的14或15位被保留,一些指定设备 - 错误在哪个区域。当读取十六进制时,这是第三和第四个数字。 EG 0xnn07nnnn - HResult工具代码7是一个正常的Windows错误(从COM程序返回 - 因此它作为HResult返回)。在Winerror.h中为HResults定义设施代码,在NTStatus代码中为NTStatus.h定义设施代码。他们是不同的。

解码0x8003nnnn错误

HRESULTS与设施代码3装置产生HResult包含OLE结构化存储错误(0x0到0xff的)。这些与Dos错误代码相同。这些似乎不在Windows的头文件中,代码列表在本文的末尾。

解码0x8004nnnn错误

HRESULTS与设施代码4表示产生HResult包含OLE错误(0x0到到0x1FF),而该范围的其余部分(在0x200起)是组分的具体错误,从而20E从一种组分将与另一个组件的20e有不同的含义。

这就是为什么错误的来源对0x80040200以上的错误特别重要。

解码0x8007nnnn错误

HRESULTS与设施码7指的HResult包含一个Windows的错误代码。你必须查看Windows的错误代码,而不是HResult。

解码0x80070002。 0x意味着它是一个十六进制数,8意味着错误,前7意味着它是一个Windows错误,其余的数字2是实际的Windows错误。

要查找错误,我们需要它在十进制格式。启动计算器(开始 - 所有程序 - 附件 - 计算器)并选择查看菜单 - 科学,然后选择查看菜单 - 十六进制。输入2.然后查看菜单 - 小数。它会说2

启动命令提示符(开始 - 所有程序 - 附件 - 命令提示符),然后键入

net helpmsg 2 

,它会说

The system cannot find the file specified. 

或winerror看它.H

// 
// MessageId: ERROR_FILE_NOT_FOUND 
// 
// MessageText: 
// 
// The system cannot find the file specified. 
// 
#define ERROR_FILE_NOT_FOUND    2L 

解码0x8019nnnn错误

设施0x19的HResults是HTTP错误。 16,384(0x4000)以下的代码与HTTP错误相同,例如HTTP状态404:服务器上不存在请求的URL是0x80190194(0x194 = 404)。代码16,384和更高版本是特定于BITS的。

解码0xDnnnnnnn错误

HRESULTS开始为0xD与在其中的NTSTATUS值的HRESULT。只需将导致D更改为C并视为NTStatus(Hresult = NTStatus或0x10000000)。

DOS错误代码(0x8003nnnn错误)

Code Message 
01 Invalid function number 
02 File not found 
03 Path not found 
04 Too many open files (no handles left) 
05 Access denied 
06 Invalid handle 
07 Memory control blocks destroyed 
08 Insufficient memory 
09 Invalid memory block address 
0A Invalid environment 
0B Invalid format 
0C Invalid access mode (open mode is invalid) 
0D Invalid data 
0E Reserved 
0F Invalid drive specified 
10 Attempt to remove current directory 
11 Not same device 
12 No more files 
13 Attempt to write on a write-protected diskette 
14 Unknown unit 
15 Drive not ready 
16 Unknown command 
17 CRC error 
18 Bad request structure length 
19 Seek error 
1A Unknown media type 
1B Sector not found 
1C Printer out of paper 
1D Write fault 
1E Read fault 
1F General failure 
20 Sharing violation 
21 Lock violation 
22 Invalid disk change 
23 FCB unavailable 
24 Sharing buffer overflow 
25 Reserved 
26 Unable to complete file operation (DOS 4.x) 
27-31 Reserved 
32 Network request not supported 
33 Remote computer not listening 
34 Duplicate name on network 
35 Network name not found 
36 Network busy 
37 Network device no longer exists 
38 NetBIOS command limit exceeded 
39 Network adapter error 
3A Incorrect network response 
3B Unexpected network error 
3C Incompatible remote adapter 
3D Print queue full 
3E No space for print file 
3F Print file deleted 
40 Network name deleted 
41 Access denied 
42 Network device type incorrect 
43 Network name not found 
44 Network name limit exceeded 
45 NetBIOS session limit exceeded 
46 Temporarily paused 
47 Network request not accepted 
48 Print or disk redirection is paused 
49-4F Reserved 
50 File already exists 
51 Reserved 
52 Cannot make directory entry 
53 Fail on INT 24 
54 Too many redirections 
55 Duplicate redirection 
56 Invalid password 
57 Invalid parameter 
58 Network device fault 
59 Function not supported by network (DOS 4.x) 
5A Required system component not installed (DOS 4.x) 


Facility Codes 

NTStatus Facilities HResults Facilities 
Common status values 0x0 Null 0x0 
Debugger 0x1 Rpc 0x1 
Rpc_runtime 0x2 Dispatch 0x2 
Rpc_stubs 0x3 Storage 0x3 
Io_error_code 0x4 Itf 0x4 
Various drivers 0x5-0xf Win32 0x7 
Ntwin32 0x7 Windows 0x8 
Ntsspi 0x9 Sspi 0x9 
Terminal_server 0xa Security 0x9 
Faciltiy_mui_error_code 0xb Control 0xa 
Usb_error_code 0x10 Cert 0xb 
Hid_error_code 0x11 Internet 0xc 
Firewire_error_code 0x12 Mediaserver 0xd 
Cluster_error_code 0x13 Msmq 0xe 
Acpi_error_code 0x14 Setupapi 0xf 
Sxs_error_code 0x15 Scard 0x10 
Transaction 0x19 Complus 0x11 
Commonlog 0x1a Aaf 0x12 
Video 0x1b Urt 0x13 
Filter_manager 0x1c Acs 0x14 
Monitor 0x1d Dplay 0x15 
Graphics_kernel 0x1e Umi 0x16 
Driver_framework 0x20 Sxs 0x17 
Fve_error_code 0x21 Windows_ce 0x18 
Fwp_error_code 0x22 Http 0x19 
Ndis_error_code 0x23 Usermode_commonlog 0x1a 
Hypervisor 0x35 Usermode_filter_manager 0x1f 
Ipsec 0x36 Backgroundcopy 0x20 
Maximum_value 0x37 Configuration 0x21 
    State_management 0x22 
    Metadirectory 0x23 
    Windowsupdate 0x24 
    Directoryservice 0x25 
    Graphics 0x26 
    Shell 0x27 
    Tpm_services 0x28 
    Tpm_software 0x29 
    Pla 0x30 
    Fve 0x31 
    Fwp 0x32 
    Winrm 0x33 
    Ndis 0x34 
    Usermode_hypervisor 0x35 
    Cmi 0x36 
    Windows_defender 0x50 
+0

我试过了,它根本不起作用。它会询问用户名,密码和域名,但不会将这些值写入注册表。如果我手动点击批处理文件,虽然它会询问用户名,密码和域,并且它会写入注册表。我一直在竭尽全力,没有任何工作,它似乎在做一些事情,但它并没有完成我的程序运行的最后一步。 – limburger 2014-10-29 21:32:14

+0

我确实有错误检查,它没有提供任何错误。我已经改变它来严格运行Vbs而不是使用bat文件,现在它只给了我一个带有E的命令窗口,并且不执行VBS。由于消息中的字符限制,我将不得不将代码附加到第二条消息。 – limburger 2014-11-04 16:06:32

+0

'code'BOOL结果 LPTSTR cmdname =“C:\\ Windows \\ System32 \\ cmd.exe”; LPTSTR cmdargs =“E:\\ Programs \\ LogonScript \\ AutoLogonEnable.vbs”; LPTSTR cmdargs =“E:\\ Programs \\ LogonScript \\ AutoLogonEnable.vbs”; 如果(LOGINFlag.State ==未选中){ 结果=的CreateProcess(cmdname,cmdargs,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&SI,&pi); WaitForSingleObject的(pi.hProcess,无限); LOGINFlag.State =检查;'代码'如果你想让我给错误检查代码让我知道 – limburger 2014-11-04 16:09:00