반응형

형식 변환 함수

       

아래의 각 함수는 을 특정한 데이터 형식으로 변환합니다.

구문

CBool(expression)

CByte(expression)

CCur(expression)

CDate(expression)

CDbl(expression)

CDec(expression)

CInt(expression)

CLng(expression)

CSng(expression)

CVar(expression)

CStr(expression)

필수 항목인 expression 인수로는 모든 문자식이나 수식을 사용할 수 있습니다.

반환값

함수 이름에 따른 반환값의 형식은 아래와 같습니다

함수 반환 형식 expression 인수의 범위
Cbool Boolean 적절한 문자식이나 수식
Cbyte Byte 0 - 255
Ccur Currency -922,337,203,685,477.5808 - 922,337,203,685,477.5807
Cdate Date 유효한 모든 날짜식
CDbl Double 음수값인 경우: -1.79769313486232E308 -
-4.94065645841247E-324. 양수값인 경우: 4.94065645841247E-324 - 1.79769313486232E308
Cdec Decimal 소수점 이하 단위가 없는 경우: +/-79,228,162,514,264,337,593,543,950,335 소수점 이하 28자릿수의 값으로서 그 범위는
+/-7.9228162514264337593543950335. 가장 작은 표현 가능한 숫자는 0.0000000000000000000000000001
Cint Integer -32,768 - 32,767. 나머지는 반올림
CLng Long -2,147,483,648 - 2,147,483,647. 나머지는 반올림
CSng Single 음수값인 경우: -3.402823E38 - -1.401298E-45. 양수값인 경우: 1.401298E-45 - 3.402823E38
CStr String CStr에 대한 반환expression 인수에 따라 달라집니다.
Cvar Variant 숫자인 경우: Double과 같은 범위. 숫자가 아닌 경우: String과 같은 범위

출처 - MSDN


반응형

 

 

 : 자주사용하는 함수

 

 : 일반적으로 많이 아는 함수

 

 : 특수한 경우에만 사용하는 함수

 ◈ 함수명 : Abs

 ◈ 함수명 : Array

 형식 : Abs(number)

 형식 : Array(arglist)

 설명 : 가로안의 수치에 대한 절대값을 구합니다.

 설명 : 배열이 포함된 값을 반환합니다.

 예제 : Abs(21.7) ☞ 21.7을 반환합니다.
          Abs(-21.7) ☞ 21.7을 반환합니다.

 예제 : m=Array("월","화","수","목","금","토","일")
          d=m(2) ☞ d에는 "화"가 들어갑니다.

 ◈ 함수명 : Asc

 ◈ 함수명 : Atn

 형식 : Asc(string)

 형식 : Atn(number)

 설명 : 문자열의 첫 글자에 해당하는 문자 코드를 나타내는           integer 값을 반환합니다.

 설명 : 가로안의 수치의 아크탄젠트(arctangent)값을           지정하는 Double을 반환합니다.

 예제 : Asc("A") ☞ 65를 반환합니다.
          Asc("a") ☞ 97를 반환합니다.

 예제 : pi=4*Atn(1) ☞ 원주율의 값을 계산합니다.
          Atn은 삼각함수 Tan의 역함수입니다.

 ◈ 함수명 : Choose

 ◈ 함수명 : Chr

 형식 : Choose(index,선택1,선택2....)

 형식 : Chr(charcode)

 설명 : 인수목록에서 값을 선택하고 그 값을 반환합니다.

 설명 : ASCII코드값에 해당되는 문자를 반환합니다.

 예제 : Gsun=Choose(ind,"빠름","중간","느림")
          ☞ ind값에 따라 선택목록에서 값을 반환합니다.

 예제 : Chr(65) ☞ A를 반환합니다.
          Chr(97) ☞ a를 반환합니다.

 ◈ 함수명 : Command

 ◈ 함수명 : Cos

 형식 : Command

 형식 : Cos(number)

 설명 : 비주얼베이직으로 개발된 실행 프로그램을 시작했던           명령줄의 인수부분을 반환합니다.

 설명 : 특정한 각의 코사인 값을 반환합니다.

 예제 : VB /cmd cmdinsu ☞ cmdinsu는 Command함수에           의해 반환된 인수를 나타냅니다.

 예제 : Cos(30) ☞ Cos 30도 값을 반환합니다.

 ◈ 함수명 : CreateObject

 ◈ 함수명 : CurDir

 형식 : CreateObject(class)

 형식 : CurDir(drive)

 설명 : ActiveX 개체에 대한 참조를 만들거나 반환합니다.

 설명 : 현재 경로를 나타내는 문자열을 반환합니다.

 예제 : CreateObject("Excel.Application)
          ☞ Excel.Application개체에 대한 참조를 만들어               전달합니다.

 예제 : CurDir ("C") ☞ 현재 경로가 "C:\vbasic\연습"이라면           이 경로값을 반환합니다.

 ◈ 함수명 : CVErr

 ◈ 함수명 : Date

 형식 : CVErr(errornumber)

 형식 : Date

 설명 : 사용자가 지정한 오류번호를 반환합니다.

 설명 : 현재의 시스템 날짜를 반환합니다.

 예제 : CVErr(1357) ☞ 사용자정의 오류 번호를 반환합니다.

 예제 : d=Date ☞ d에 현재 시스템 날짜를 반환합니다.

 ◈ 함수명 : DateAdd

 ◈ 함수명 : DateDiff

 형식 : DateAdd(interval, number, date)

 형식 : DateDiff(interval, date1, date2,[firstdayofweek,...])

 설명 : 특정 시간 간격을 포함한 Date값을 반환합니다.

 설명 : 지정된 두 날짜간의 시간 간격을 반환합니다.

 예제 : DateAdd("m", 1, "31-Jul-99") ☞ 99년 7월31에           1개월을 더한 99년 8월 31일 값을 반환합니다.

 예제 : dd=InputBox("Enter a date")
          cha=DateDiff("d", Now, dd)
          ☞ 입력한 날짜와 현재날짜와의 차이값을 반환합니다.

 ◈ 함수명 : DatePart

 ◈ 함수명 : DateSerial

 형식 : DatePart(interval, date[,firstdayofweek...)

 형식 : DateSerial(year, month, day)

 설명 : 관련 자료의 특정부분의 값을 반환합니다.

 설명 : 지정된 년, 월, 일의 값을 반환합니다.

 예제 : dd=InputBox("Enter a date")
          cha=DatePart("w", dd) ☞ 입력받은 날짜의 요일을
          반환합니다.

 예제 : mdate=DateSerial(1980, 5,10)
          ☞ mdate에 1980년 5월 10일의 날짜값을 반환합니다.

 ◈ 함수명 : DateValue

 ◈ 함수명 : Day

 형식 : DateValue(date)

 형식 : Day(date)

 설명 : 날짜값을 반환합니다.

 설명 : 해당월의 날짜를 의미하는 정수값을 반환합니다.

 예제 : DateValue("October 15, 1985)
         ☞ 영문표기법에 의한 날짜값을 반환합니다.

 예제 : mdate=#October 15, 1990#
          m=Day(mdate) ☞ m은 15를 받습니다.

 ◈ 함수명 : DDB

 ◈ 함수명 : Dir

 형식 : DDB(cost, salvage, life, period[,factor])

 형식 : Dir(pathname[,attributes])

 설명 : 특정기간동안 자산의 감가상각값을 반환합니다.

 설명 : 지정된 파일속성등이 일치하는 파일이름을 반환합니다

 예제 : period=((cost-salvage)*factor)/life
          ☞ DDB함수는 윗 공식을 사용하여 주어진 기간동안의           감가상각을 계산합니다.

 예제 : Dir(*.jpg) ☞ 해당 pathname과 일치하는 첫 번째 파일           이름을 반환합니다.

 ◈ 함수명 : DoEvents

 ◈ 함수명 : Environ

 형식 : DoEvents()

 형식 : Environ({envstring | number})

 설명 : 운영체제가 다른 이벤트를 처리할 수 있도록 실행을
          넘겨줍니다.

 설명 : 운영체제 환경변수와 관련된 문자를 반환합니다.

 예제 :  DoEvents() ☞ 파일검색처럼 시작한 후 사용자가 그            프로세스를 취소할 수 있도록 해주는 것과 같은
           간단한 작업에 아주 유용합니다.

 예제 : Environ(Ind) ☞ 환경변수를 읽어들입니다.

 ◈ 함수명 : EOF

 ◈ 함수명 : Error

 형식 : EOF(filenumber)

 형식 : Error(errornumber)

 설명 : Input용으로 열린 파일의 끝에 도달하면 Boolean
          값을 True값을 반환합니다.

 설명 : 주어진 오류번호에 해당하는 오류메세지를 반환합니다

 예제 : Do While Not EOF(1) ☞ 파일의 끝을 확인합니다.

 예제 : Error(1231) ☞ errornumber해당하는 오류메세지를
          반환합니다.

 ◈ 함수명 : Exp

 ◈ 함수명 : FileAttr

 형식 : Exp(number)

 형식 : FileAttr(filenumber, returntype)

 설명 : e(자연로그의 밑)의 거듭제곱수를 반환합니다.

 설명 : Open문으로 연 파일의 파일모드를 반환합니다.

 예제 : Exp(-1 * 1.3)/2 ☞ 쌍곡선 사인값을 반환합니다.

 예제 : FileAttr(FileNum, 1) ☞ Append 파일모드입니다.

 ◈ 함수명 : FileDateTime

 ◈ 함수명 : FileLen

 형식 : FileDateTime(pathname)

 형식 : FileLen(pathname)

 설명 : 파일이 생성되거나 마지막으로 수정된 날짜와 시간을
          반환합니다.

 설명 : 파일 길이를 바이트 수로 반환합니다.

 예제 : FileDateTime("TTFILE") ☞ TTFILE이 수정된 날짜와
          시간을 반환합니다.

 예제 : ms=FileLen("TTFILE") ☞ 파일길이를 반환합니다.

 ◈ 함수명 : Int, Fix

 ◈ 함수명 : Format

 형식 : Int(number), Fix(number)

 형식 : Format(expression, format...)

 설명 : 특정 숫자의 정수 부분을 전달된 형식으로 반환합니다

 설명 : 형식 식의 명령대로 구성된 문자를 반환합니다.

 예제 : Int(99.8) ☞ 99   Int(-99.2) ☞ -100
          Fix(99.8) ☞ 99   Fix(-99.2) ☞ -99 를 반환합니다.

 예제 : Format(53000,"##,###") ☞ 53,000
          Format(2, "0.00%") ☞ 200.00%을 반환합니다.

 ◈ 함수명 : FreeFile

 ◈ 함수명 : FV

 형식 : FreeFile(rangenumber)

 형식 : FV(rate, nper, pmt[,pv,type])

 설명 : Open문에 사용할 수 있는 다음 파일번호를 반환.

 설명 : 정기고정 지불액과 고정 이율을 기준으로 연금에
             대한 미래 가치를 반환합니다.

 예제 : FileNumbr=FreeFile ☞ 사용하지 않은 파일번호를
          가져와서 Open문에서 이용합니다.

 예제 : rate(일정기간당 이율), nper(연금의 총지불 기간수)
          pmt(각 기간에 지불할 금액, PV(장래의 지불액에 대
          한 현재의 값), Type(지불 만기일)

 ◈ 함수명 : GetAllSettings

 ◈ 함수명 : GetAttr

 형식 : GetAllsettings(appname, section)

 형식 : GetAttr(pathname)

 설명 : 윈도우 레지스트리의 응용 프로그램 항목에서 키 설정
          의 이름과 값들의 목록을 반환합니다.

 설명 : 파일, 디렉토리, 또는 폴더속성을 반환합니다.

 예제 : GetAllsettings(appname:="MyApp" , section :=
          "Startup") ☞ 윈도우 .INI파일의 항목을 만들기 위해
          설정된 내용을 표시합니다.

 예제 : r=GetAttr(Fname) And vbArchive ☞ 보관속성이 설정
          되어있다면 0이 아닌값이 되돌려 지고 설정되어 있지
          않으면 반환값은 0입니다.

 ◈ 함수명 : GetAutoServerSettings

 ◈ 함수명 : GetObject

 형식 : object.GetAutoServerSettings([progid,clsid])

 형식 : GetObject([pathname, class])

 설명 : ActiveX 구성요소의 등록상태에 대한 정보를 반환

 설명 : 파일에서 ActiveX개체에 대한 참조를 반환합니다.

 예제 : oRegClass.GetAutoServerSettings ("Hproj.HClass")            ☞ 명명된 원격 등록 개체 정보를 검색하여 반환

 예제 : GetObject("C:\Photo\Cat.psd) ☞ 해당 응용프로
          그램이 시작되고 지정된 파일의 개체가 활성화됩니다.

 ◈ 함수명 : GetSetting

 ◈ 함수명 : Hex

 형식 : GetSetting(appname, section, key[,default])

 형식 : Hex(number)

 설명 : 윈도우 레지스트리에서 키 설정값을 반환합니다.

 설명 : 숫자의 16진수값을 문자값으로 반환합니다.

 예제 : GetSetting(appname:="MyApp", section:="Startup",           key:="Left", defaulf:="25")  ☞ 레지스트리의 키 설정
          값을 반환합니다.

 예제 : mHex=Hex(7) ☞ 7를 반환합니다.
          mHex=Hex(10) ☞ A를 반환합니다.
          mHex=Hex(27) ☞ 1B를 반환합니다.

 ◈ 함수명 : Hour

 ◈ 함수명 : IIf

 형식 : Hour(time)

 형식 : IIf(expr, truepart, falsepart)

 설명 : 시간을 나타내는 0에서 23사이의 정수값을 반환합니다

 설명 : 식을 평가한 결과에 따라 값을 반환합니다.

 예제 : MTime=#3:20:45 PM#.
          MHour=Hour(MTime) ☞ 15값이 반환됩니다.

 예제 : IIf(su>200, dan*su*0.8, dan*su)
          ☞ 주어진 식을 평가하여 참, 거짓문장을 수행합니다.

 ◈ 함수명 : IMEStatus

 ◈ 함수명 : Input

 형식 : IMEStatus

 형식 : Input(number,[#]filenumber)

 설명 : IME모드를 나타내는 값을 반환합니다.

 설명 : Input 또는 Binary 모드로 연 파일로부터 문자가          들어있는 문자를 반환합니다.

 예제 : vbIMEModeNoControl ☞ 0(현재 상태 유지)
          vbIMEModeHangul ☞ 10(한글)

 예제 : Open "TFile" For Input As #1 ☞ 파일을 엽니다.
          MChar=Input(1,#1) ☞ 한 문자를 가져옵니다.

 ◈ 함수명 : InputBox

 ◈ 함수명 : InStr

 형식 : InputBox(prompt[,title,default,xpos, ypos,helpfile])

 형식 : InStr([,start,]string1,string2[,compare])

 설명 : 대화 상자안의 프롬프트를 보여주며, 사용자가 입력을
         하면 입력된 내용을 포함하는 문자열을 반환합니다.

 설명 : 한 문자열안에 특정 문자열이 처음으로 발생한 위치를
          수치값으로 반환합니다.

 예제 : InputBox(msg,"입력연습", "없음")
          ☞ 메시지와 Input박스의 제목과 기본값을 설정합니다.

 예제 : InStr(3,"honggildong","d",1)
          ☞ 3 위치에서 비교시작하여 d가 발견된 8을 반환

 ◈ 함수명 : IPmt

 ◈ 함수명 : IRR

 형식 : IPmt(rate, per, nper, pv[, fv[,type]])

 형식 : IRR(values()[,guess])

 설명 : 정기고정 지불액과 고정이율을 기준으로 일정기간동안
          연금의 이자 지불액을 반환합니다.

 설명 : 일정기간의 자금흐름(지불액과 수령액)에 대한 내부
          수익률을 반환합니다.

 예제 : rate(일정기간 당 이율), per,nper(연금의 총 지불 기간
          수), pv(장래의 지불액이나 수령액에 대한 현재의 값)
          fv(마지막으로 지불한 후에 원하는 장래의 값이나 자금
          잔액), type(지불 만기일)

 예제 : values()(자금 흐름값을 지정하는 Double유형의 배열
          guess(추정치를 지정하는 Variant는 IRR로 얻을 수 있
          습니다. 생략하면 guess는 0.1(10%)이 됩니다.

 ◈ 함수명 : IsArray

 ◈ 함수명 : IsDate

 형식 : IsArray(varname)

 형식 : IsDate(expression)

 설명 : 변수가 배열인지 나타내는 Boolean값을 반환합니다.

 설명 : 식을 날짜로 변환할 수 있는지를 Boolean값으로 반환

 예제 : Dim k(2,3)
          if IsArray(k) ☞ True값을 반환합니다.

 예제 : MDate="#2/18/78#"
          if IsDate(MDate) ☞ True값을 반환합니다.

 ◈ 함수명 : IsEmpty

 ◈ 함수명 : IsError

 형식 : IsEmpty(expression)

 형식 : IsError(expression)

 설명 : 변수가 초기화 되었는지를 Boolean값으로 반환합니다

 설명 : 식이 오류 값인지를 나타내는 Boolean값을 반환

 예  제 : Dim Mchk
            if IsEmpty(Mchk) ☞ True값을 반환합니다.

 예제 : if IsError(Rel)☞ Rel이 오류면 True값을 반환합니다.

 ◈ 함수명 : IsMissing

 ◈ 함수명 : IsNull

 형식 : IsMissing(argname)

 형식 : IsNull(expression)

 설명 : 선택적인 Variant인수가 프로시저에 전달되었는지
          나타내는 Boolean값을 반환합니다.

 설명 : 식이 Null값인지를 Boolean값으로 반환합니다.

 예제 : Function ReT(Optional A)
          If IsMissing(A) ☞ 인수값이 있으면 참값을 반환합니다

 예제 : Myvar=Null
          if IsNull(MyVar) ☞ True값을 반환합니다.

 ◈ 함수명 : IsNumeric

 ◈ 함수명 : IsObject

 형식 : IsNumeric(expression)

 형식 : IsObject(idenfifier)

 설명 : 식을 수로 평가할 수 있는지를 Boolean값으로 반환

 설명 : 식별자가 개체변수인지를 Boolean값으로 반환합니다.

 예제 : su=30
          if IsNumeric(su) ☞ True값을 반환합니다.

 예제 : Dim Mobj As Object
          Set Yobj=Mobj ☞ 개체참조를 지정합니다.
          if IsObject(Yobj) ☞ Treu를 반환합니다.

 ◈ 함수명 : LBound

 ◈ 함수명 : LCase

 형식 : LBound(arrayname[, dimension])

 형식 : LCase(string)

 설명 : 지정된 배열 차원에 사용할 수 있는 가장 작은 첨자를
          포함하는 Long형 값을 반환합니다.

 설명 : 소문자로 변환된 문자값을 반환합니다.

 예제 : Dim Marray(1 To 10, 10 To 20) ☞ 배열변수 선언
          L=LBound(Marray,1) ☞ 1을 반환합니다.

 예제 : k="SEOUL"
          m=LCase(k) ☞ "seoul"를 반환합니다.

 ◈ 함수명 : Left

 ◈ 함수명 : Len

 형식 : Left(string, length)

 형식 : Len(string | varname

 설명 : 문자열의 좌즉에서부터 지정된 수만큼 문자를 반환

 설명 : 문자열의 갯수를 수치로 반환합니다.

 예제 : s="hello chulsu"
          m=Left(s, 3) ☞ "hel"을 반환합니다.

 예제 : Len("chanbin") ☞ 7을 반환합니다.

 ◈ 함수명 : LoadPicture

 ◈ 함수명 : Loc

 형식 : LoadPicture(stringexpression)

 형식 : Loc(filenumber)

 설명 : 폼의 PictureBox컨트롤, Image컨트롤에 그림을 호출

 설명 : 열려있는 파일에서 현재의 R/W위치를 반환합니다.

 예제 : Picture1.Picture=LoadPicture("chan.jpg")
         ☞ 픽쳐박스에 그림을 불러옵니다.

 예제 : MyLocation=Loc(1) ☞ 파일안의 현재위치를 반환

 ◈ 함수명 : LOF

 ◈ 함수명 : Log

 형식 : LOF(filenumber)

 형식 : Log(number)

 설명 : Open문으로 연 파일의 크기를 반환합니다.

 설명 : 특정한 수의 자연로그값을 계산합니다.

 예제 : Flen=LOF91) ☞ 파일의 길이를 구합니다.

 예제 : Log(x) ☞ x값에 대한 자연로그값을 구합니다.

 ◈ 함수명 : LTrim, RTrim, Trim

 ◈ 함수명 : Mid

 형식 : LTrim(string), RTrim(string), Trim(string)

 형식 : Mid(string, start[,length])

 설명 : 지정된 문자열의 좌측, 우측, 양쪽에 공백이 없는 문자
          열을 반환합니다.

 설명 : 한 문자열에서 시작위치에서 지정한 수 만큼이 문자들
          을 반환합니다.

 예제 : k=" seoul "
          m=LTrim(k) ☞ "seoul "을 반환합니다.

 예제 : k="hello chanbin"
          m=Mid(k,7,4) ☞ "chan"을 반환합니다.

 ◈ 함수명 : Minute

 ◈ 함수명 : MIRR

 형식 : Minute(time)

 형식 : MIRR(values(), finance_rate, reinvest_rate)

 설명 : 분을 나타내는 0에서 59사이의 정수값을 반환합니다.

 설명 : 일정기간의 자금흐름에 대한 수정된 내부이익을 지정
          하는 값을 반환합니다.

 예제 : MyTime=#5:38:23# ☞ 시간을 지정합니다.
          m=Minute(MyTime) ☞ 38을 반환합니다.

 예제 : values()(자금흐름값을 지정), finance_rate(재정처리
         비용으로 지불할 이율을 지정), reinvest_rate(자금 재
         투자로 인한 수익에서 받을 이율을 지정)

 ◈ 함수명 : Month

 ◈ 함수명 : MsgBox

 형식 : Month(date)

 형식 : MsgBox(prompt[,buttons, title, helpfile, context])

 설명 : 월을 나타내는 1에서 12사이의 정수값을 반환합니다.

 설명 : 대화 상자안에 메시지를 보여줍니다.

 예제 : Mydate=#October 15, 1990# ☞ 날짜를 지정합니다.
          m=Month(Mydate) ☞ 10을 반환합니다.

 예제 : MsgBox "안녕하세요" ☞ 해당메세지를 보여줍니다.

 ◈ 함수명 : Now

 ◈ 함수명 : NPer

 형식 : Now

 형식 : NPer(rate, pmt, pb[,fv, type])

 설명 : 사용자 컴퓨터 시스템 날짜와 시간을 반환합니다.

 설명 : 정기고정 지불액과 고정이율을 기준으로 연금의 기간
          수를 반환합니다.

 예제 : Td=Now ☞ 현재 날짜와 시간을 반환합니다.

 예제 : rate(일정기간 이율을 지정), pmt(각 기간에 지불할
          지불액), pv(장래의 지불액), fv(마지막으로 지불한후
          에 원하는 장래의 값), type(지불만기일)

 ◈ 함수명 : NPV

 ◈ 함수명 : Oct

 형식 : NPV(rate, values())

 형식 : Oct(number)

 설명 : 정기적인 자금 흐름과 할인율을 기준으로 현재의 순
          투자 가치를 반환합니다.

 설명 : 숫자의 8진수값을 문자로 반환합니다.

 예제 : rate(전 기간에 걸친 할인율을 지정), values()(자금 흐
          름값을 지정)

 예제 : m=Oct(5) ☞ 5를 반환합니다.
          d=Oct(9) ☞ 11을 반환합니다.

 ◈ 함수명 : Partition

 ◈ 함수명 : Pmt

 형식 : Partition(number, start, stop, interval)

 형식 : Pmt(rate, nper, pv[,fv, type])

 설명 : 계산된 범위내이 어느곳에서 숫자가 발생했는지를
          알려주는 문자열을 반환합니다.

 설명 : 정기고정 지불액과 고정이율을 기준으로 연금에 대한
          지불액을 반환합니다.

 예제 : 주어진 범위안에서 주문량을 구하기 위해 많은 사용

 예제 : rate(일정기간 당 이율을 지정), nper(연금의 총 지불
          기간수을 지정), pv((장래의 지불액), fv(마지막으로 지
          불한 후에 원하는 장래의 값), type(지불 만기일)

 ◈ 함수명 : PPmt

 ◈ 함수명 : PV

 형식 : PPmt(rate, per, nper, pv[,fv, type])

 형식 : PV(rate, nper, pmt[,fv, type])

 설명 : 정기고정 지불액과 고정이율을 기준으로 일정기간동안
          연금의 원금 지불액을 반환합니다.

 설명 : 장래의 지불할 정기고정 지불액과 고정 이율을 기준으
          로 연금의 현재 가치를 반환합니다.

 예제 : rate(일정기간 당 이율을 지정), Nper(연금의 총지불
         기간수),pmt(각 기간에 지불할 지불액), fv(마지막으로
         지불한 후에 원하는 장래의 값),type(지불만기일)

 예제 : rate(일정기간 당 이율을 지정), nper(연금의 총 지불
          기간수를 지정), pmt(각 기간에 지불할 지불액), fv(마
          지막으로 지불할 후에 원하는 장래의 값), type(지불
          만기일)

 ◈ 함수명 : QBColor

 ◈ 함수명 : Rate

 형식 : QBColor(color)

 형식 : Rate(nper, pmt, pv, fv[, type, guess])

 설명 : 지정된 색 번호에 대응하는 칼라를 나타냅니다.

 설명 : 연금에 대한 일정기간 당 이율을 반환합니다.

 예제 : QBColor(0) ☞ 검정색을 반환합니다. 1(파랑), 2(초록)
          3(청록), 4(빨강), 5(진홍), 6(노랑), 7(흰색), 8(회색),
          9(연파랑), 10(연초록), 11(연청록), 12(연빨강),
          13(연진홍), 14(연노랑), 15(옅은 흰색)  

 예제 : nper(연금의 총지불 기간수를 지정), pmt(각 기간에
          지불할 지불액을 지정), pv(장래의 지불액이나 수령액
          에 대한 현재의 값을 지정), fv(마지막으로 지불한 후에
          원하는 장래의 값), type(지불만기일), guess(추정치를
          지정하는 Variant는 Rate로 얻음)

 ◈ 함수명 : RGB

 ◈ 함수명 : Right

 형식 : RGB(red, green, blue)

 형식 : Right(string, length)

 설명 : RGB색값을 Long형식의 정수로 반환합니다.

 설명 : 문자열의 우측에서 지정한 수만큼의 문자열을 반환

 예제 : RGB(255, 0, 0) ☞ 빨강색을 반환합니다.
          RGB(0, 0 ,255)) ☞파랑색을 반환합니다.

 예제 : k="hello chanbin"
          m=Right(k, 3) ☞ "bin"을 반환합니다.

 ◈ 함수명 : Rnd

 ◈ 함수명 : Second

 형식 : Rnd(number)

 형식 : Second(time)

 설명 : 난수를 반환합니다.(0에서 1사이의 수치)

 설명 : 초를 나타내는 0에서 59사이의 수를 반환합니다.

 예제 : m=int((Rnd*6))+1 ☞ 1에서 6사이의 난수를 발생합니다

 예제 : MyTime=#2:40:55 PM# ☞ 시간을 지정합니다.
          s=Second(MyTime) ☞ 55를 반환합니다.

 ◈ 함수명 : Seek

 ◈ 함수명 : Sgn

 형식 : Seek(filenumber)

 형식 : Sgn(number)

 설명 : Open문으로 열린 파일안의 R/W의 위치를 반환합니다

 설명 : 특정 숫자의 부호를 수치로 반환합니다.

 예제 : Mc=Input(1, #1) ☞ 데이터의 문자를 읽어드립니다.
          Debug.Print Seek(1) ☞ 디버그창의 바이트 위치를
          출력합니다.

 예제 : m=Sgn(50) ☞ 양수이면 1을 0이면 0을 음수이면 -1을
          반환합니다. 따라서 여기서는 1을 반환합니다.

 ◈ 함수명 : Shell

 ◈ 함수명 : Sin

 형식 : Shell(pathname[, windowstyle])

 형식 : Sin(number)

 설명 : 사용자에 의해 지정된 응용프로그램을 실행합니다.

 설명 : 각도의 사인값을 반환합니다.

 예제 : k=Shell("C:\windows\calc.exe", 1)
         ☞ 계산기를 실행합니다.

 예제 : Sin(30*pi/180) ☞ 사인 30도값을 구합니다.

 ◈ 함수명 : SLN

 ◈ 함수명 : Space

 형식 : SLN(cost, salvage, life)

 형식 : Space(number)

 설명 : 단일 기간 동안의 정액법을 지정하는 값을 반환합니다.

 설명 : 지정된 수의 공백을 반환합니다.

 예제 : cost(초기자산 비용을 지정), Salvage(유용기간이 끝
          나는 시점의 자산액수를 지정), Life(자산의 유용기간
          길이를 지정)

 예제 : m="hello" & Space(10) & "chanbin"
          ☞ 두 문자열 사이에 10 공백을 삽입합니다.

 ◈ 함수명 : Spc

 ◈ 함수명 : Str

 형식 : Spc(n)

 형식 : Str(number)

 설명 : Print메서드에서 출력위치를 지정합니다.

 설명 : 숫자형식의 데이터를 문자열 데이터로 변환합니다.

 예제 : Print spc(5) "chanbin" ☞ 5칸을 띤 후에 출력합니다.

 예제 : Str(390) ☞ "390"를 반환합니다.

 ◈ 함수명 : StrComp

 ◈ 함수명 : StrConv

 형식 : StrComp(string1.string2[, compare])

 형식 : StrConv(string, conversion)

 설명 : 문자열 비교의 결과값을 수치로 반환합니다.

 설명 : 지정된 대로 변환된 문자열을 반환합니다.

 예제 : a="chanbin" b="chanbin"
          StrComp(a, b, 1) ☞ 0을 반환합니다.

 예제 : vbUpperCase(문자열을 대문자로), vbLowerCase(문
          열을 소문자로), vbWide(1바이트문자를 2바이트로)

 ◈ 함수명 : String

 ◈ 함수명 : Switch

 형식 : String(number, character)

 형식 : Switch(expr-1, value-1[,expr-2, value-2....])

 설명 : 지정된 길이의 반복되는 문자열을 반환합니다.

 설명 : 식의 목록식을 평가한 후 목록에서 True값을 갖는 최
          최의 식과 관련된 값이나 식을 반환합니다.

 예제 : String(7, "*") ☞ "*******"을 반환합니다.
          String(10, 65) ☞ "AAAAAAAAAA"을 반환합니다.

 예제 : Switch(CityName="London", "Englich", CityName=
          "Roma", "Italian") ☞ 도시의 이름과 일치하는 언어이
           름을 반환합니다.

 ◈ 함수명 : SYD

 ◈ 함수명 : Tab

 형식 : SYD(cost, salvage, life, period)

 형식 : Tab(n)

 설명 : 지정된 기간동안 자산의 감가상각값을 반환합니다.

 설명 : Print메서드에서 출력위치를 정합니다.

 예제 : cost(초기 자산비용을 지정), salvage(유용기간이 끝
          나는 시점의 자산액수를 지정), life(자산의 유용기간
          길이), period(자산의 감가상각을 계산하는 기간지정)

 예제 : Print Tab(10) "chanbin"
          ☞ 10번째 칸에서부터 "chanbin"을 출력

 ◈ 함수명 : Tan

 ◈ 함수명 : Time

 형식 : Tan(number)

 형식 : Time

 설명 : 각도의 탄젠트값을 반환합니다.

 설명 : 현재의 시스템 시간을 반환합니다.

 예제 : Tan(30*pi/180) ☞ 탄젠트 30값을 구합니다.

 예제 : MyTime=Time ☞ 현재 시스템 시간을 반환합니다.

 ◈ 함수명 : Timer

 ◈ 함수명 : TimeSerial

 형식 : Timer

 형식 : TimeSerial(hour, minute, second)

 설명 : 자정 이후 경과한 초 수를 반환합니다.

 설명 : 특정 시, 분, 초에 대한 시간을 반환합니다.

 예제 : Finish=Timer ☞ 종료시간을 지정합니다.

 예제 : TimeSerial(15, 30,27) ☞ 오후 3시 30분 27을 표현

 ◈ 함수명 : TimeValue

 ◈ 함수명 : TypeName

 형식 : TimeValue(time)

 형식 : TypeName(varname)

 설명 : 시간 값을 포함한 Date값을 반환합니다.

 설명 : 변수에 대한 정보를 제공하는 문자형값을 반환합니다.

 예제 : TimeValue("3:20:32 PM") ☞ 시간을 반환합니다.

 예제 : TypeName(IntVar) ☞ "integer"를 반환합니다.

 ◈ 함수명 : Ubound

 ◈ 함수명 : UCase

 형식 : Ubound(arrayname[, dimension])

 형식 : UCase

 설명 : 배열차원을 나타내는 첨자를 반환합니다

 설명 : 지정한 문자열을 대문자로 변환합니다.

 예제 : Dim Myarray(1 To 10)
          Ubound(Myarray) ☞ 10을 반환합니다.

 예제 : k="chanbin"
          UCase(k) ☞ "CHANBIN"을 반환합니다.

 ◈ 함수명 : Val

 ◈ 함수명 : VarType

 형식 : Val(string)

 형식 : VarType(varname)

 설명 : 문자열내에 포함된 수치를 숫자값으로 변환합니다.

 설명 : 변수의 하위 형식을 나타내는 값을 수치로 반환합니다.

 예제 : Val("3500") ☞ 3500을 반환합니다.

 예제 : IntVar=235
          VarType(IntVar) ☞ 정수를 나타내는 2를 반환합니다.

 ◈ 함수명 : Weekday

 ◈ 함수명 : Year

 형식 : Weekday(date, [firstdayofweek])

 형식 : Year(date)

 설명 : 평일을 나타내는 정수값을 반환합니다.

 설명 : 연도를 나타내는 정수값을 반환합니다.

 예제 : MyDate=#October 26, 2000#
          k=Weekday(Mydate) ☞ Mydate가 목요일을 나타내기
          때문에 5가 k에 반환됩니다.

 예제 : Mydate=#October 26, 2000# ☞ 날짜를 지정합니다.
          k=Year(Mydate) ☞ 2000을 나타냅니다.


<출처: http://www.cancould.com.ne.kr/hamsu.htm >
반응형
※ EVC 4.0
증상: Windows XP sp2 에서 에뮬레이터 실행 안됨

에러메세지
"One or more files from the Emulator for Windows CE installation is missing.
Please reinstall Emulator for Windows CE and try again."

해결:
1. Click Start, click Run, type sysdm.cpl, and then click OK.
2. In the System Properties dialog box, click the Advanced tab.
3. Under Start and Recovery, click Settings.
4. In the Startup and Recovery dialog box, click Edit.
5. Disable PAE mode by removing the /pae option if it exists.
6. Remove the /noexecute option if it exists.
7. Add the /execute option.
8. On the File menu, click Save.
9. To exit Notepad, click Exit on the File menu.
10. To close System Properties, click OK two times.
11. Restart your computer.

boot.ini  파일을 수정하라는 말인데, boot.ini 파일의 원본은 다음과 같음.(파일 전체 내용이 아니라 수정할 부분만 발췌한 것)
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect

이렇게 수정하면 됩니다.
물리주소확장의 여부 관련 설정인듯 하네요.
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /execute=optin /fastdetect
반응형

구조체를 선언할때 보통 아래와 같은식으로 한다.


#pragma pack(push, 1)

  구조체 정의

#pragma pack(pop)



왜냐하면 Win32에서는 기본형이 4Byte이므로 4Byte씩 처리하는것이 가장 빠르다.

그래서 win32에서는 데이타 정렬((Data alignment))을 기본적으로 4Byte씩 하도록 되어있다.


struct A

{

    char a;

    short b;

};

위와 같이 struct가 정의된경우 struct A를 sizeof(A) 하면 얼마일까?


char a  =  1Byte  , short b = 2Byte 이므로 sizeof(A) = 3Byte가 나올까?

그냥하면 3Byte가 아닌 8Byte가 나온다.


위 구조체의 데이타를 같은 구조체에 copy하는데는 문제없겠지만

socket이나 serial로 전송하거나 한다면 문제가 발생할 것이다.


이럴때 데이타정렬을 원하는 size로 하게 하려면

#pragma pack( 1)을 하면 된다.


#pragma pack(push, 1) 

struct A

{

    char a;

    short b;

};

#pragma pack(pop)



#pragma pack(push)  //이전 데이타 정렬 보관

#pragma pack(1)       // 1Byte씩 데이타정렬 설정

...

#pragma pack(pop)   //이전 데이타 정렬 복구



어쩌다 한번씩 깜빡하고 이문제로 해맬때 있다.

혹 모르는 분을 위해..

그리고 스스로 기억을위해 정리해본다.


델파이에서는 packed 키워드를 이용하여 정렬한다.


type
  // Declare an unpacked record
  TDefaultRecord = Record
    name1   : string[4];
    floater : single;
    name2   : char;
    int     : Integer;
  end;

  // Declare a packed record
  TPackedRecord = Packed Record
    name1   : string[4];
    floater : single;
    name2   : char;
    int     : Integer;
  end;

 

참조

http://www.delphibasics.co.uk/RTL.asp?Name=Packed

반응형
 

컴파일러는 사용자가 작성한 코드를 컴파일하기에 앞서 전처리문에서 정의해 놓은 문장들을 먼저 처리한다.

종류로는 #include, #define, #if, #error, #line, #pragma 등이 있다.
이것은 방대한 소스 코드를 지우지 않고 활성화와 비활성화하는 데에 가장 많이 이용된다.
즉, 기존에 있는 소스 코드를 건드리지 않고 부분적인 컴파일을 하는 것이다.

어떤 C 컴파일러는 전처리문의 첫 문자 #이 항상 그 라인의 첫 문자이어야 한다.

ANSI 표준에 따른 C의 전처리문의 종류
- 파일 처리를 위한 전처리문 : #include
- 형태 정의를 위한 전처리문 : #define, #undef
- 조건 처리를 위한 전처리문 : #if, #elif, #ifdef, #elif defined(), #ifndef, #else, #endif
- 에러 처리를 위한 전처리문 : #error
- 디버깅을 위한 전처리문 : #line
- 컴파일 옵션 처리를 위한 전처리문 : #pragma

조건 처리를 위한 전처리문은 어떤 조건에 대해 검사를 하고 그 결과를 참(0이 아닌 값) 또는 거짓(0)으로 돌려준다.
#if : ...이 참이라면
#ifdef : ...이 정의되어 있다면
#else : #if나 #ifdef에 대응된다.
#elif : else + if의 의미
#elif defined() : else + ifdef의 의미
#endif : #if, #ifdef, #ifndef이 끝났음을 알린다.

#include
헤더 파일과 같은 외부 파일을 읽어서 포함시키고자 할 때 사용된다. 이때의 파일은 이진 파일(Binary file)이 아닌 C의 소스 파일과 같은 형태의 일반 문서 파일을 말한다:
#include <stdio.h>        /* 이 위치에 stdio.h라는 파일을 포함시킨다. */
#include "text.h"           /* 이 위치에 text.h라는 파일을 포함시킨다. */

<...>을 사용할 때와 ...을 사용할 때의 차이점은 <...>은 컴파일러의 표준 포함 파일 디렉토리(또는 사용자가 별도로 지정해 준)에서 파일을 찾는 것을 기본으로 한다. 그리고 ...을 사용했을 때는 현재의 디렉토리를 기본으로 파일을 찾게 된다. 아예 디렉토리를 같이 지정할 수도 있다:
#include <C:\MYDIR\MYHEAD.H>
#include "C:\MYDIR\MYHEAD.H"

#define
상수 값을 지정하기 위한 예약어로 구문의 상수로 치환한다. 또한 #define은 함수 역활과 비슷하게 아래와 같이 쓰일 수 있다:
#define SUM(x) ((x) = (x) + (x))

#define으로 정의할 수 있는 것은 숫자만이 아니다:
#define MYNAME "Young Hee"

이렇게 #define으로 정의된 것은 일반적인 변수와는 다르다. 그 차이는 명백하다:
#define MYNAME "Turbo"
char my_name[] = "Turbo"

MYNAME은 전처리문으로 my_name은 문자형 배열 변수로 정의되었다:
printf(MYNAME);
printf(MYNAME);
printf(my_name);
printf(my_name);

이것을 전처리한 상태는 다음과 같이 될 것이다:
printf("Turbo");
printf("Turbo");
printf(my_name);
printf(my_name);

이런 결과에서 우리가 유추해 볼 수 있는 것은 전처리 명령을 사용했을 경우 "Turbo"라는 동일한 동작에 대해서 두개의 똑같은 문자열이 사용됐고, 변수를 사용했을 경우에는 하나의 문자열을 가지고 두번을 사용하고 있다는 것이다. 결과적으로 이런 경우에는 전처리문을 사용했을 경우 메모리 낭비를 가져 온다는 것을 알 수 있다.

#undef
#define으로 이미 정의된 매크로를 무효화한다:
#define ADD(a, b) (a + b)
#undef ADD(a, b)

앞으로 사용되는 ADD(...)는 undefined symbol이 되어 에러 처리된다.

#if ~ #endif
#if 구문은 if랑 아주 비슷하다. 이것은 어떠한 구문을 컴파일 할지 안할지를 지정할 수 있다:
#define A 1

#if A
source code ...
#endif

위 source code 부분은 컴파일이 된다. if문에서와 같이 참, 거짓을 구분하여 컴파일이 된다. 위에서 A값은 1 즉 0보다 큰 수이기 때문에 참인 것이다. 직접 아래와 같이 하면 거짓이기 때문에 source code 부분은 컴파일이 되지 않는다:
#if 0
source code ...
#endif

#if A == 2
source code 2 ...
#elif A == 3
source code 3 ...
#else
source code 1 ...
#endif

#ifdef ~ #endif
컴파일 할 때
#define MYDEF                /* MYDEF는 값은 가지지 않았지만 어쨋든 정의는 되었다 */

#ifdef YOURDEF              /* 만약 YOURDEF가 정의되어 있다면... */
#define BASE 10             /* BASE == 10 */
#elif defined MYDEF                    /* 그외에 MYDEF가 정의되었다면... */
#define BASE 2               /* BASE == 2 */
#endif

BASE는 상수 2로 치환되어 전처리기가 컴파일러에게 넘겨준다.

#ifndef __헤더명_H__ ~ #endif
헤더 파일이 겹치는 것을 막기 위한 일종의 매크로이다. 예를 들어, 헤더 파일에 어떤 클래스의 인터페이스 선언을 넣었다고 하자. 이 클래스 인터페이스에서 다른 파일의 프로토타입이 필요해서 다른 A 파일을 include 하고 있는데 이 헤더 파일을 include 하는 파일에서 A라는 헤더 파일을 이미 include 하고 있다면 두번 define한 것이 된다. 그러면 SYNTEX 에러가 난다. 그래서 그런 것을 막는 방법의 하나로 #ifndef을 사용한다. 이전에 include되어 있으면 #endif 쪽으로 점프해 버려 결국 한번 선언되는 것이다:
#include  <stdio.h>    ------ (a)
#include  <stdio.h>    ------ (b)

이렇게 두번 썼다고 하자. 그런데 앞에서 이미 include 했는데 밑에 또 한다면 문제가 된다. 컴파일러가 검사해야할 코드량도 많아진다. 그래서 stdio.h에는
#ifndef __STDIO_H__
#define __STDIO_H__
...
#endif
가 선언되어 있다. 만약 __STDIO_H__가 선언되어 있지 않다면 선언한다는 뜻이다. 그 뒤 (b)에서는 이미 (a)쪽에서 __STDIO_H__ 을 선언한 상태이기 때문에 전처리기 쪽에서 무시해버린다. 그러므로 컴파일러는 (a)만 검사한다.

#defined
define이 여러 개 되어 있는지를 검사할 때 쓴다. 이것은 여러 개를 동시에 검사 할 수 있다:
#if defined A || defined B
#if (defined A) || (defined B)
#if defined(A) || defined(B)


#ifdef와 #if defined의 차이
#ifdef은 정의가 되어 있는지를 테스트 하기 때문에 한번에 여러 개를 사용할 수 없다:
#ifdef name

여러 개가 정의되어 있는지를 테스트하기 위해서 #if defined를 사용할 수 있다:
#if defined(MACRO1) || defined(MACRO2)

#if는 ||로 중첩해서 사용할 수 있다(형식이 #if expression이므로 C 표현이 올 수 있다):
#if (MACRO1) || (MACRO2)

#error
소스 라인에 직접 에러 메세지를 출력한다. 전처리기가 #error 문을 만나면 그 즉시 컴파일을 중단하고 다음과 같은 에러 메시지를 출력한다:
ERROR : XXXXX.c ########: Error directive: 내용
- XXXXX.c --> 현재 컴파일 중인 파일 명
- ####### --> 전처리기가 #error 문을 만난 시점에서의 행 번호(헤더 포함)

#ifdef __LARGE__
#error This program must be compiled in LARGE memory model!
#endif

이 내용은 만일 프로그램이 LARGE 모델이 아니라면 "#error" 뒤에 표시된 메세지를 출력하고 컴파일을 중지하게 된다.

#line
이 명령은 소스 코드의 행 번호를 지정하기 위한 것으로 주로 컴파일러에 의해 미리 정의된 __LINE__과 함께 사용된다.
__LINE__과 __FILE__을 각각 행 번호와 파일 명으로 변경한다:
#include <stdio.h>
#define DEBUG

void main(void)
{
        int count = 100;

        #line 100               /* 다음 줄번호를 100으로 설정한다 */
                                   /* <-- 이 줄의 번호가 100이다 */
        #ifdef DEBUG        /* <-- 이 줄의 번호가 101이다 */
        printf("line:%d, count = %d\n", __LINE__, count);
        #endif

        count = count * count - 56;
        #ifdef DEBUG
        printf("line:%d, count = %d\n", __LINE__, count);
        #endif
        count = count / 2 + 48;
        #ifdef DEBUG
        printf("line:%d, count = %d\n", __LINE__, count);
        #endif
}

#pragma
컴파일 옵션의 지정. 컴파일러 작성자에 의해서 정의된 다양한 명령을 컴파일러에게 제공하기 위해 사용되는 지시어이다. 컴파일러의 여러 가지 옵션을 명령행에서가 아닌 코드에서 직접 설정한다. #pragma는 함수의 바로 앞에 오며 그 함수에만 영향을 준다.
Turbo C는 9개의 #pragma 문(warn, inline, saveregs, exit, argsused, hdrfile, hdrstop, option, startup)을 지원하고 있다:

#pragma inline
컴파일할 때 어셈블러를 통해서 하도록 지시한다. 즉, 인라인 어셈블리 코드가 프로그램에 있음을 알려준다(명령행 상에서 '-B' 옵션).

#pragma saveregs
이 홉션은 휴즈 메모리 모델에 대해 컴파일된 함수에게 모든 레지스터를 저장하도록 한다.

#pragma warn
이 지시어는 Turbo C에게 경고 메시지 옵션을 무시하도록 한다.

#pragma warn -par
이는 매개 변수(parAMETER)가 사용되지 않았다고 경고(warnING)를 내지 못하도록 한다. 이와 반대되는 표현은
#pragma warn +par

경고의 내용 앞에 (+)를 사용하면 경고를 낼 수 있도록 설정하고 (-)를 사용하면 경고를 내지 못하도록 하는 것은 모든 경고에 대해 동일하다. 명령 행에서는 "-wxxx"로 경고를 설정하고 "-w-xxx"로 경고를 해제한다. 경고의 종류는 무척 많은데 자주 사용되는 것을 아래에 나타냈다. 모든 것을 알고 싶다면 컴파일러 User's Guide의 명령행 컴파일러 부분을 참고하기 바란다:
par : 전해진 파라미터가 사용되지 않음
rvl : void 형이 아닌 함수에서 리턴 값이 없음
aus : 변수에 값을 할당했으나 사용하지 않았음
voi : void 형 함수에서 리턴 값이 사용되었음
sig : 부호 비트(MSB)가 고려되지 않은 형 변환(type-castion)에서 부호 비트를 소실할 수 있음

Standard C pre-defined symbols

__FILE__ a string that holds the path/name of the compiled file
__LINE__ an integer that holds the number of the current line number
__DATE__ a string(Mmm dd yyyy) that holds the current system date
__TIME__ a string(hh:mm:ss) that holds the current system time
__STDC__ defined as the value '1' if the compiler conforms with the ANSI C standard
__cplusplus determines if your compiler is in C or C++ mode. Usually used in headers


#include <stdio.h>

void main(void)
{  
        printf("The path/name of this file is %s\n", __FILE__);  
        printf("The current line is %d\n", __LINE__);  
        printf("The current system date is %s\n", __DATE__);  
        printf("The current system time is %s\n", __TIME__);  

        #ifdef __STDC__  
        printf("The compiler conforms with the ANSI C standard\n");  
        #else  
        printf("The compiler doesn't conform with the ANSI C standard\n");  
        #endif  

        #ifdef __cplusplus  
        printf("The compiler is working with C++\n");  
        #else  
        printf("The compiler is working with C\n");  
        #endif 


프로그래머들 마다 코딩 스타일(암시적 약속)이 있다. 보통 매크로, const 변수는 대문자로 적는 것이 원칙이다. 매크로 함수와 일반 함수, 매크로 대상체(object-like macro)와 일반 변수를 구분하기 쉽게 해주는 것이기 때문이다.

#define STDIO_H_
왜 뒤에 _를 붙였을까? 이것도 하나의 암시적 약속이다. 컴파일러 제작 회사는 매크로를 정의할 때 사용자들과 이름이 충돌이 나지 않게 하기 위해서 대부분 _를 뒤어 덧붙인다. 또한 _를 하나 혹은 두 개 연속으로 시작하는 것은 컴파일러 내부에서 사용하는 매크로라는 성격이 강하다. 물론 강제적인 뜻은 없으며 단지 관습상 그렇다. 왜 이것이 관습이 되었나 하면 보통 매크로 변수 이름이나 함수 이름을 지을 때 뒤에 _를 붙이지 않기 때문이다. 그래서 함수 제작자들이 _를 단골로 붙였다.

<출처 : http://cafe.naver.com/devctrl.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=468 >

반응형
  설명                                                                             스택 프레임                   SP 위치

1. 스택은 현재 초기값(sp) 상태

   이 상태에서 함수호출(CALL nnnn)이 들어오면

 

 ←SP(한칸위를 가리켜야되는데 그림이..)

들어온곳을 가리킴

 

 

 


2. 함수의 인자(두개라고 가정한다.)와 다음 명령어 주소를 차례로 PUSH 한다. 이때 인자의 푸시 순서는는 오른쪽에서 왼쪽으로(FIFO 이므로) 하며 다음 명령어 주소(이것이 복귀 주소이다.)는 IP 에 들어있다.

   그리고 IP를 호출 함수의 시작주소로 변경한다

argument 1

←SP

argument 2

IP(복귀 주소)

 

 

 

 

 


3. IP가 피호출함수의 시작주소로 변경되었으므로 함수가 시작된다. 함수에 진입하면 일단 BP레지스터를 스택에 PUSH한다.(이전 BP를 유지하지 위함. 아래에서 BP 레지스터를 SP를 저장하는 용도로 사용하기 때문에 함수를 여러번 호출할 경우를 대비해 BP를 스택에 넣어두는 것이 필요하다.)

argument 1

←SP

argument 2

IP(복귀 주소)

BP

 

 

 

 


4. 그 뒤 SP를 BP에 옮긴다.(BP=SP). 이것은 함수내에서의 SP 사용으로 SP가 계속 내려가기 때문에 BP를 SP의 저장용도로 사용하기 위함이다.

(이제 PUSH된 BP와 레지스터 BP의 값은 다르다)

 

argument 1

←SP,BP

argument 2

IP(복귀 주소)

BP

 

 

 

 


5. 함수내부에서 스택 사용으로 SP가 증가한다(사용하지 않더라도 상관없다.) 

winapi같은 __stdcall 호출규약을 따르는 프로시저는

사용할 내부변수의 크기를 계산해서

enter x,x 명령어로 sp의 값을 감소시켜준다

(여기선 enter 4,3)

c, c++ 의 __cdecl 호츌규약 프로시저는 수동으로..

argument 1

←BP

←SP

 

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 


6. 함수에서 복귀를 위해(return) SP를 BP로 되돌린다(SP=BP) 

argument 1

←SP,BP

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 


7. SP를 되돌렸으면 POP BP를 하여 스택에 저장되어있던 BP를 다시 BP 레지스터에 저장한다.(이로써 함수 호출 이전의 BP 로 돌아온것) 

POP을 했기 때문에 SP가 하나 증가하여 이제 복귀 주소를 가리키고 있다.

argument 1

 

←SP

 

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 


                                                                                                                     ←SP

8. ret 명령어는 다시 POP IP를 수행한다. 이로써 IP는 저장되어있던 복귀주소 즉 함수호출 CALL nnnn 다음 명령어로 변경된다.

이때 __stdcall을 사용하는 윈도우 프로그램은 ret 뒤의 피연산자로 붙은 4(인자크기 × 인자수)가 SP+4를 수행하여 SP를 4만큼 증가시킨다. (이부분 전체명령어는 ret 4이다. 피호출측에서 스택을 복구 시킨다.)

cdecl을 사용하는 c,c++프로시저는 복귀한뒤에 add, sp+4 를 할 수 있다.(호출측에서 스택을 복구시킨다)

argument 1

 

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 


                                                                                                                      ←SP

9. 최종적으로 IP는 CALL nnnn의 다음 명령어로 변경되었고 SP또한 함수 호출 이전의 상태로 되돌아 왔다.(스택의 내용을 delete 한 것은 아니지만 스택포인터가 증가되어 앞으로 덮어쓰게 될것이므로 지워진것이나 마찬가지이다.)

argument 1

 

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 

 32bit 이상 프로세서 에서는 확장 EBP,ESP 등등으로 바뀐다..


winapi 함수는 __stdcall을 쓰며 피호출 함수안에서 스택을 복구 시켜주고 복귀하며

c, c++ 함수는 __cdecl을 쓰며 호출하는 함수에서 피호출함수가 리턴되면 스택을 복구 시킨다.


enter 명령은 (enter n,0)

    push ebp

    mov ebp,esp

    sub esp,n

세개의 명령과 같고


leave명령은

    mov esp,ebp

    pop ebp

명령과 같다.


함수에서 리턴하려면

enter

leave

ret 명령으로 짝을 이루어야 한다.(스택을 피호출 측에서 복구해야 한다면  'ret 매개변수의 총크기')

반응형
HANDLE WINAPI CreateFile(
            LPCTSTR lpFileName, -1
            DWORD dwDesiredAccess, -2
            DWORD dwShareMode, -3
            LPSECURITY_ATTRIBUTES lpSecurityAttributes, -4
            DWORD dwCreationDisposition, -5
            DWORD dwFlagsAndAttributes, -6
            HANDLE hTemplateFile -7
);

1. 개방할 파일 이름을 지정
2. 일기/쓰기 모드를 지정, or(|) 연산으로 결합 가능
   - GENERIC_READ 읽기 모드 지정
   - GENERIC_WRITE 쓰기 모드 지정
3. 파일 공유방식 지정
   - 0 다른 프로세스에 절대 공유 불가, 이미 개방된 파일은 중복 개방 불가
   - FILE_SHARE_READ 다른 프로세스에서 이 파일에 동신 읽기 접근 가능
   - FILE_SHARE_WRITE 다른 프로세스에서 이 파일에 도시 쓰기 접근 가능. 단 동시에 같은 영여에 데이터를 쓰는 문제를 피해야 함.
4. 보안 속성을 지정
5. 파일이 생성되는 방법을 지정
   - CREATE_ALWAYA 항상 새파일을 생성
   - CREATE_NEW 새 파일 생성(같은 이름 존재->실패)
   - OPEN_ALWAYS 기존 파일 개방, 없으면 생성
   - OPEN_EXISTING 기존 파일 개방, 없으면 실패
   - TRUNCATE_EXISTING 기존 파일의 내용 지우고 개방
6. 파일의 특성 정보를 설정, or(|)연산 가능, 기본설정(FILE_ATTRIBUTE_NORMAL)
7. 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들 때 사용
8. 함수 호출이 성공하면 파일의 핸들 반환.
반응형
HGLOBAL hRe;
char* pText;

hRe=LoadResource(hInst,FindResource(hInst,MAKEINTRESOURCE(IDR_GG2),TEXT("GG")));

pText=(char*)LockResource(hRe);
MessageBox(NULL,pText,"dfd",MB_OK);

FreeResource(hRe);

사용자 리소스를 사용하기 위해서는 리소스 타입를 Custom...에서 이름을 지정해주어야 한다

본인은 위체서 처럼 "GG"라는 이름으로 타입을 지정했다.

리소스를 사용하기 위해서는 일단 해당 리소스를 찾고 로딩하고.. 사용하게 된다.

HRSRC hResc=FindResource(hInst,MAKEINTRESOURCE(IDR_GG2),TEXT("GG"));

는 리소스를 찾는 과정으로 반환값은 HRSRC라는 이름의 핸들러다. 이때 필요한 정보는 인스턴스, 리소스 ID와 소속 타입...(실제론 모든 리소스를 접근하는 표준 방법임)

찾는후에 로딩하는 과정은

HGLOBAL hRe=LoadResource(hInst,hResc);

위와 같이 로딩을 한후에 실제로 사용하기 위해서는 LockResource와 FreeResource를 사용해서 메모리에 실제적으로 적재하거나 해제하는 작업을 시행한다.

char* pText=(char*)LockResource(hRe);
MessageBox(NULL,pText,"dfd",MB_OK);

FreeResource(hRe);

결국 LockResource를 호출하게 되면 해당 데이타에 대한 포인터를 반환하면 적당히 원하는 타입으로 변경하면 된다. 위의 경우엔 char* 로 했다.

사용후에는 hRe를  FreeResource해주면 된다.


OS에서는 메모리가 부족하면 자동으로 리소스 부분을 메모리에서 제거한다. 즉 필요할때 로딩을 언제든지 할수 있으며, 리소스는 메모리 문제로 인해서 제거될수 있는 유동적인 존재다.


따라서 실제 로딩을 하는 것은 LockResource이며 없다면 다시 로딩을 시행할 것이다. 있다면 존재하는 녀석을 반환하게 될 것이다.


FreeResource는 메모리에서 완벽한 제거가 아니라, 메모리가 부족하면 언제든지 메모리에서 제거될수 있다는 것을 부여한다고 보면 되겠다.
-----------------------------------------------------------------------------------------------------

HRSRC FindResource( HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType)


hModule:리소스를 가진 모듈 핸들

lpName:리소스 이름

lpType:리소스 타입


리턴:리소스 핸들 리턴 

ex)FindResource( g_hInstance,MAKEINTRESOURCE(IDR_SPR_TML),"TML" );



숫자로 정의된 리소스 이름을 문자열 형태로 바꿔주는 매크로 ex)MAKEINTRESOURCE(IDR_SPR_TML)  

-------------------------------------------------------------------------------------
SizeofResource 함수는 지정된 리소스의 바이트 단위 크기를 반환한다.

DWORD SizeofResource(
  HMODULE hModule, // resource-module handle
HRSRC hResInfo // resource handle );

Parameters

hModule
그 리소스를 포함하고 있는 실행가능한 파일의 모듈에 대한 핸들
hResInfo
리소스의 핸들. 이 핸들은 FindResource 나 FindResourceEx 함수를 사용해서 생성되어야만 한다.

Return Values

만약 함수가 성공하면 반환값은 리소스의 바이트 숫자 크기이다.

만약 실패하면 반환값은 0이다. 확장된 에러 정보를 원하면 GetLastError을 호출하라.

QuickInfo

  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.
-------------------------------------------------------------------------------------

HGLOBAL LoadResource(HMODULE hModule, HRSRC hResInfo);
hModule: 해당 모듈 핸들
hResInfo : 잀을 리소스 핸들
리턴: 16비트 호환성을 위해 HCLOBAL핸들을 리턴하자민 이 핸들은 
실제로 전역 메모리
핸들이 아닌 단순한 핸들이다,
이렇게 읽은 리소스의 포인터를 얻으려면 LockResource()함수를
써야함...

-------------------------------------------------------------------------------------

LockResource 함수는 지정된 리소스를 메모리에서 잠근다

LPVOID LockResource(
  HGLOBAL hResData   // handle to resource to lock
);
 

Parameters

hResData
잠겨질 리소스의 핸들. LoadResource 함수는 이 핸들을 리턴한다

Return Values

만약 로드된 리소스가 잠기면, 반환값은 리소스의 첫번째 바이트의 포인터이다.
그렇지 않으면 NULL

Remarks

FindeResource 나 FindResourceEX 함수에 의해 반환된 핸들을 사용함으로써
리소스를 잠그려고 시도하면 동작하지 않을 것이다.
당신은 정확하지 않거나 불규칙한 데이터를 가리키는 값을 얻게 될 것이다.

accelerator table, bitmap, cursor, icon, menu 등의 사용을 끝내고
다음 표에 있는 함수 중 하나를 호출해 관련 메모리를 해제할 수 있다.

ResourceRelease function
Accelerator tableDestroyAcceleratorTable
BitmapDeleteObject
CursorDestroyCursor
IconDestroyIcon
MenuDestroyMenu

그것들을 생성한 프로세스가 종료 될 때 시스템은 이들
리소스를 자동으로 제거하지만, 적절한 함수를 호출하는 것은
메모리를 보호하고, 프로세스의 작업량을 줄여준다.

QuickInfo

  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.

반응형

특정 디렉토리 아래에 있는 모든 파일과 디렉토리 혹은 특정 조건의 파일과 디렉토리를 얻고자 한다면, 다음 API 함수를 이용한다.

HANDLE FindFirstFile(LPCSTR lpFileName, LPWIN32_FIND_DATA finddata);
BOOL FindNextFile(HANDLE hFind, LPWIN32_FIND_DATA finddata);
BOOL FindClose(HANDLE hFind);


FindFirstFile : 파일 검색을 시작한다.
파일 검색 문자열이 잘못되었거나 다른 이유로 함수 실행이 실패했을 경우 INVALID_HANDLE_VALUE로 Define된 상수값을 반환한다. 성공했을 경우 파일 검색 핸들을 반환하고 두 번째로 전달되는 구조체에 첫 번째로 발견되는 파일의 정보를 넣어준다.

LPCSTR lpFileName
파일 검색 문자열을 넘겨준다.
예) "c:\*.*" 혹은 "c:\*.txt"

LPWIN32_FIND_DATA finddata
파일 검색 데이터 구조체의 포인터를 넘겨준다.


FindNextFile : 다음 파일의 정보를 얻는다.
함수 실행이 성공하였을 경우 TRUE를, 실패하였을 경우 FALSE를 반환한다. 함수 성공시 두 번째 인자로 전해지는 구조체에 파일의 정보를 넣어준다.

HANDLE hFind
FindFirstFile이 반환한 파일 검색 핸들을 넘겨준다.

LPWIN32_FIND_DATA finddata
파일 검색 데이터 구조체의 포인터를 넘겨준다.

FileClose
: 파일 핸들을 닫는다.
FindFirstFile에 의해 열린 파일 핸들을 닫는다. 성공하였을 경우 TRUE를, 실패하였을 경우 FALSE를 반환한다.
HANDLE hFind
FindFirstFile이 반환한 파일 검색 핸들을 넘겨준다.


 실제 사용 예는 다음과 같다.

Windows 디렉토리의 모든 파일 및 폴더 출력 (Language : c)
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.     WIN32_FIND_DATA FindData;
  8.     HANDLE hFind;
  9.     char path[255];
  10.  
  11.     strcpy(path, "c:\\windows\\*");
  12.    
  13.     hFind = FindFirstFile((LPCSTR)path, &FindData);
  14.     if(hFind==INVALID_HANDLE_VALUE)
  15.         return 0;
  16.    
  17.     do
  18.     {
  19.         printf ("%s\n", FindData.cFileName);
  20.     }while(FindNextFile(hFind, &FindData));
  21.  
  22.     FindClose(hFind);
  23.  
  24.     return 0;
  25. }


(2003/2005)LPCSTR 캐스팅에 문제가 있는 경우 Project -> Properties -> Configuration Properties -> General -> Character Set을 Not Set으로 설정하기 바랍니다.
반응형

Microsoft에서는 프로세스간의 주고 받는 메세지를 후킹할 수 있는 함수를 제공한다.
바 로 SetWindowsHookEx()함수이다. 이 함수를 통해 DLL을 특정 프로세스나 모든 프로세스에 Injection할 수 있다.그리고 User-mode(ring 3)에서 동작하는 Keylogger들 대부분이 이 함수를 사용하여 구현된다.(SetWindowsHookEx()함수를 통해 후킹(Hooking)을 할 경우 전역 후킹이 간단하므로 많이 사용한다.)

먼저 SetWindowsHookEx()함수의 원형부터 알아보자.
(MSDN에 있는 내용이다.)

HHOOK SetWindowsHookEx(
    int idHook,
    HOOKPROC lpfn,
    HINSTANCE hMod,
    DWORD dwThreadId
);

첫번째 파라메터인 idHook 변수는 후킹 하고자 하는 메세지의 ID라고 할 수 있다. WH_GETMESSAGE, WH_KEYBOARD 등 다양한 메세지가 있다.(MSDN 참조)
idHook 파라메터에 지정된 값의 이벤트(메세지)가 발생할 경우 훅 프로시저(lpfb 파라메터에 설정된)가 동작하게 된다. 훅 프로시저는 Injection할 DLL(앞으로 Injected.dll이라 부르겠다)에 지정되어 있어야한다.

/* Injected.dll */
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 /* 원하는 코드 삽입 */
 return CallNextHookEx(0, nCode, wParam, lParam);
};

마 지막에 CallNextHookEx()함수를 호출한 이유는 훅 체인에 있는 다른 훅 프로시저가 해당 메세지를 사용할 수도 있기때문이다. 예를들면 키보드메세지를 후킹하여 Keylogger를 만들었다고 하면 해당 메세지를 후킹 후 로깅을 하고 CallNextHookEx()함수를 통해 처리를 하지 않고 그냥 끝내 버린다면 들통나버릴것이다.

두번째 파라메터는 lpfn이다. 이 파라메터에는 Injected.dll에 지정된  훅 프로시저의 주소값을 지정한다.만약 IdHook에 WH_KEYBOARD를 지정하여 후킹 할경우 해당 훅 프로시저는 KeyboardProc이다. 주소 값을 지정해줘야하는데 하드코딩하여 지정해 줄 수 있지만 LoadLibrary()함수와 GetProcAddress를 이용하여 Injected.dll의 훅 프로시저의 주소를 구할 수 있다.

/* Injector.c */
HMODULE hDll;
unsigned long KeyboardProcAddr;

hDll = LoadLibrary("injected.dll");
KeyboardProcAddr = GetProcAddress(hDll, "KeyboardProc");

다음으로 세번째 파라메터인 hMod를 보자. hMod는 DLL의 핸들(Handle)을 지정해야한다.여기에선 Injected.dll의 핸들을 지정해주면 된다.
이미 Injector.c에서 LoadLibrary("Injected.dll"); 통해 핸들을 얻었으므로 hDll변수를 사용하면 된다.

네 번째 파라메터 dwThreadId는 후킹할 프로세스 즉 Injected.dll을 삽입할 스레드(Thread)의 ID이다. PID라고 하며 해당 파라메터에 0을 지정하면 모든 스레드에 훅(Hook)을 한다는 의미로 전역 훅을 할 수 있다. 특정 스레드에 Injection을 하려고 한다면 "작업관리자"를 통해 PID를 얻어 하드코딩하거나 아래와 같은 방법으로 PID를 얻어 사용할 수 있다.

/* 전역 훅 */
SetWindowsHookEx(WH_KEYBOARD, KeyboardProcAddr, hDll, 0)

/* 지역 훅*/
SetWindowsHookEx(WH_KEYBOARD, KeyboardProcAddr, hDll, GetCurrentThreadID());

dwThreadId 값을 얻기 위한 함수는 많다.

+ Recent posts