PureBasic4.0 hat geschrieben:
Dein Bugfix hat noch eine Macke: Durch die Zeile
Code: Alles auswählen
Mem = AllocateMemory((MemoryStringLength(@Value) + 2) * SizeOf(Character))
werden jetzt zwei Zeilen hinzugefügt.
Sorry
Obwohl ich dies gestern ausgiebig unter WinXP SP2 und WinNT SP6 getestet habe (Unicode bekomme ich unter WinNT allerdings bis jetzt noch nicht in die Registry geschrieben!), ist mir da doch noch ein Fehler unterlaufen: ich wollte die zu ersetzende Zeile so ähnlich wie möglich wie die von ts-softs Originalzeile gestalten. Diese Zeile arbeitet aber wie von Dir erwartet:
Code: Alles auswählen
Mem = AllocateMemory(MemoryStringLength(@Value) * SizeOf(Character) + SizeOf(Character))
Bei mir wird mit dem folgenden Komplett-Beispiel (aus der PBOSL_Registry und mit der oben angegebenen veränderten Code-Zeile) unter WinXP SP2 dieser Test-Eintrag erstellt:
HKEY_CURRENT_USER\Test
und der Schlüssel
Gateway wird dort eingetragen. Wenn man den Schlüssel mit "Binärwert bearbeiten" öffnet, sieht der Inhalt genauso aus wie in Deinem Snapshot bzw. wie mit Windows direkt erstellt.
Code: Alles auswählen
Global Reg_ErrorNr.l, Reg_ErrorMsg.s
Procedure Reg_SetLastError(Error.l = 0)
Protected Buffer.l
If Error
Reg_ErrorNr = Error
Else
Reg_ErrorNr = GetLastError_()
EndIf
FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM, 0, Reg_ErrorNr, 0, @Buffer, 0, 0)
If Buffer
Reg_ErrorMsg = PeekS(Buffer)
LocalFree_(Buffer)
EndIf
EndProcedure
Procedure Reg_ResetError()
Reg_ErrorNr = 0
Reg_ErrorMsg = ""
EndProcedure
ProcedureDLL.l Reg_WriteMultiLineString(topKey.l, KeyName.s, ValueName.s, Value.s); write a StringField, separate with #LF$, to specified ValueName
Protected Result.l, hKey.l, Error.l, dwDisposition.l, Mem.l
Reg_ResetError()
If Right(KeyName, 1) = "" : KeyName = Left(KeyName, Len(KeyName) - 1) : EndIf
Error = RegCreateKeyEx_(topKey, KeyName, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @hKey, @dwDisposition)
If Error = #ERROR_SUCCESS
Mem = AllocateMemory(MemoryStringLength(@Value) * SizeOf(Character) + SizeOf(Character))
If Mem
PokeS(Mem, Value)
Error = RegSetValueEx_(hKey, ValueName, 0, #REG_MULTI_SZ, Mem, MemorySize(Mem) + SizeOf(Character))
If Error = #ERROR_SUCCESS
Result = #True
Else
Reg_SetLastError(Error)
EndIf
FreeMemory(Mem)
Else
Reg_ErrorNr = -1
Reg_ErrorMsg = "can't allocate memory"
EndIf
Else
Reg_SetLastError(Error)
EndIf
If hKey : RegCloseKey_(hKey) : EndIf
ProcedureReturn Result
EndProcedure
Reg_WriteMultiLineString(#HKEY_CURRENT_USER, "Test", "Gateway", "192.168.0.1")