2016-09-21 9 views
0

私はXMLファイルを扱うQtアプリケーションを開発しています。パフォーマンスを向上させるために、私はQtのDOMパーサーの代わりにpugixmlパーサーを使用しています。コンパイル後、私のアプリケーションとすべての依存ファイル(dllファイル、ヘルパープログラム)はwinapiアプリケーションのリソースとしてパックされ、1つのexeファイルが作成されます。winapi実行可能マニフェストが破損しました

QString::toStdString()QString::toStdWString()に置き換えるまで、すべてうまくいきました。その理由は、名前の拡張文字(ąęśćłóźżń)を含むファイルをpugixmlに読み込むためです。私はpugixml::document::load_file()を実行し、以前はQt再帰ディレクトリループによってデータがロードされていました。ファイル名を含むQStringstd::wstringに、次にconst wchar_t*にはqstring.toStdWString().c_str()に変換されます。

stringsをwstringsに置き換えた後、アンパックされた実行可能ファイルはうまくいきました。しかし、それを梱包した後、最終的に.exeファイルは、次のようになります破損したマニフェストがあります。

<?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 

私はMinGWの-w64シェルでコンパイルし、Windows 7の64ビット版を使用しています。最終的なパッケージのMakefileは次のようになります。

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は、プログラムが含まれており、windresはでパックすべての依存関係は、sad.cppはリソースから自分のアプリケーションを呼び出すWINAPIプログラムが含まれています)。

+0

壊れたマニフェストとは何ですか? – andlabs

+0

これは質問に含まれています。すべてのノードが閉じられる前にXMLが停止する –

+1

マニフェストリソースを生成するコードを確認する必要があります。 – andlabs

答えて

0

問題の原因は不明ですが、コンパイラの不具合のようですが、有効なマニフェストを含むxmlファイルからwinapiリソースを作成することで回避できます。私は、将来の参照のための手順を説明します。

次のようになり、新たなmanifest.rcファイルを、作成します。次に、有効なマニフェストXMLファイルを含むのmanifest.xmlファイルを作成したMakefileに追加

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

を:

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

ドン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 
関連する問題