jpd hat geschrieben:
Hallo @All,
vermuten wir das ein Netzwerkkarte zwei IP adressen hat,
und ich nur eine davon ändern möchte, wie macht man das?
Das macht man unter Zuhilfenahme von ts-softs PBOSL_Registry-Bibliothek, indem man die IP-Adressen über die Prozedur Reg_ReadMultiLineString() ausliest, verändert und dann über Reg_WriteMultiLineString() wieder zurückschreibt.
Die PBOSL_Registry Bibliothek hat ts-soft unter diesem Link im englischen Forum vorgestellt:
http://www.purebasic.fr/english/viewtopic.php?t=24614
Und hier kann man sie herunterladen:
http://www.ts-soft.eu/dl/pbosl_registry.zip
Allerdings sieht ts-softs Prozedur Reg_WriteMultiLineString() nicht die Umsetzung von Trennzeichen in Null-Bytes vor. Ich habe daher diese Prozedur entsprechend so modifiziert, daß bei unterschiedlichen Zeichenketten, die durch ein Linefeed (#LF$) getrennt sind, diese Linefeed-Codes durch ein (im ASCII-Modus) bzw. zwei (im Unicode-Modus) Null-Bytes ersetzt werden. In diesem lauffähigen Beispiel wird unter HKEY_CURRENT_USER ein neuer Eintrag "Test" mit dem Schlüssel "Gateway" angelegt, in den zwei IP-Adressen eingetragen werden, die durch ein Null-Byte (ASCII) bzw. zwei Null-Bytes (Unicode) getrennt sind:
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, i.L, NumLF.L, LFPos.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) + 2) * SizeOf(Character))
If Mem
PokeS(Mem, Value)
NumLF = CountString(Value, #LF$)
If NumLF
For i = 1 To NumLF
LFPos = FindString(Value, #LF$, LFPos + 1)
PokeB(Mem + LFPos * SizeOf(Character) - SizeOf(Character), 0)
Next i
EndIf
Error = RegSetValueEx_(hKey, ValueName, 0, #REG_MULTI_SZ, Mem, MemorySize(Mem))
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" + #LF$ + "192.168.0.2")
Neben der Entfernung der zwei in vorigen Postings beschriebenen Bugs habe ich in der Prozedur Reg_WriteMultiLineString() folgende Einfügung vorgenommen, um die Linefeed-Zeichen gegen Null-Bytes auszutauschen, was ja nur im Pufferbereich erfolgen darf, da ein Null-Byte in einem String bekanntlich ein String-Ende anzeigt:
Code: Alles auswählen
NumLF = CountString(Value, #LF$)
If NumLF
For i = 1 To NumLF
LFPos = FindString(Value, #LF$, LFPos + 1)
PokeB(Mem + LFPos * SizeOf(Character) - SizeOf(Character), 0)
Next i
EndIf