Ich würde die EXE nicht einfach so als
DLL laden und auch noch deren Startfunktion ausführen.
LoadLibraryEx + LOAD_LIBRARY_AS_DATAFILE
(hab diesen Parameter noch nicht ausprobiert, aber wenn ich das richtig verstanden hab, dann sollte es so besser sein)
Die Fehlerbehandlung ist teilweise komplett falsch.
Und der Programmname ist nicht grade passend, denn du erstellst ja kein Manifest, sondern änderst es nur
ungetestet (nur so dahingetippt)
Delphi-Quellcode:
program ManifestCreator;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
AnsiStrings;
var
hanFile : hFile;
hanExe : HMODULE;
hanRes : HRSRC;
hanLoadRes : HRSRC;
ptrData : Pointer;
str : AnsiString;
begin
try
if Length(ParamStr(1)) < 3
then
raise EAbort.Create('
Bitte geben Sie eine Datei an');
WriteLn('
Oeffne ', ParamStr(1), '
...');
hanExe := LoadLibraryEx(PChar(ParamStr(1)),
nil, LOAD_LIBRARY_AS_DATAFILE);
if hanExe <> 0
then RaiseLastOSError;
hanRes := FindResource(hanExe, PChar(1), PChar(24));
if hanRes = 0
then RaiseLastOSError;
hanLoadRes := LoadResource(hanExe, hanRes);
if hanLoadRes = 0
then RaiseLastOSError;
ptrData := LockResource(hanLoadRes);
if not Assigned(ptrData)
then RaiseLastOSError;
str := StringReplace(PAnsiChar(ptrData), '
asInvoker', '
requireAdministrator', [rfIgnoreCase]);
UnlockResource(ptrData);
FreeLibrary(hanExe);
hanFile := BeginUpdateResource(PChar(ParamStr(1)), false);
if hanFile = 0
then RaiseLastOSError;
if not UpdateResourceA(hanFile, PChar(24), PChar(1), 1031, PAnsiChar(str), Length(str))
then
RaiseLastOSError;
if not EndUpdateResource(hanFile, False)
then RaiseLastOSError;
WriteLn('
Fertig!');
Sleep(3000);
except
on E:
Exception do
begin
WriteLn(E.Classname, '
: ', E.
Message);
Sleep(7000);
end;
end;
end.