2015-10-07 21 views
8

Sto compilando una domanda con i586-mingw32msvc sotto ubuntu.Incorpora file manifest per richiedere il livello di esecuzione dell'amministratore con mingw32

Ho difficoltà a capire come incorporare un file manifest per richiedere il livello di esecuzione dell'amministratore con mingw32.

Per il mio esempio ho usato questo hello.c:

int main() { 
    return 0; 
} 

questo file di risorse hello.rc:

1 Manifest "hello.exe.manifest" 

questo file manifesto hello.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="hello" type="win32"/> 
    <description>Hello World</description> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
      <requestedPrivileges> 
       <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

compilo il mio file di risorse con:

i586-mingw32msvc-windres hello.rc hello.o 

posso compilare la mia domanda finale con:

i586-mingw32msvc-gcc -O3 -Os -s -o hello.exe hello.c hello.o 

SigCheck non mostra il file manifesto in esecuzione sigcheck -m hello.exe.

Ora quando eseguo la mia applicazione in Windows non attiva il controllo dell'account utente (= non viene eseguito come amministratore) mentre quando allego il file hello.exe.manifest nella stessa cartella attiva il controllo dell'account utente (come previsto).

Cosa mi sono perso?

Edit1: Giocando con Resource Hacker Ho aperto un file Setup.exe ho creato con NSIS, l'unica differenza è che sensibile Manifest è scritto nel mio MANIFESThello.exe e Manifest in Setup.exe anche se in hello.rc è scritto manifesto. O_o

NSIS Installer vs hello.exe

EDIT2: ho cambiato il gruppo Manifest manualmente con Resource Hacker:

Modified with Resource Hacker

Ora hello.exe agisce normalmente innescando l'avviso UAC e l'esecuzione come amministratore. Sembra un "bug" con i586-mingw32msvc-windres. :-)

+0

Questo può aiutare: http://www.transmissionzero.co.uk/computing/win32-apps-with-mingw/ –

+0

@JonathonReinhart Grazie ma ho provato ciò che è descritto anche su quel collegamento .. e [il linkalo collegato a] (https://msdn.microsoft.com/en-us/library/bb756973.aspx) troppo .. Ma non è cambiato nulla .. Ho aggiornato il mio file 'hello.rc' a' 1 Manifest " hello.exe.manifest "' .. Con Resource Hacker ho aperto un programma di installazione NSIS (che ho compilato con makensis) che richiede l'amministratore, tutto è sensibilmente lo stesso; l'unica cosa che è diversa è che il campo manifest è scritto "Manifest" nel file 'Setup.exe' e scritto" MANIFEST "nel mio file' hello.exe'! ([Vedi qui] (http://i.imgur.com/WzHtXnw.png)) –

+0

Normalmente si compila il file .rc nel file '.res' (non' .o') –

risposta

1

Con un po 'intensa voodoo ho preso a lavorare con questo sul mio file hello.rc:

1 24 "hello.exe.manifest" 

non sarà nemmeno cercare di sapere quello che il 24 è per il (tipo di risorsa manifesta ?!). .:-)

1

Per quanto riguarda i numeri voodoo magici 1 e 24:

1 24 "hello.exe.manifest" 

Quella linea traduce somthing simili:

ID_MANIFEST RT_MANIFEST "hello.exe.manifest" 

dove tali definisce sono come definiti come segue:

#define ID_MANIFEST 1 
#ifndef RT_MANIFEST 
#define RT_MANIFEST MAKEINTRESOURCE(24) 
#endif 

Come mostrato sopra dai wrapper condizionali, il RT_MANI FEST potrebbe già essere definito e se esegui una ricerca su Google per quel RT_MANIFEST termini troverai molti risultati con maggiori dettagli su ciò che sta accadendo.