Hatte das Problem frueher auch gehabt.
In meinem Beispiel musst du schon in der zu aendernen Datei vorher eine Versioninfo haben, da mein code darauf eingeht:
Code: Alles auswählen
;Dies Ist der Hauptquellcode um bestehende Versionsinfos in Executables zu aendern.
;Copyright (C) 2007 by Christian Seysen and Felix Kuberjans(C++)
;Website: http://www.desaster-games.com
#RT_VERSION = 16
Structure VS_VERSIONINFO
wLength.w
wValueLength.w
wType.w
szKey.w[16]
Padding1.w
Value.VS_FIXEDFILEINFO
Padding2.w
Children.w
EndStructure
Structure StringFileInfo
CompanyName.s
Productname.s
ProductVersion.s
FileVersion.s
FileDescprition.s
InternalName.s
OriginalFilename.s
LegalCopyright.s
Website.s
EndStructure
Procedure.w MAKELANGID(p.w, s.w)
ProcedureReturn (s << 10) | p
EndProcedure
Macro MAKEINTRESOURCE(I)
(I)
EndMacro
Procedure ErrorHandler(Error.s)
MessageRequester("ERROR",Error.s,#MB_OK | #MB_ICONEXCLAMATION)
EndProcedure
Procedure WriteStringFileInfo(pStringName.s,pValue.s,Buffer2.l,Coursor.l)
bPadding1.b
dwPadding2.l
dwStringNameLength = Len(pStringName);
dwValueLength = Len(pValue);
dwSize.w
If dwValueLength % 2 And Not dwStringNameLength % 2
bPadding1 = #False;
Else
bPadding1 = #True;
EndIf
dwSize=10+(dwStringNameLength + dwValueLength + bPadding1) * 2
dwPadding2 = dwSize % SizeOf(Long);
ReAllocateMemory(Buffer2,Coursor + dwSize + dwPadding2)
;1.laenge gesamt
PokeW(Buffer2+Coursor,dwSize) : Coursor=Coursor+2
;2.laenge inhaltslaenge
PokeW(Buffer2+Coursor,dwValueLength+1):Coursor=Coursor+2
;write a 1 ( 01 00)
PokeW(Buffer2+Coursor,1):a=a+2
;StringName
report1$=""
For StringName = 1 To dwStringNameLength
PokeW(Buffer2+Coursor,Asc(Mid(pStringName,StringName,1))):Coursor=Coursor+2
report1$=(report1$+Mid(pStringName,StringName,1)+" ")
Next
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
If (bPadding1)
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
EndIf
;Value
report2$=""
For ValueName = 1 To dwValueLength
PokeW(Buffer2+Coursor,Asc(Mid(pValue,ValueName,1))):Coursor=Coursor+2
report2$=(report2$+Mid(pValue,ValueName,1)+" ")
Next
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
If (dwPadding2)
ZeroMemory_(Buffer2+Coursor,dwPadding2)
Coursor=Coursor+dwPadding2
EndIf
ProcedureReturn Coursor
EndProcedure
Procedure ChangeVersionData(pExe.s,*Information.StringFileInfo)
;Laden der Exe und kopieren der Resource in den Buffer1
hExe = LoadLibrary_(pExe);
If hExe = #Null
ErrorHandler("Could not load exe.");
Goto Except
EndIf
hRes = FindResource_(hExe, MAKEINTRESOURCE(1), #RT_VERSION)
If hRes = #Null
ErrorHandler("Could not locate dialog box.");
Goto Except
EndIf
hResLoad = LoadResource_(hExe, hRes);
lsz=SizeofResource_(hExe, hRes)
If hResLoad = #Null
ErrorHandler("Could not load dialog box.");
Goto Except
EndIf
lpResLock = LockResource_(hResLoad);
If lpResLock = #Null
ErrorHandler("Could not lock dialog box.");
Goto Except
EndIf
Buffer1=AllocateMemory(lsz); pointer zu den resource Daten
MoveMemory(lpResLock, Buffer1, lsz)
;Erstelle Buffer2 fuer unsere neue Resource
Buffer2=AllocateMemory(152)
;#####Create VERSIONINFO#####
;public class Versionsinfo{
;#define SizeOfResource
PokeW(Buffer2,MemorySize(Buffer2))
;kopiere vorhandenes Matterial
For Coursor=2 To 90 Step 2
PokeW(Buffer2+Coursor,PeekW(Buffer1+a))
Next Coursor
;einige Mathematische Vorkehrungen
;Laenge-160
PokeW(Buffer2+Coursor,(MemorySize(Buffer2)-160)) : Coursor=Coursor+2
;Kopiere
CopyMemory(Buffer1+Coursor,Buffer2+Coursor,34) : Coursor=Coursor+34
;Laenge-196
PokeW(Buffer2+Coursor,(MemorySize(Buffer2)-196)) : Coursor=Coursor+2
;Kopiere
CopyMemory(Buffer1+Coursor,Buffer2+Coursor,20) : Coursor=Coursor+20
;Null
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
;Schreibe die Informationen in die exe
Coursor=WriteStringFileInfo("CompanyName",NewFileversion\CompanyName.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("FileDescription",NewFileversion\FileDescription.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("FileVersion",NewFileversion\FileVersion.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("InternalName",NewFileversion\InternalName.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("LegalCopyright",NewFileversion\LegalCopyright.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("OriginalFilename",NewFileversion\OriginalFilename.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("ProductName",NewFileversion\ProductName.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("ProductVersion",NewFileversion\ProductVersion.s,Buffer2,Coursor)
Coursor=WriteStringFileInfo("Website",NewFileversion\Website.s,Buffer2,Coursor)
;
ReAllocateMemory(Buffer2,Coursor+68)
CopyMemory(Buffer1+lsz-68,Buffer2+Coursor,68):Coursor=Coursor+68
;Laenge korrigieren
PokeW(Buffer2,MemorySize(Buffer2))
PokeW(Buffer2+92,(MemorySize(Buffer2)-160))
PokeW(Buffer2+128,(MemorySize(Buffer2)-196))
;#####Finished neue Resource#####
FreeResource_(hResLoad)
GetModuleFileName_(hExe,pExe,#MAX_PATH)
FreeLibrary_(hExe)
;Beginne mit dem schreiben der Versionsinfos
hUpdateRes = BeginUpdateResource_(pExe, #False);
If hUpdateRes = #Null
ErrorHandler("Could not open file for writing.");
Goto Except
EndIf
If Not UpdateResource_(hUpdateRes, #RT_VERSION, MAKEINTRESOURCE(#VS_VERSION_INFO), MAKELANGID(#LANG_ENGLISH, #SUBLANG_ENGLISH_US), Buffer2, MemorySize(Buffer2))
ErrorHandler("Could not add resource.");
Goto Except
EndIf
If Not EndUpdateResource_(hUpdateRes, #False)
ErrorHandler("Could not write changes to file.");
Goto Except
EndIf
;Wenn alles geklappt hat bekommen wir die Groesse in Bytes zurueck
ProcedureReturn Coursor
;Andernfalls -1
Except:
ProcedureReturn -1
EndProcedure
;Und nun testen wir es:
NewFileversion.StringFileInfo
NewFileversion\CompanyName.s="Test Company"
NewFileversion\Productname.s="Test Productname"
NewFileversion\ProductVersion.s=Test ProductVersion"
NewFileversion\FileVersion.s="Test FileVersion"
NewFileversion\FileDescprition.s="Test FileDescription"
NewFileversion\InternalName.s="Test Internal Name"
NewFileversion\OriginalFilename.s="Test OriginalFilename"
NewFileversion\LegalCopyright.s="Test LegalCopyright"
NewFileversion\Website.s="Test Website"
If ChangeVersionData("C:\Test.exe",NewFileversion)
MessageRequester("Info","Suchsess")
Else
MessageRequester("Info","Failed")
EndIf