2017-12-09 22 views
0

CreateProcess()을 사용하여 main.exe이라는 응용 프로그램을 시작하려고합니다. main.exe이 시작되지만 곧 일부 DLL이 손상되어 Windows OS에서 실행될 수 없다는 몇 가지 오류 메시지가 발생하면 충돌이 발생합니다. 아래 화면 캡처에서 일본 콘텐츠에 대한응용 프로그램을 프로그래밍 방식으로 시작하는 것과 응용 프로그램 아이콘을 수동으로 두 번 클릭하는 것의 차이점은 무엇입니까?

죄송합니다, 팝업 주로 말한다 :

또한 image

는 바이러스 백신이 화를 보인다 :

**popup title**: the image file of main.exe is not correct. 
**popup content**: mshtml.dll can not be executed on Windows or there is error in this file. 

오류 메시지 CreateProcess()

image

dummyMain.exe 위 이미지에서 바이러스 백신이 화가났다는 것은 main.exe을 시작한 모듈입니다. 응용 프로그램을 실행하는 데 사용

내 코드 :

TCHAR sAppFullPath[] = L"D:\\bin\\main.exe"; 
STARTUPINFO si; 
memset(&si, 0, sizeof(si)); 
si.cb = sizeof(si); 
BOOL bCreateProcess = CreateProcess(sAppFullPath, 
    NULL,// no parameters 
    NULL, 
    NULL, 
    FALSE, 
    0, 
    NULL, 
    NULL, 
    &si, 
    &m_pi);// m_pi is a member var of class 
DWORD dwError = GetLastError(); 

유용한 정보가되지 않을 수 있지만 : GetLastError() 위 1813을 반환 (ERROR_RESOURCE_TYPE_NOT_FOUND).

동일한 용도로 위의 CreateProcess()을 사용하면 오류없이 다른 응용 프로그램을 시작할 수 있습니다. main.exe 특별한 만들 수 있습니다

한 가지입니다 : HTML 페이지를 표시하는 그것의 메인 창에 임베디드 인터넷 익스플로러 서버가있다.

++ 스파이에 의해 확인 된 Internet Explorer_Server

:

image

main.exe는 WPF를 사용하여 C#으로 writen했다.

더 자세한 정보 나 ShellExecute()CreateProcess()을 교체 한 후

같은 오류가 발생합니다.

따라서 문제는 main.exe 자체에있는 것으로 보입니다.

하지만 아무 문제없이 두 번 클릭하여 시작할 수 있습니다.

손상 될 수 있다고 하였다 된 DLL의 전체 목록은 실행하지 못했습니다했다 : main.exe 추락

Windows\SysWOW64\mshtml.dll 
Windows\system32\ntmarta.dll 
Windows\SysWOW64\mshtml.dll 
Windows\system32\Wpc.dll 
Windows\system32\MSHTML.dll 
Windows\system32\msctfui.dll 

전에 대화는하지 않는 나타나도 있었다 파일 다운로드 (렌더링 할 index.html) 오류로 인해 응답합니다.

image

그래서, 나는 embeeded Internet Explorer_Server와 관련된 문제를 의심하기 시작했다,하지만 난 프로그래밍 응용 프로그램을 시작하고 더블 클릭의 차이점이 무엇인지 모른다.

모든 의견을 환영합니다!

+0

하지만 CreateProcess를 후 GetLastError()() 1813이었다. 'CreateProcess()'가 실패했지만 "main.exe"가 시작되었다고 말하는 겁니까? 그럴 수는 없습니다. 부수적으로, 질문에 문자 그대로 * 코드를 포함시키고 * code * 형식으로 작성하십시오. 그렇지 않으면 검색 기능으로 찾을 수 없습니다. – zett42

+0

쓸데없는 질문입니다. 유용하게 사용하려면 문제가 발생한 코드를 포함 시키십시오. 또한, [투어]는 선택이 아닙니다. – IInspectable

+0

자식 프로세스가 시작된 경우 - CreateProcess가 true를 반환합니다. CreateProcess가 true를 반환하면'GetLastError()'를 반환하지 않습니다. 일반적으로 실패 할 때만 사용됩니다. 아동 과정의 오류 - 별도의 질문 – RbMm

답변

1

또한, 바이러스 백신은 바이러스 백신을 사용하지 않으면

이 오류가 계속 발생합니까 화를 보인다?

BOOL bCreateProcess = CreateProcess(sAppFullPath, 
    NULL,// no parameters 
    NULL, 
    NULL, 
    FALSE, 
    0, 
    NULL, 
    NULL, 
    &si, 
    &m_pi);// m_pi is a member var of class 
DWORD dwError = GetLastError(); 

무조건 GetLastError()를 호출하는 것은 잘못된 것입니다. bCreateProcessFALSE 일 경우에만 GetLastError()으로 전화해야합니다. API 함수는 일반적으로 성공할 경우 마지막 오류 값을 재설정하지 않으므로 여기서는 전혀 관련이없는 이전 API 호출로 인해 마지막 오류 값이 발생할 수 있습니다.

호환성을 최대로 유지하려면 두 번째 인수를 전체 명령 줄로 설정하고 CreateProcess()으로 전화하십시오. 규칙에 따라 명령 줄의 첫 번째 인수는 실행 파일의 경로입니다. C# 프로그램은이를 예상 할 수 있으며 인수를 전혀 지정하지 않으면 실패 할 수 있습니다.

또한 lpCurrentDirectory 매개 변수를 실행 파일의 디렉터리 경로로 설정하십시오. 그렇지 않으면 함수는 현재 디렉토리를 사용합니다. 현재 디렉토리는 시작될 응용 프로그램의 디렉토리와 다를 가능성이 큽니다. 잘못 작성된 응용 프로그램은 현재 디렉토리가 응용 프로그램 디렉토리와 항상 같다고 가정합니다.

예 : ERROR_RESOURCE_TYPE_NOT_FOUND._ - 모순이있다 :

std::wstring const appDirectory = L"D:\\bin\\"; 
std::wstring const appName = L"main.exe"; 
std::wstring const appPath = appDirectory + appName; 

// In a command-line, all pathes must be enclosed in double quotation marks to prevent 
// space characters in the path from being interpreted as argument separators. 
std::wstring appCommandLine = L"\"" + appPath + L"\""; 

if(CreateProcessW(NULL, 
    &appCommandLine[0], // Parameter type is LPWSTR -> we need a pointer to writable data 
    NULL, 
    NULL, 
    FALSE, 
    0, 
    NULL, 
    appDirectory.c_str(), 
    &si, 
    &m_pi) 
{ 
    // Application launched 
} 
else 
{ 
    // Application failed to launch. Only here it is valid to call GetLastError()! 
    DWORD dwError = GetLastError(); 
} 
메인 .exe가 시작되었다 _Although
+0

* 최대 호환성을 위해 첫 번째 인수가 NULL로 설정된 CreateProcess()를 호출하십시오. * -이 경우는 잘못된 것으로, exe 파일의 전체 경로가있는 경우 첫 번째 인수에서 항상 더 잘 사용합니다. 이 절대적인 호환성과 전혀 관련이 없습니다. 여기서 0을 사용하려면 정확히 경로가없고 'SearchPath'를 직접 사용하지 않는 것이 좋습니다. – RbMm

+0

@RbMm'lpCommandLine'에서 이미 전체 경로를 지정하면 경로를 두 번 지정하는 것이 무슨 의미입니까?또한 나를 인용 할 때 문장의 두 번째 부분을 남겨 둡니다. 사실 * 호환성을 위해 * 중요합니다 : "두 번째 인수는 전체 명령 행으로 설정됩니다" – zett42

+0

명시 적으로 설정하지 않으면 * lpApplicationName * - 시스템이 구문 분석됩니다 * lpCommandLine *, 첫 번째 토큰을 가져 와서'SearchPath'를 호출합니다 (시스템은 전체 또는 부분 경로를 사용하는지 알 수 없습니다). 그래서 항상 항상 감각적으로 사용하는 * lpApplicationName * (이 경우 시스템은 터치/구문 분석 * lpCommandLine *이 아닐 것입니다.) 그리고 내 노트는 대략적입니다 * 최대 호환성을 위해 * 사용 또는 사용하지 마십시오 * lpApplicationName * 아무 효과가 없습니다 호환성을 위해 – RbMm