Objective_C 2020. 4. 14. 18:46

5. 객체의 새성, 사용 그리고 소멸

5-1. 객체 생성하기(메모리 할당과 초기화

Objective-C 에서는 클래스의 인스턴스를 생성할 때 메모리를 할당하고 초기화를 해야 한다. 아래에 보인 예처럼 메모리 할당과 초기화를 한줄로 처리하는 것이 보통이다.

 

id anObject = [[Rectangle alloc] init]; //Rectangle 생성(alloc)이후 init 함수를 호출해 초기화한다.

 

메모리를 할당하는데 NSObject 클래스의 alloc과 allocWithZone 메소드가 사용되며, 인스턴스 변수들은 모두0으로 초기화된다.

모든 클래스는 이름이 init으로 시작하는 초기화 메소드를 제공해야한다.(직접 정의하거나 다른 클래스를 상속하여 init 메소드를 제공해야 한다). 이때 특별한 인자가 필요하지 않으면 init이라는 이름을 그대로 사용하며, 인자가 필요하면 init 뒤에 적절한 이름을 붙여 사용한다.

예를 들면, 파운데이션 프레임워크의 NSView 클래스는 initWithframe: 메소드를 NSString 클래스는 initWithFormat: 메소드를 가지고 있다. NSObject 클래스도 init 메소드를 제공하는데 이것은 단순히 자기 자신, 즉 self를 돌려주는 역할을 한다.

실제로 프로그램을 작성할 때 파운데이션 프레임워크 내의 수많은 클래스를 가져다 쓰게 되는데, 클래스마다 초기화 메소드의 이름이 다른 경우가 많으므로 관련 문서에서 그 이름 및 사용 방법을 정확히 숙지한 후 사용하는 것이 좋다. 메모리 할당과 초기화를 동시에 수행하는 메소드도 많다.

 

5-1-1 . 초기화 메소드 구현하기

초기화 메소드를 구현하는 방법 및 제약 사항은 다음과 같다.

 

*이름은 init으로 시작한다. -> initWithFormat: initWithObjects: initWithFrame;

*리턴 타입으로 id를 사용한다.

–이것은 해당 클래스를 상속한 자식 클래스도 초기화 메소드를 사용하기 때문이다. 클래스에 따라 리턴 타입이 달라져야 하므로 모든 타입을 다룰 수 있는 id 타입을 사용해야 한다.

*반드시 부모 클래스의 초기화 메소드를 직접 또는 간접으로 호출해야한다.

클래스의 초기화 메소드는 그 부모 클래스의 초기화 메소드를 호출하고, 다시 부모 클래스의 부모 클래스의 초기화 메소드를 호출하고 이런식으로 결국에는 루트 클래스인 NSObject의 초기화 메소드까지 모두 호출되게 된다.

*부모 클래스의 초기화 메소드가 반환하는 값을 self에 할당한다.

클래스 인스턴스의 변수는 크게 '상속을 통해 생성된 인스턴스 변수'와 현재 클래스에서 생성한 인스턴스 변수'로 나뉜다. '상속을 통해 생성된 인스턴스 변수'는 이 과정을 통해 초기화된다.

ex) self = [super initWithFrame:frame]; //부모(super)의 초기화 함수 initWithFrame에 frame인자를 넘겨주며 생성된 객체를 자신이(self)가 받는다.

*인스턴스 변수에 값을 설정할 때 해당 변수에 값을 설정하는 메소드를 호출하는 것보다는 직접 값을 넣는 것이 좋다. 메소드가 실행되는 도중에 예상치 못한 오류가 발생할 수도 있기 때문이다.

 

*초기화 메소드를 종료할 때 반드시 self를 반환한다.

 

-초기화 메소드를 구현한 예이다.

@implementation Rectangle

-(id)init{

return [self initWithWidth:10 height:20];

}

-(id)initWithWidth:(NSInteger)myWidth height:(NSInteger)myHeight{

if(self = [super init])

{

name = nil

width = myWidth;

height = myHeight;

}

Return self;

}

@end

우선 부모 클래스의 초기화 메소드를 호출하고 반환값을 self에 할당한다. 그리고 인스턴스 변수를 별도의 메소드를 사용하지 않고 직접 값을 대입하여 초기화한다. 마지막으로 초기화된 self를 반환한다.

위 예의 클래스는 NSObject를 상속하고 있기 때문에 init 메소드를 호출하고 있는데, 다른 경우에는 부모 클래스의 초기화 메소드 이름을 알아내서 호출해야 할 수도 있다.

initWithWidth:height: 메소드에서 부모 클래스의 초기화 메소드가 돌려주는 반환값을 검사하는 것은 해당 메소드가 실패하여 nil을 반환하는 경우를 처리하기 위해서다. 일반적으로 조건문을 사용하여 그 반환값이 유효한 경우에만 다음 작업을 수행하도록 한다.

 

5-1-2.메모리 할당과 초기화의 결합

파운데이션 프레임워크의 많은 클래스는 메모리 할당과 초기화를 동시에 수행하는 메소드를 제공한다.

즉, 메모리 할당 메소드와 초기화 메소드를 별도로 호출하지 않고 하나의 메소드로 처리하는 것이다. 이러한 클래스 메소드들은 일반적으로 다음과 같이 클래스 이름으로 시작되는 이름을 가진다.

 

*NSString

+(id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc;

+(id)stringWithFormat:(NSString *)format, ….;

*NSArray

+(id)array;

+(id)arrayWithObject:(id)anObject;

+(id)arrayWithObjects:(id)firstObj, …;

 

이 메소드들의 반환 타입이 id인 이유는 초기화 메소드가 반환 타입으로 id를 사용하는 것과 같다.

 

5-2.객체 사용하기 (메모리 관리)

모든 클래스 인스턴스들은 자신이 사용되고 있는 횟수를 알려주는 레퍼런스 카운트(참조 카운트)를 내부에 가지고있다. 이 값은 처음 생성될 때 1이 되고, 쓰이는 곳이 늘어나고 줄어들 때마다 그 값이 증가하고 감소한다. 만약 레퍼러스 카운트가 0이 되면 해당 객체는 메모리에서 해제된다.

객체의 레퍼런스 카운트를 변화시키는 메소드들은 다음과 같다. 메소드 앞에 _가 있으면 클래스 메소드, -이면 인스턴스 메소드다.

메소드

동작

+alloc

인스턴스를 생성 하고

레퍼런스 카운트를 1로 만든다.

-copy

-retain

레퍼런스 카운트를 1 증가시킨다.

-release

레퍼런스 카운트를 1 감소시킨다.

-dealloc

객체를 지운다. 레퍼런스 카운트가 00이 되는 순간 자동으로 호출된다.

+alloc과 –copy메소드는 새로운 인스턴스를 생성한다. 따라서 새로 생성된 인스턴스의 레퍼런스 카운트는 1이된다.

-retain 메소드는 이미 생성되어 있는 클래스 인스턴스를 사용한다. 따라서 해당 인스턴스의 레퍼런스 카운트가 1증가한다.

-release 메소드는 사용중인 인스턴스를 제거한다. 따라서 해당 인스턴스의 레퍼런스 카운트가 1감소한다.

-dealloc 메소드는 변수가 사용하던 메모리를 해제한다.모든 객체가 공통으로 가지고 있는 메소드이다. 이 메소드는 직접 호출되는 것이 아니라 인스턴스의 레퍼런스 카운트가 0이 될대 자동으로 호출된다.

 

ex) Rectangle 클래스의 인스턴스 anObject의 레퍼런스 카운트 변화를 살펴보자

Rectangle *anObject = [[Rectangle alloc] init]; //+alloc메소스 호출에 인스턴스가 생성, 레퍼런스 카운트 1이됨

[anObject retain];     //(2)-retain메소드가 호출되어 레퍼런스 카운트가 증가하여 2가 됨

[anObject release]; //(3)-release 메솓드가 호출되어 레퍼런스 카운트가 감소하여 1이 됨

[anObject release]; //(4)-release메소드가 호출되어 레퍼런스 카운트가 감소하여 0이 됨.

         //이때 카운트가 0이므로 –dealloc 메소드가 자동으로 호출됨

 

ex-2) 실제 상황에 가까운 예

Rectangle *anObject1 = [[Rectangle alloc] init]; //+alloc메소스 호출에 인스턴스가 생성, 레퍼런스 카운트 1이됨

Rectangle *anObject2 = [anObject1 retain]; //anObject1의 retain메소드가 호출되어 레퍼런스 카운트가 증가하여

                //2가 되며, 그 메모리 주소가 반환되어 anObject2는 anObject1와 같은

                //인스턴스를 가리키게된다. 그러므로 레퍼런스 카운트는 그대로 2를 유지

[anObject2 relese]; //anObject1과 anObject2는 같은 주소값의 레퍼런스 카운트를 가지게되어 1이 된다.

[anObject1 release]; // anObject1과 anObject2는 같은 주소값의 레퍼런스 카운트를 가지게되어 0이 되며

         // 두다이때 카운트가 0이므로 –dealloc 메소드가 자동으로 호출됨

[anObject1 setWidth:20 height:40]; //이미 제거되어 유효하지 않으므로 런타임 에러 발생

 

 

5-3 객체 제거하기 (메모리 해제)

5-3-1. 지역 변수의 메모리 해제

-(void)testMethod {

    Rectangle *anObject1 = [[Rectangle alloc] init]; //메모리할당

    ….

    [anObject1 release]; //메소드를 빠져나오기전에 메모리 해제

}

 

5-3-2 인스턴스 변수의 메모리 해제

인스턴스 변수는 일반적으로 클래스 인스턴스가 생성될 때 메모리를 할당하고, 해당 인스턴스가 소멸할 때 메모리를 해제한다.(모두 경우에는 그러한 것은 아니다)

소멸자는 아래와 같이 구현하는데 순서를 절대 바뀌지 않도록 주의

@implementation Rectangle

….

-(void)dealloc

{

[name release]; //자신의 맴버에 할당한 메모리 해제 NSString * name

[super dealloc]; //부모객체 의 dealloc 호출. 순서는 꼭 지켜야한다.

}

 

-소멸자에 의하지 않고 다른 메소드에서 메모리 해제가 일어나는 경우는 드물지 않다.

@implementation Rectangle

….

-(void)setName:(NSString *)myName{

    if(name !=myName){

     [name release]; //(인스턴스 변수에 할당되어 있는 메모리를 해제한다.)

     Name = [myName retain]; //인자로 넘어온 객체를 retain하여 레퍼런스카운트 하나 증가시키고

                 //그 메모리 값을 인스턴스 변수에 넣는다.

    }

}

 

5-3-3.자동으로 메모리 해제하기

메모리해제하는 적절한 시점이 애메할 때

autorelease 메소드를 사용하면 미래의 어느 시점에 메모리를 해제한다.

@implementation Rectangle

….

-(NSString *)description{

    NSString *text = nil;

    text = [[NSString alloc] initWithString:@"Text"];

    [text autorelease];//[text release];로하면 바로 메모리가 해제된다.

 

    return text;

}

@end

일반적으로 autorelease 메소드를 별도의 메모리 해제 과정이 필요하지 않다. 사용은 새로 생성한 객체를 반환할 때 주로 사용한다.

라이브러리 같은 곳에서 autorelease 인지아닌지 확인하는 방법은 규칙을 지키고 있다.

규칙-1. apthem 이름이 alloc 또는 copy로 시작하는 경우 메모리 해제 작업을 실행해야한다.

    NSString *text = [[NSString alloc]initWithString:@"Test"];

    [text release];

 

규칙-2. 메소드 이름이 alloc 또는 copy로 시작하지 않는 경우 autorelease되므로 별도의 메모리해제작업이 필요없다.

    NSString *text = [NSString stringWithString:@"Test"];

 

autorelease 로 해제되는 시점은?

int main(int argc, char *argv[])

{

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //(1)Autorelease Pool생성

    int retVal = UIApplicationMain(argc, argv, nil,nil);    

    [pool release];                     //(2)Pool에 저장되어 있던 메모리해제작업

    return retVal;

}

(1). Autorelease Pool 생성 한다. 이 이후 autorelease를 호출하는 모든 객체는 이 Pool에 저장된다.

(2). 이때 Pool에 저장되어 있던 객체에 대해 메모리 해제 작업이 실행된다.

 

6. 프로퍼티 선언과 구현

6-1.프로퍼티 선언하기

일반적으로 클래스에서 인스턴스 변수를 사용하려면 두개의 메소드(이 둘을 묶어서 '접근메소드'라고 부르기도한다') 두 메소드는 하나는 값을 설정하는 메소드 또하나는 값을 읽어오는 메소드다.

-프로퍼티 선언 .h

#import <Foundation/Foundation.h>

#import "Shape.h"

@class Circle;

@interface Rectangle : Shape {

    @protected

    NSString *name;

    NSInteger width;

    NSInteger height;

}

@property NSString *name;

@property NSInteger width;

@property NSInteger height;

…..

@end;

@property (속성) 타입 이름;

즉 @property 지시어를 사용하면 젭근 메소드가 자동으로 선언된다. 값을 읽어오는 메소드의 이름은 앞에 get이 붙지 않고 인스턴스 변수와 같은 이름을 사용하게 되며, 값을 설정하는 메소드의 이름은 앞에 set이 붙고 변수 이름의 첫 문자가 소문자에서 대문자로 바뀌게 된다.

 

6-2.프로퍼티속성

6-2-1.접근 프로퍼티 메소드 이름 변경

접근 메소드의 이름을 변경하는 프로퍼티 속성은 다음의 두 가지 중 하나이다.

getter=메소드이름    값을 읽어오는 메소드의 이름을 변경한다.

setter=메소드이름    값을 설정하는 메소드의 이름을 변경한다.

@property (getter=getName) NSString *name;

 

6-2-2.읽기/쓰기 권한

접근 메소드의 사용 권한을 조정하는 속성은 다음과 같다.

readwrite    값을 읽어오는 메소드와 값을 설정하는 메소드를 모두 사용할 수 있게한다.

readonly        값을 설정하는 메소드는 사용할 수 없게 만든다.

@property (readonly)NSString *name;

 

6-2-3. 값을 설정하는 메소드의 특성

assign    전달받은 인자에 대해 assign 기능을 수행하고 그 반환값을 인스턴스 변수에 설정 (기본값)

retain 전달받은 인자에 대해 retain 기능을 수행하고 그반호나값을 인스턴스변수에 설정

    인스턴스의 레퍼런스 카운트가 1증가한다.

copy    전달받은 인자에 대해 copy 기능을 수행하고 그 반환값을 인스턴스 변수에 설정

@property (retain)NSString *name;

 

6-2-4. 스레드 안전성

멀티 스레드 한경을 고려할것인지 아닌지 결정하는 속성

atomic    접근 메소드를 호출할 때 멀티 스레드 환경을 고려한다. 기본값

nonatomic 접근 메소드를 호출할 때 멀티 스레드 환경을 고려하지 않는다. (성능은 좋다)

@property (retain, nonatomic) NSString *name;

 

6-3. 프로퍼티 구현하기(.m에 구현)

@synthesize 변수; : 헤더 파일에서 property 지시어로 선언한 인스턴스변수다. 사용자 해당 프로퍼티에 대한 접근 메소드를 제공하지 않으면 컴파일러가 자동으로 메소드를 생성한다. ex) @synthesize name;

@dynamic 변수; : 이것은 프로퍼티에 대한 접근 메소드를 사용자가 직접 구현하거나 프로그램이 실행될 때 동적으로 로드해서 사용하겠다고 컴파일러에게 알리는 효과가 있다. ex) @dynamic name;

주의할점은 헤더파일의 @property 지시어와 소스파일의 @synthesize 지시어가 항상 쌍으로 존재해야한다.

@import "Rectangle.h"

@implementation Rectangle

 

@synthesize name;

@synthesize width;

@synthesize height;

요약

@property type c; //선언

@synthesize c = a; //연결 변수 a를 프로퍼티 c에 연결

 

 

6-4. .을 사용하여 접근 메소드 호출하기

두 방식은 완벽하게 같은 작업을 하는 코드 (width는 프로퍼티 이름)

oldWidth = myRectangle.width;

myRectangle.width = 10

oldWidth = [myRectangle width];

[myRectangle setWidth:10]

'Objective_C' 카테고리의 다른 글

[Objective-C] 기초배우기 (4)  (0) 2020.04.14
[Objective-C] 기초배우기 (3)  (0) 2020.04.14
[Obejective-C] 기초배우기 (1)  (0) 2020.04.13
posted by 핵커 커뮤니티
:
Arduino 2020. 4. 13. 19:15

SerialPort port;//시리얼 포트 만들기 using System.IO.Ports; 를 맨 위에 써주자. port = new SerialPort("COM3", 9600);//이런 식으로 하면 COM3에 9600의 속도로 연결함.

using System;
using System.IO.Ports;
using System.Windows.Forms;
namespace Arduino_SerialTest
{
public partial class Form1 : Form
{
public string setPort;
public int setSpeed;
public SerialPort port;
public Form1()
{
InitializeComponent();
}
//세팅 버튼
private void btnSet_Click(object sender, EventArgs e)
{
try
{
setPort = txtPort.Text;
setSpeed = Convert.ToInt16(txtSpeed.Text);
port = new SerialPort(setPort, setSpeed);
port.Open();//포트 열기
btnSend.Enabled = true;//전송 버튼 활성화
}
catch
{ MessageBox.Show("올바른 값을 입력하거나 연결이 잘 되었는지 확인하세요.";
}
}
//전송 버튼
private void btnSend_Click(object sender, EventArgs e)
{
string sendSirial = txtSend.Text;
port.Write(sendSirial);
txtSend.Text = "";
}
}
}

'Arduino' 카테고리의 다른 글

[Arduino] Blink 소스예제  (0) 2020.04.13
posted by 핵커 커뮤니티
:
JSP 2020. 4. 13. 18:49

web page에서 java code를 사용하려면 기본적으로 .html이 아닌 .jsp파일을 이용한다.

[Java Code 사용을 Declare]

<% JavaCode.... %> 형식을 따른다.

예를 들어 <% int i=0; System.out,.println(i); %> 와 같은 형식으로 한다.
jsp파일에는 자바 코드가 드러나지만, 실제로 실행시키면 사용자에겐 html문서 형식으로 보여지며
JavaCode는 해당 요소로 변환되어 JavaCode는 보이지 않게 된다.

[Variable Print]

단순히 변수의 출력만을 원할 경우에는 <%= Variable %> 와 같은 형식으로 한다.
<% out,println(Variable); %>처럼 쓸 수도 있지만 코드가 길어질 염려가 있다.

[Import Other Class or Package]

<%@page import="Package or Class" %> 처럼 한다.
일반적인 자바의 import [package or class]; 문법과 같다.
효력은 이 태그가 사용된 페이지에 한해 import된다.

예를 들어 <%@page import="java.util.Arrays"%> 했다면


<%
int[] arr= {10,20,30};
out.println(Arrays.toString(arr));
%>

처럼 Arrays Class를 사용할 수 있다.

[Page in Page]

include Attribute를 이용하여 페이지에서 다른 페이지를 포함시킬 수도 있다.
홈페이지의 카테고리와 같이, 여러 페이지에서 공통되게 사용하는 부분들은 따로 만들어서 include하는 방식을 취한다.

<%@ include file="IncludedJSP.jsp" %>

[주석(Comment)]

<%-- --> 또는 자바에서와 같이 //나 /* */ 를 사용한다.

[페이지 속성 정의]
<%@ page language="java" contentType="text/html; charset="EUC-KR"
    pageEncoding="EUC-KR"%>

JSP파일을 만들면 이 태그는 자동으로 생성된다.

어떤 언어를 사용하고, 언어 인코딩 방식은 어떤 것으로 할지 정의하는 부분이다.

EUC-KR을 사용하지 않으면, 영어는 관계없지만 한국어는 문자가 깨져서 출력되게 되므로 반드시 설정한다.

'JSP' 카테고리의 다른 글

[JSP] 쿠키(Cookle) 클라이언트 서버 명령 소스  (0) 2020.04.13
posted by 핵커 커뮤니티
:
C샵 2020. 4. 13. 18:45

 //열기창 생성
OpenFileDialog oDialog = new OpenFileDialog();
oDialog.Filter = "텍스트 파일|*.txt";
//열기창 띄우고 내용 반환
if (oDialog.ShowDialog() == DialogResult.OK)
{
    string a = System.IO.File.ReadAllText(oDialog.FileName, Encoding.Default);
}

posted by 핵커 커뮤니티
:
C샵 2020. 4. 13. 18:42

// 상단에 using지시문 추가
using WinHttp; // 오류가 뜰 경우 참고 추가로 winhttp.dll 추가하시면 됩니다.
// 추가 방법은 찾아보기 - C:\windows\System32 에서 저 winhttp 검색하시면 됩니다. (32비트 기준)
 
// 네이버 계정 및 카페 인증
bool NaverLogin(string ID, string PW)
        {
            WinHttpRequest WinHttp = new WinHttpRequest();
            WinHttp.Open("POST", "https://nid.naver.com/nidlogin.login", false);
            WinHttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            WinHttp.SetRequestHeader("Referer", "https://nid.naver.com/nidlogin.login");
            WinHttp.Send("enctp=2&url=http://www.naver.com&enc_url=http://www.naver.com&postDataKey=&saveID=0&nvme=0&smart_level=1&id=" + ID + "&pw=" + PW);
            WinHttp.WaitForResponse();
            WinHttp.Open("GET", "http://cafe.naver.com/"); // 해당 카페 주소 입력
            WinHttp.Send("");
            WinHttp.WaitForResponse();
            string result = Encoding.Default.GetString(WinHttp.ResponseBody);
            if (result.IndexOf("카페멤버") == -1) // 이건 WinHttp.ResponseText.IndexOf("카페멤버") 이렇게 사용하면 오류가 뜨더라구요
            {
                return false; // 카페 가입이 되어있으면 저 "카페멤버" 라는 글자가 표시되지 않습니다.
            }
            else
            {
                return true; // 카페 가입이 되어있지않으면 저 "카페멤버" 라는 글자가 표시됩니다.
            }
        }
 
이렇게 하시고 버튼 이벤트에
 
// NaverLogin 이 false 값일 경우 (가입 되어있을 경우)
// NaverLogin 이 true 값일 경우 (가입 되어있지 않을 경우)
 if (NaverLogin(textBox1.Text, textBox2.Text) == false)
            {
                // false 값이면 성공
                MessageBox.Show("네이버 인증에 성공하였습니다.", "성공!", MessageBoxButtons.OK);
            }
            else
            {
                // true 값이면 실패
                MessageBox.Show("네이버 인증에 실패하였습니다.", "실패!", MessageBoxButtons.OK);
            }

'C샵' 카테고리의 다른 글

[C#] C# 데이터 타입 배워보기 (종류)  (1) 2020.04.16
[C#] C#의 버전 알아보자  (0) 2020.04.16
[C#] C#이란 무엇일까? 기초알아보기 (1)  (0) 2020.04.16
[C#] TXT 불러오기 소스  (0) 2020.04.13
posted by 핵커 커뮤니티
:
DelPhi 2020. 4. 12. 13:28

type

TArrayScan = record

ScanArray: STring;

Start: DWORD;

Finish: DWORD;

end;

Function GetMask(Array_of_bytes: String): String;

var

x, y: integer;

St: string;

Mask: string;

begin

St := StringReplace(Array_of_bytes, ' ', '', [rfReplaceAll]);

y := 1;

for x := 1 to (Length(St) div 2) do

begin

if (St[y] + St[y + 1]) <> '??' then

begin

Mask := Mask + 'O';

y := y + 2;

end else

begin

Mask := Mask + 'X';

y := y + 2;

end;

end;

Result := Mask;

end;

Procedure StringToArrayByte(Str: string; var Buffer: array of byte);

var

x, y, z: integer;

St: string;

begin

St := StringReplace(Str, ' ', '', [rfReplaceAll]);

y := 1;

for x := 0 to Length(St) div 2 - 1 do

begin

if St[y] + St[y + 1] <> '??' then

begin

Buffer[x] := StrToInt('$' + St[y] + St[y + 1]);

y := y + 2;

end else

begin

Buffer[x] := $00;

y := y + 2;

end;

end;

end;

Function CompareArray(DestAddress:DWORD ;CONST Dest: Array of byte; Source: array of byte;

ALength: integer; Mask: String; var ReTurn : TStringList) : Boolean;

var

x, y: integer;

a, b, c: integer;

begin

for x := 0 to Length(Dest) - Length(Source) do

begin

a:=0;

for y := 0 to Length(Source) - 1 do

begin

if (Dest[x + y] = Source[y]) or (Mask[Y+1] = 'X') then

begin

if y = (Length(Source) - 1) then

begin

Return.Add(IntToHex(DestAddress+x,8));

end;

end else

begin

Break;

end;

end;

end;

Result := True;

end;

Function ArrayScan(Struct: TArrayScan): TStringList;

var

ArrayStruct: TArrayScan;

mbi: Memory_Basic_Information;

StartAdr: DWORD;

FinishAdr: DWORD;

Mask: string;

Str : STring;

Buffer: array of byte;

ScanBuffer: array of byte;

data : COPYDATASTRUCT;

reTurn: TStringList;

begin

//

Str := StringReplace(Struct.ScanArray,' ','',[rfReplaceAll]);

StartAdr := Struct.Start;

FinishAdr := Struct.Finish;

Mask := GetMask(Str);

SetLength(ScanBuffer, Length(Str) div 2);

StringToArrayByte(Str, ScanBuffer);

reTurn := TStringList.Create;

while StartAdr <= FinishAdr - $10 do

begin

VirtualQueryEx(HandleWindow, PDWORD(StartAdr), mbi, sizeof(mbi));

if ((Mbi.RegionSize > 0) and

((Mbi.Type_9 = MEM_PRIVATE) or (Mbi.Type_9 = MEM_IMAGE)) and

(Mbi.State = MEM_COMMIT) and

((Mbi.Protect = PAGE_READONLY) or

(Mbi.Protect = PAGE_READWRITE) or

(Mbi.Protect = PAGE_WRITECOPY) or

(Mbi.Protect = PAGE_EXECUTE) or

(Mbi.Protect = PAGE_EXECUTE_READ) or

(Mbi.Protect = PAGE_EXECUTE_READWRITE) or

(Mbi.Protect = PAGE_EXECUTE_WRITECOPY) )) then

begin

SetLength(Buffer, 0);

SetLength(Buffer, mbi.RegionSize);

ReadProcessMemory(HandleWindow, mbi.BaseAddress, @Buffer[0],mbi.RegionSize, buf);

CompareArray(DWORD(mbi.BaseAddress),Buffer,ScanBuffer,Length(ScanBuffer),Mask,reTurn);

StartAdr := DWORD(MBI.BaseAddress) + MBI.RegionSize;

end else

begin

StartAdr := DWORD(MBI.BaseAddress) + MBI.RegionSize;

end;

end;

data.dwData := 4;

data.cbData := SizeOf(reTurn);

data.lpData := @reTurn;

Result := reTurn;

end;

posted by 핵커 커뮤니티
:
JAVA 2020. 4. 11. 13:46

사이트주소: https://www.java.com/ko/

'JAVA' 카테고리의 다른 글

[JAVA] 간단한 쓰레드  (0) 2020.04.15
posted by 핵커 커뮤니티
:
Python 2020. 4. 11. 13:44

사이트 주소 > https://www.python.org/downloads/

'Python' 카테고리의 다른 글

[Python] 간편 로그인 소스  (0) 2020.04.13
posted by 핵커 커뮤니티
: