Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Binary Class


  • Please log in to reply
5 replies to this topic
nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ich hab mit binarys rumgespielt und dabei ist eine Klasse entstanden die ich dann hier posten möchte.

 

Hier die Class

Class binary  ;4th Attempt
{

__Get(offset,p=0)
{
If offset is number
return this.read(offset)
Else
return this.read(p,offset)
}

__Set(type,offset,set="")
{
If !(type="type"||type="__size"||type="ptr")
{
If type="size"
  return this.resize(offset)
If !strlen(set)
  return this.write(offset,type)
return this.write(set,offset,type)
}

}

__Delete()
{
  return DllCall("GlobalFree", "uint", 0, "ptr", this.__size?this.__size:1)
}

__New(byref size=0,size2=0)
{
this.type:="UInt"
If !(size2)
{
  this.__size:=size?size:3
  this.ptr:=DllCall("GlobalAlloc", "uint", 0, "uint", this.__size, "ptr")
}
Else
{
 this.__size:=size
this.ptr:=size
}
}

Write(nr=0,offset=0,type=0)
{
If offset+3>this.__size
  this.resize(offset+3)
return numput(nr,this.ptr+0,offset,type?type:this.type)
}

CopyInto(target,size=0)
{
If IsObject(target)
{
If (((target.__size<this.__size)&&(!size))||(target.__size<size))
  target.resize(this.__size)
DllCall("RtlMoveMemory","ptr",target.ptr+0,"ptr",this.ptr+0,"UInt",(size?size:this.__size))
}
DllCall("RtlMoveMemory","ptr",target,"ptr",this.ptr+0,"UInt",(size?size:this.__size))
}

CopyFrom(source,size=0)
{
If (this.__size<size)
  this.resize(size)
DllCall("RtlMoveMemory","ptr",this.ptr+0,"ptr",(source+0),"UInt",(size?size:this.__size))
}

Read(offset=0,type=0)
{
If offset+3>this.__size
  return
return numget(this.ptr+0,offset,type?type:this.type)
}

resize(newsize)
{
this.ptr:=DllCall("GlobalReAlloc","ptr",this.ptr+0,"uint",newsize,"UInt",0,"ptr")
this.__size:=newsize
}
}

Hier ein Funktionsbeispiel:

ff:=new binary(7)
ff[0]:=100
ff[4]:=102
ff2:=new binary(11)
ff2[0]:=1
ff2.Write(101,4)
ff2.Write(104,8)
ff.CopyInto(ff2)
msgbox % ff2[0]
msgbox % ff2[4]
msgbox % ff2[8]

Probiert einfach mal aus was damit möglich ist grin.png

Ich freue mich auf eure Kommentare, Verbesserungsvorschläge sind erwünscht.


Visit the new forum ahkscript.org.

http://ahkscript.org


SAPlayer
  • Members
  • 403 posts
  • Last active: Apr 11 2014 04:45 PM
  • Joined: 06 Nov 2012

Bei mir geht dein Beispiel nicht (habe wirklich nur das Beispiel kopiert). Es erscheinen 3 leere MsgBoxen.

 

Mein Code:

Spoiler

 

OS: WIN_8 64bit
AHK: 1.1.10.01 ANSI 32bit



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Versehentlich die falsche Version gepostet :D


Visit the new forum ahkscript.org.

http://ahkscript.org


lasso
  • Members
  • 111 posts
  • Last active: May 19 2013 04:19 PM
  • Joined: 02 Nov 2012

wozu kann man diese klasse missbrauchen ??

 

 

das hier ist doch falsch oder?

__Delete()
{
  return DllCall("GlobalFree", "uint", 0, "ptr", this.__size?this.__size:1)
}

msdn sagt

HGLOBAL GlobalFree(HGLOBAL hMem);

also

DllCall("GlobalFree",ptr,Adresse)


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ja das stimmt.

Es gibt bei dieser Class Probleme bei ReAllocs also empfehle ich eine Start Grösse anzugeben.

d.h. hab ich auch meine Beispiele verändert.


Visit the new forum ahkscript.org.

http://ahkscript.org


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ich arbeite schon an einer neuen Version in der ich anstatt den Global Funktionen die Heap Funktionen benutze.


Visit the new forum ahkscript.org.

http://ahkscript.org