2016-09-21 2 views
0

XML 파일로 작업하는 Qt 응용 프로그램을 개발 중입니다. 성능을 높이기 위해 Qt의 dom 파서 대신 pugixml 파서를 사용합니다. 컴파일 한 후 내 응용 프로그램과 모든 종속성 (dll 파일, 도우미 프로그램)은 winapi 응용 프로그램의 리소스로 압축되어 단일 exe 파일을 만듭니다.손상된 winapi 실행 파일 매니페스트

QString::toStdString()QString::toStdWString()으로 바꿀 때까지 모든 것이 잘 작동했습니다. 그 이유는 pugixml에 이름 (ąęśćłóźżń)의 확장 문자가있는 파일을 읽는 것입니다. 이전에 Qt 재귀 디렉토리 루프에 의해로드 된 데이터를 가지고 pugixml::document::load_file()을 실행했습니다. 파일 이름을 포함하는 QStringstd::wstring으로 변환 된 후 const wchar_t*으로 변환되어 qstring.toStdWString().c_str()으로 변환됩니다.

stringwstring으로 바꾸면 압축이 풀린 실행 파일이 잘 작동합니다. -w64 쉘는 MinGW로 컴파일,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level="asInvoker"/> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
     <!--The ID below indicates application support for Windows Vista --> 
     <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
     <!--The ID below indicates below indicates application support for Windows 
7 --> 
     <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> 
     <!--The ID below indicates application support for Windows 8 --> 
     <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> 
     <!--The ID below indicates application support for Windows 8.1 --> 
     <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> 
     <!--The ID below indicates application support for Windows 10 --> 
     <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> 
    </application> 
    </compatibili 

나는 윈도우 7 64 비트를 사용하고 있습니다 : 그러나, 포장 후, 최종 .exe 파일은 다음과 같습니다 손상된 매니페스트가 있습니다. 최종 패키지의 메이크 파일은 다음과 같습니다

all: final.exe 

final.exe: sad.o res.o 
    g++ -o final.exe -static-libgcc sad.o res.o resource.o -lcomctl32 -lshlwapi -mwindows 

sad.o: sad.cpp 
    g++ -c sad.cpp 

res.o: sad.rc resource.h resource.cpp 
    windres sad.rc res.o 
    g++ -c resource.cpp 

clean: 
    rm -f *o final.exe 

(res.o 프로그램을 포함하고한데로 의해 포장 모든 종속성은 sad.cpp 자원에서 내 응용 프로그램을 호출하는 WINAPI 프로그램을 포함).

+0

손상된 매니페스트는 무엇입니까? – andlabs

+0

질문에 포함되어 있습니다. 모든 노드가 닫히기 전에 XML이 중지됩니다. –

+1

그러면 매니페스트 리소스를 생성하는 코드를 확인해야합니다. – andlabs

답변

0

이 문제의 원인을 확실하지 않지만 컴파일러 오류와 유사하지만 유효한 매니페스트가 포함 된 xml 파일에서 winapi 리소스를 만들어 해결할 수 있습니다. 나중에 참조 할 수 있도록 절차에 대해 설명하겠습니다.

#include <windows.h> 
RT_MANIFEST BINARY MOVEABLE PURE "manifest.xml" 

그런 다음 유효한 매니페스트 XML 파일을 포함하는 manifest.xml 파일을 만들고 메이크에 추가 :

manifest.o: manifest.rc 
    windres manifest.rc manifest.o 

돈을

은 다음과 같습니다 새로운 manifest.rc 파일을 생성 Makefile의 메인 프로그램 레시피에 manifest.o를 추가하는 것을 잊지 마십시오 :

final.exe: sad.o res.o manifest.o 
    g++ -o final.exe -static-libgcc sad.o res.o resource.o manifest.o -lcomctl32 -lshlwapi -mwindows