?
Hallo,
habe versucht über die winapi Anhand eines VB Beispiels eine Möglichkeit zu schaffen um Speicher freizugeben.
Das Problem ist nur irgendwo in der Übersetzung nach C muss ein Fehler sein,
es passiert das Gegenteil.
Vieleicht kann es einer Lösen!!!!!!!!!
Gruß IcemanX
Übersetzung nach C
int releaseByte = StrToInt(Label_AvailPhysMem->Caption);
LPVOID BaseAddr = VirtualAlloc(0, releaseByte, MEM_RESERVE, PAGE_NOACCESS);
if(BaseAddr == 0){
Application->MessageBoxA("can´t reserve memory for release,\nrelease memory failed!", "", MB_OK + MB_ICONWARNING);
return;
}
BaseAddr = VirtualAlloc(BaseAddr, releaseByte, MEM_COMMIT, PAGE_READWRITE);
if(BaseAddr == 0){
VirtualFree(BaseAddr, 0, MEM_RELEASE);
Application->MessageBoxA("can´t commit memory for release,\nrelease memory failed!", "", MB_OK + MB_ICONWARNING);
return;
}
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
int Granularity = SysInfo.dwAllocationGranularity;
LPVOID ReadAddress;
ReadAddress = (char *) malloc(Granularity*1024);
LPVOID WriteAddress = BaseAddr;
while((int)WriteAddress < (int)BaseAddr + releaseByte){
CopyMemory(WriteAddress, ReadAddress, Granularity);
WriteAddress = (LPVOID)((int)WriteAddress + Granularity);
}
VirtualFree(BaseAddr, releaseByte, MEM_DECOMMIT);
VirtualFree(BaseAddr, 0, MEM_RELEASE);
Orginal VB
Private Sub cbFree_Click()
Dim HowMuch As Long
Dim PagesToFree As Long
Dim BytesToFree As Long
Dim strTemp As String
Dim BaseAddr As Long
Dim WriteAddress As Long
Dim ReadAddress As Long
Dim ProgressVal As Long
On Error GoTo Handler
HowMuch = CLng(txtMB.Text) * nkb * nkb
'Round to a number of pages so an exact number of pages is allocated
PagesToFree = HowMuch / Granularity
BytesToFree = PagesToFree * Granularity
If BytesToFree <= 0 Then
lblCantFree.Caption = "Not a valid positive number"
lblCantFree.Visible = True
Exit Sub
End If
If BytesToFree <= MS.dwAvailPhys Then
lblCantFree.Caption = "That amount is already free"
lblCantFree.Visible = True
Exit Sub
End If
lblPages.Caption = Format$(PagesToFree, fmt)
lblBytesToFree.Caption = Format$(BytesToFree, fmt)
lblCantFree.Visible = False
ProgressBar1.Min = 0
ProgressBar1.Max = PagesToFree
ProgressBar1.Value = 0
ProgressBar1.Visible = True
strTemp = String$(Granularity, Asc("a"))
BaseAddr = VirtualAlloc(ByVal 0&, BytesToFree, MEM_RESERVE, PAGE_NOCACHE Or PAGE_READWRITE)
If BaseAddr = 0 Then
lblCantFree.Caption = "MEM_RESERVE failed"
lblCantFree.Visible = True
Exit Sub
End If
lblBaseAddr.Caption = Format$(BaseAddr, fmt)
Me.Refresh
Me.MousePointer = vbHourglass
BaseAddr = VirtualAlloc(ByVal BaseAddr, BytesToFree, MEM_COMMIT, PAGE_NOCACHE Or PAGE_READWRITE)
If BaseAddr = 0 Then
Call VirtualFree(ByVal BaseAddr, 0&, MEM_RELEASE)
lblCantFree.Caption = "MEM_COMMIT failed"
lblCantFree.Visible = True
Exit Sub
End If
WriteAddress = BaseAddr
ReadAddress = StrPtr(strTemp)
While WriteAddress < BaseAddr + BytesToFree
Call CopyMemory(ByVal WriteAddress, ByVal ReadAddress, Granularity)
WriteAddress = WriteAddress + Granularity
ProgressVal = ProgressVal + 1
ProgressBar1.Value = ProgressVal
Wend
Call VirtualFree(ByVal BaseAddr, BytesToFree, MEM_DECOMMIT)
Call VirtualFree(ByVal BaseAddr, 0&, MEM_RELEASE)
ProgressBar1.Visible = False
Call ShowMemory
Me.MousePointer = vbDefault
Handler:
End Sub