2014-10-29 5 views
-1

만든 Windows 응용 프로그램에서 .vbs를 가리키는 배치 파일을 실행하려고합니다. 그것은 vbs 스크립트를 실행하지만 필요에 따라 레지스트리를 수정하지 않습니다. 그러나 배치 파일을 수동으로 실행하면 제대로 작동합니다. 문제가 될 수있는 것에 관해서는 누구도 통찰력을 갖고 있습니까? 내가 권한이라고 생각했는데, 배치 파일을 수동으로 클릭하거나 내 프로그램에서 열면 문제가되는 이유는 무엇입니까? 어쨌든, 배치 파일을 관리자 권한으로 실행하려고 수정했지만 온라인에서는 아무 것도 작동하지 않는 것 같습니다.배치 파일을 실행하는 CreateProcess

+2

어떻게? –

+0

프로그램의 CreateProcess를 통해 해당 배치 파일을 실행하고 있습니다. – limburger

+0

CreateProcess는 생성 된 프로세스의 컨텍스트를 의미합니다. 환경 블록, 작업 디렉터리 등입니다. 문제의 원인이 될 수 있습니다. 아마도 실제로 vbs 스크립트 문제를 해결하고 작동하지 않는 이유를 확인해야합니다. 그러면 CreateProcess 호출에서 변경해야 할 사항을 파악하는 데 도움이됩니다. – lordjeb

답변

0

CreateProcess가 배치 파일을 실행할 수있는 곳이 어디에도 없습니다. 배치 파일은 프로그램이 아니기 때문에 CreateProcess는 아무 것도 할 수 없습니다. CMD.exe는 배치 파일을 실행합니다.

귀하가이 BY TESTING 반환 값을 알려진 도움말에서

반환 값 함수가 성공하면

을 문서

을 읽어 것

는, 반환 값은 0이 아닌

함수가 실패하면 반환 값은 0입니다. 확장 된 오류 정보를 얻으려면 GetLastError를 호출하십시오. 도움말

에서 또한

배치 파일을 실행하려면 명령 인터프리터를 시작해야합니다; lpApplicationName을 cmd.exe로 설정하고 lpCommandLine을 배치 파일의 이름으로 설정하십시오.


이 당신은 잘못하고있다

1. 당신이 희한 프로그램 설계가 무엇입니까.

모든 프로그램에서 사용자 입력을 요청하고 레지스트리에 쓸 수 있습니다. 레지스트리 작성을위한 네 가지 방법 (.NET, WSH, WMI, API)이있는 프로그램을 작성하고 있습니다. 그런 다음 레지스트리를 작성하는 두 가지 방법 (WMI 및 reg.exe)이있는 일괄 처리를 실행합니다. 그런 다음 두 가지 방법 (WMI, WSH)이있는 vbs 파일을 만듭니다.

2. 오류는 테스트하지 않습니다.

오류가 있는지 테스트해야합니다. 오류에 액세스 할 수있는 유일한 사람은 YOU입니다. 오류는 어떤 일이 일어 났는지 말합니다. 오류를 수정하거나 충돌해야합니다. 그리고 오류 번호, 오류 소스, 시도한 내용 및 매개 변수없이 묻는 것은 없습니다.

오류가 예상됩니다. 사용자는 예를 들어 파일을 삭제하거나 이동합니다.

3. 그것은 당신이 프로그래밍 동안 개방하는 문서

을 읽어야합니다. 특정 방법으로 행동하기 위해 필요한 것을 설명합니다. 그냥 무작위 명령을 입력하면 (여기에있는 많은 명령은 무효입니다.) 또는 임의의 매개 변수를 입력하는 것은 작동하지 않습니다.그것을 읽지 않으면 그 의미를 알 수 없습니다. 재생

4. 답을 말했다받을

, 당신이 가서 문서에 모든 것을보고, 다음 구글 무력.

귀하는 "작동하지 않았습니다"라는 한심한 대답을하지 마십시오. 오류 번호, 오류 원본, 수행하려고 시도한 내용 및 매개 변수를 게시합니다.


디코딩 오류

-2147220978 스타일 번호 오류를 디코딩하는 방법을 32 개 비트 부호있는 정수, 계산기와 16 진수로 변환이다.

Windows 오류 (작은 숫자) 및 COM HResults (일반적으로 예외는 있지만 0x80040154와 같이 8로 시작)는 WinError.h에 정의되어 있습니다 (단, 8007nnnn은 Windows 오류 번호를 찾습니다).

일반적으로 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

를 다운로드하여 이러한 파일을 얻을. https://skydrive.live.com/redir?resid=E2F0CE17A268A4FA!121

인터넷 오류 (12,000 - 12,999)는 창 오류이지만 위의 wininet.h에도 나와 있습니다.

다른 .h 파일에 정의 된 오류가 있습니다. 그러나 99 %는 위의 3 가지에 해당됩니다. NTSTATUS HRESULTS 및 코드

HRESULTS

에서 최상위 비트 및 NTSTATUS의 두 개의 최상위 비트의

구조 오류에 설정된다. 따라서 Hresults는 오류가 발생하면 8을 시작하고 NTStatus는 C 오류를 시작합니다. 다음 14 또는 15 비트는 예약되어 있으며 일부는 오류를 포함하고있는 영역을 지정합니다. 이것은 16 진수를 읽을 때 세 번째와 네 번째 숫자입니다. EG 0xnn07nnnn - HResult 기능 코드 7은 정상적인 Windows 오류입니다 (COM 프로그램에서 반환 됨 - 따라서 HResult로 반환 됨). 설비 코드는 HResults의 경우 Winerror.h에 정의되고 NTStatus 코드의 경우 NTStatus.h에 정의됩니다. 그들은 다르다.

0x8003nnnn 디코딩하는데 에러 기능 코드 3

HRESULTS는 HRESULT는 OLE 구조적 저장소 에러 (내지 0xFF를 0x0) 포함을 의미한다. 이는 Dos 오류 코드와 동일합니다. 이것들은 Windows의 헤더 파일에있는 것처럼 보이지 않으며 코드 목록은이 게시물의 끝에 있습니다.

0x8004nnnn 디코딩하는데 에러 기능 코드 4

HRESULTS는 HRESULT 상기 범위의 나머지 (전방을 0x200)의 구성 요소 별 오차 동안 OLE 오류 (0x1ff 행이 0x0)을 포함 수단 20E 그래서 하나 개의 컴포넌트로부터의 것 다른 구성 요소로부터 20e와 다른 의미를가집니다.

0x80040200 이상의 오류 때문에 오류 원본이 중요한 이유입니다.

0x8007nnnn 디코딩 오류 설비 코드 7

HRESULTS는 HRESULT는 윈도우의 오류 코드를 포함하는 것을 의미한다. HResult가 아닌 Windows 오류 코드를 찾아야합니다.

0x80070002를 디코딩 할 수 있습니다. 0x는 16 진수이고 8은 오류를 의미하며 처음 7은 Windows 오류를 의미하고 나머지 숫자 2는 실제 Windows 오류를 의미합니다.

오류를 찾으려면 십진수 형식이어야합니다. 계산기 (시작 - 모든 프로그램 - 보조 프로그램 - 계산기)를 시작하고보기 메뉴 - 과학,보기 메뉴 - 16 진수를 선택하십시오. 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에만 해당됩니다.

는 0xD 시작

HRESULT를 그것의 NTSTATUS 값 준다이다 0xDnnnnnnn 오류를 디코딩. 리드 D를 C로 변경하고 NTStatus (Hresult = NTStatus 또는 0x10000000)로 처리하십시오.

도스 오류 코드 (대한 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

+0

오류 검사가 있는데 오류가 없습니다. 나는 strickly 방망이 파일을 사용하는 대신 VBS를 실행하도록 변경하고 지금은 나에게 명령 창을 제공합니다 : 그리고 VBS를 실행하지 않습니다. 메시지의 글자 제한 때문에 두 번째 메시지에 코드를 첨부해야합니다. – limburger

+0

'code'BOOL 결과 LPTSTR cmdname = "C : \\ Windows \\ System32 \\ cmd.exe"; LPTSTR cmdargs = "E : \\ Programs \\ LogonScript \\ AutoLogonEnable.vbs"; 경우 FALSE (LOGINFlag.State ==되는 체크) {= CreateProcess를 결과 (CMDNAME, cmdargs, NULL, NULL, CREATE_NEW_CONSOLE, NULL, NULL, SI, &pi); 의 WaitForSingleObject (pi.hProcess) INFINITE; LOGINFlag.State = 확인했다;'code' 오류 검사 코드를 알려주고 싶다면 – limburger

관련 문제