- 캡스톤 디자인 -

웹 디지털 시계

Contents-Based Web Digital Clock

- 결과보고서 -

캡스톤디자인 팀명 : 웹프로(WebPro)

2008년 4월   22일

충북 IT-NURI 사업단

제 출 문
충북IT-NURI 사업단장 귀하
본 보고서를 “웹 디지털 시계” 캡스톤 디자인의 최종 보고서로 제출합니다.
2008 년 4 월 22 일
	팀 대표자 : 장 영 문 (인) 지도 교수 : 홍 장 의 (인)

요   약   문

1. 연구과제명

- 국문 : 웹 디지털 시계

- 영문 : Contents-Based Web Digital Clock

2. 연구개발의 목표 및 중요성

가. 연구개발 목표

- 인터넷 익스플로러에서 사용자가 접근하고 있는 웹사이트 소유 국가의 현재시간과 국기, 국가 정보를 나타내는 익스플로러 기반의 플러그인을 개발하는 것을 목표로 한다.

나. 연구개발의 중요성

- 인터넷 익스플로러 기반 Web Timer는 사용자가 해외여행을 계획하거나 다른 국가의 시간을 함께 보면서 해야 하는 작업을 해야 할 때 유용하게 사용할 수 있다.

- 익스플로러의 Status Bar 부분에 국가의 시간과 국기가 표시되기 때문에 따로 세계시간을 보여주는 프로그램이나 웹페이지를 띄우지 않고도 시간을 확인하면서 작업을 할 수 있다.

3. 연구개발 내용 및 적용기술

가. 연구개발 내용

- 사용자가 웹사이트에 접속을 하면 IP를 요청하여 서버의 IP를 얻고 전 세계의 IP 데이터베이스에서 그 IP가 할당된 국가를 검색한다. 국가정보를 얻은 후 국가정보를 토대로 국가의 시간과 국기를 익스플로러 Status Bar에 나타내준다. 또한 메뉴를 통해 그 나라의 Wikipedia 에 바로 연결하여 국가의 세부정보를 얻을 수 있다.

나. 적용기술

- IE HTML Hooking

- DB형 File System

- Flash Action Script

- ATL/COM

4. 연구개발 결과(작품사진 포함) 및 자체평가

가. 연구개발 결과

①

②

- Web Timer는 두 가지 방식으로 시간을 나타내준다. 그림에 표시된 ②는 익스플로러의 Status Bar에 시간 띄워주는 것이고, ①은 웹페이지 오른쪽 하단에 플래시 파일을 띄워 시간을 표시하는 것이다.

- 위의 화면은 프랑스 정부 사이트(http://www.service-public.fr)에 접속하여 위키 링크와 시간이 출력된 화면이다.

나. 자체평가

- 웹서핑을 하면서 다른 국가의 시간을 보려면 세계시간을 알려주는 웹사이트에 접속하거나 별도의

프로그램을 사용하지 않아도 되기 때문에 쉽게 사용할 수 있다.

- 웹사이트의 서버가 다른 국가에 위치했을 경우 IP가 할당된 국가가 다른 국가이기 때문에 사용자가 원하는 국가의 시간이 나타나지 않는다.

- 웹사이트 마다 사용하는 Java script를 제한하는 곳들이 있기 때문에 Flash 출력이 제한되기도 한다.

5. 기대효과 및 향후 발전 내용

가. 기대효과

- 글로벌 시대를 살아가면서 다른 국가로의 여행이나 업무등을 추진할 때 무엇보다 중요한 것은 시간이다. 사용자가 접근하고 있는 웹사이트의 시간을 사용자에게 인식시켜 줌으로써 효율적인 계획 수립 및 업무 처리가 가능해지게 된다.

나. 향후 발전 내용

- 현재의 대부분의 컴퓨터 사용시간의 대부분은 웹브라우저를 통하여 이루어지고 있다. 웹브라우저를 사용하는 사람들이 늘어날수록 더욱 더 많은 기능에 대한 요구가 늘어나게 된다. Web Timer를 개발한 기술을 토대로 더욱 더 다양한 확장기능을 만들어 제공할 수 있다.

- 구체적으로 현재 개발된 Web Timer는 웹 사이트가 위치한 서버의 국가 IP를 이용하여 단지 한 가지 나라의 시간을 출력해 주지만 사용자가 요구하는 다른 국가의 시간을 출력해주는 기능을 추가한다.

- 사용자가 원하는 국가와 시간에 대한 스케쥴이 있을 경우 국가, 시간, 내용을 입력받아 입력받은 시간이 되면 스케쥴을 간략화 하여 이벤트를 발생시켜 주는 기능을 추가한다.

목    차

1. 연구개발 목표 ----------------------------------------------- 1

1.1 연구개발 배경

1.2 연구개발 목표

2. 연구개발 내용 및 적용기술 -------------------------------------- 2

2.1 연구개발

2.2 적용기술

3. 연구개발 결과 및 자체평가 -------------------------------------- 3

3.1 연구개발 결과

3.2 자체평가

4. 기대효과 및 향후활용 ------------------------------------------ 4

4.1 기대효과

4.2 향후활용

5. 연구추진 일정 계획 대비 결과표 ---------------------------------- 5

6. 캡스톤 디자인 참여인원 명부 ------------------------------------ 5

7. (첨부) 프로그램 소스 ------------------------------------------  6

8. 참고문헌 --------------------------------------------------- 17

1. 연구 개발 목표

1.1 연구개발 배경

- 최근 국제적인 경제 행위들의 증가로 인해 외국의 소비자 혹은 국가를 상대로 영업을 해야 하는 경우가 많아졌다. 그로 인해 실제 적인 접근을 위하여 시간을 확인하는 일을 반복하게 되었다. 이것으로 인해 매번 국제시간을 검색하는 사이트를 이용하거나 시간 기능을 제공하는 별도의 시계를 사용하여 시간을 확인하는 방법보다 편리하고 즉시적으로 작동할 수 있는 기능을 필요로 하게 되었다.

1.2 연구개발 목표

- 사용자가 접속한 사이트의 IP를 이용하여 해당 국가의 정보를 얻어오며 각 국가의 시간을 GMT 기준으로 출력하여 사용자가 필요로 하는 정보를 제공한다.

- 구현 형태는 IE(Microsoft Internet Explorer)의 Plug-in 형태로 구현한다.

- 사용자 편의를 위한 UI 와 충분한 정보를 제공한다.

2. 연구 개발 내용 및 적용기술

2.1 연구개발

- IP to Time : 사이트 URL 을 이용하여 IP 를 얻은 후 이 정보를 이용하여 할당된 국가와 GMT 정보를 이용하여 각 국가의 시간 얻는다.

- Html Hooking : IE 내부의 html 처리 과정 중에 나타는 자료를 후킹하여 개발자가 원하는 html 코드를 삽입한다.

- b-search file system : 바이너리 검색 형태로 이루어진 500만건의 db내부를 검색하는 검색 파일 시스템을 구현한다.

2.2 적용기술

- Flash Action Script

: Adobe 사의 Flash 내부의 스크립트 언어

- B-tree Search

: 500만건의 DB를 검색하기 위한 바이너리 검색

- ATL/COM

: IE 내부 쉘 프로그래밍 에 사용되는 Template Library

- IE hooking

: 웹페이지 html 정보에 flash clock 을 추가하기 위하여 사용된 hooking

3. 연구 개발 결과 및 자체평가

3.1 연구개발 결과

①

②

- Web Timer는 두 가지 방식으로 시간을 나타내준다. 그림에 표시된 ②는 익스플로러의 Status Bar에 시간 띄워주는 것이고, ①은 웹페이지 오른쪽 하단에 플래시 파일을 띄워 시간을 표시하는 것이다.

- 위의 화면은 프랑스 정부 사이트(http://www.service-public.fr)에 접속하여 위키 링크와 시간이 출력된 화면이다. 하단의 프랑스 국기와 GTM기준의 시각이 표시되어있다. (위의 사진을 캡춰한 시간은 우리나라 시간으로 오후 9시 21분 이었다)

3.2 자체평가

-	웹서핑을 하면서 다른 국가의 시간을 보려면 세계시간을 알려주는 웹사이트에 접속하거나 별도의 프로그램을 사용하지 않아도 되기 때문에 사용자에게 편리함을 줄 수 있다. 시계를 보기위한 웹페이지를 사용하거나 별도의 프로그램을 사용할 경우 화면의 일부를 사용해야 하기 때문에 컴퓨터 화면을 넓게 사용하지 못하지만 이프로그램은 웹브라우저의 Status Bar부분만을 사용하기 때문에 화면을 넓게 사용할 수 있고 불필요한 Alt-Tab작업등을 줄일 수 있다.

- 웹사이트의 서버가 다른 국가에 위치했을 경우 IP가 할당된 국가가 다른 국가이기 때문에 사용자가 원하는 국가의 시간이 나타나지 않는다.

예를들어 사용자가 중국의 웹사이트에 접속하였고 중국 현지의 시간을 표시해주기를 원하였는데 그 웹사이트의 서버가 일본에 위치하고 있을 경우 사용자의 웹브라우저에는 일본의 국기와 시간이 나타나게 된다. 이러한 문제점을 해결하기 위해 다양한 방법(국가도메인 사용이나 웹페이지 내의 문자 인식)등을 사용하여 해결해보려 시도하였으나 해결하지 못하였다.

- 웹사이트 마다 사용하는 Java script를 제한하는 곳들이 있기 때문에 Flash 출력이 제한되기도 한다. 플래시 디지털 시계는 웹브라우저가 다운로드받은 웹페이지에 플래시 디지털 시계를 출력해주는 Java script를 추가로 삽입하여 화면에 보여주는 방식을 사용한다. 하지만 몇몇 웹사이트는 웹사이트 보안등의 이유로 Java script의 몇 가지 기능을 사용할 수 없도록 제한한다. 이러한 경우 Java script를 추가하여도 사용자에게는 플래시 디지털 시계가 출력되지 않는다.

4. 기대효과 및 향후활용

4.1 기대효과

- 글로벌 시대를 살아가면서 다른 국가로의 여행이나 업무등을 추진할 때 무엇보다 중요한 것은 시간이다. 사용자가 접근하고 있는 웹사이트의 시간을 사용자에게 인식시켜 줌으로써 효율적인 계획 수립 및 업무 처리가 가능해지게 된다. 이러한 기능은 여행사나 호텔, 글로벌 기업등에서 유용하게 사용될 수 있다.

4.2 향후활용

- 현재의 대부분의 컴퓨터 사용시간의 대부분은 웹브라우저를 통하여 이루어지고 있다. 웹브라우저를 사용하는 사람들이 늘어날수록 더욱 더 많은 기능에 대한 요구가 늘어나게 된다. Web Timer를 개발한 기술을 토대로 더욱 더 다양한 확장기능을 만들어 제공할 수 있다.

- 구체적으로 현재 개발된 Web Timer는 웹 사이트가 위치한 서버의 국가 IP를 이용하여 단지 한 국가의 시간을 출력해 주지만 향후 사용자에게 2~3개 정도의 국가시간을 표시해 줄 수 있도록 하여 사용자에게 한번에 많은 정보를 제공해 줄 수 있다.

- 사용자가 원하는 국가와 시간에 대한 스케줄이 있을 경우 국가, 시간, 내용을 입력받아 입력받은 시간이 되면 스케줄을 간략화 하여 이벤트를 발생시켜 주는 기능을 추가함으로써 다양한 시간대 사이에서 효과적으로 업무를 수행할 수 있게 해줄 수 있을 것이다.

5. 연구 추진 일정 계획 대비 결과표

6. 캡스톤 디자인 참여인원 명부

소속	학번	성명	연구분야	연락처
컴퓨터공학	2002036202	장영문	ATL/COM	019-332-5856
컴퓨터공학	2002036274	조항두	IEHTML- Hooking	010-6484-8379
컴퓨터공학	2002018202	최원경	java script	010-4029-0903
컴퓨터공학	2003053429	오철원	flash/action script	n010-4805-3706

7. (첨부) 프로그램 소스

- worldclock.cpp

#include "stdafx.h"

#include "worldclock.h"

using namespace std;

extern HWND g_hWndNewPane;

HBITMAP g_FlagImg;

worldclock::worldclock(void)

: m_min(0),m_hour(0)

, m_bRedraw(false)

{

m_bOnce = false;

//m_hFlag = NULL;

}

unsigned long worldclock::addToDec(char* p_ip)

{

char ipAddress[20];

char hexString[9];

int a,b,c,d;

unsigned long decimal = 0;

char* endptr;

if(!strlen(p_ip))

return 0;

strcpy(ipAddress, p_ip);

sscanf(ipAddress, "%d.%d.%d.%d", &a, &b, &c, &d);

sprintf(hexString, "%02X%02X%02X%02X", a,b,c,d);

decimal = strtoul(hexString, &endptr, 16);

return decimal;

}

//unsigned dbSearch(unsigned long p_target)

bool worldclock::dbSearch(sRecord *rec, unsigned long p_target)

{

int dataSize = 18;

unsigned long l = 0;

unsigned long u = 4900000-1;

unsigned long m = 0;

unsigned long t = p_target;

sRecord data1;

char FullPath[255]="";

GetModuleFileName(NULL, FullPath, 255);

CString ExPath = FullPath;

ExPath.Delete(17,30);

ExPath += "worldclock\\outbin.dat";

ifstream inData(ExPath.GetBuffer(255), ios::in|ios::binary);

if(!inData){

cout<<"Can't Open File"<<endl;

return false;

}

int a = 0;

while(l<=u)

{

a++;

if(a>100)

break;

m = (l+u)/2;

inData.seekg(m*18, ios_base::beg);

inData.read((char*)&data1, dataSize);

if(data1.num1 < t && data1.num2 < t){

l=m+1;

}

else if(data1.num1 <= t && t <= data1.num2)	{

memcpy(rec, &data1, sizeof(sRecord));

inData.close();

return true;

}

else if(data1.num1 > t && data1.num2 > t)

{

u = m-1;

}

}

inData.close();

return false;

}

bool worldclock::IpToLocation(sRecord *rec, char* ipaddr)

{

unsigned long result=0;

result = addToDec(ipaddr);

return dbSearch(rec,result);

}

void worldclock::GetURLtoStr(CComPtr<IWebBrowser2> WebBrowser, char *str)

{

CComBSTR bstrUrl;

HRESULT hRes = S_OK;

hRes = WebBrowser->get_LocationURL(&bstrUrl);

if(bstrUrl.Length() == 0)

return;

else

{

CString strUrl = CString(bstrUrl);

if(m_sOriginalURL.Compare(strUrl)){

m_sOriginalURL = strUrl;

m_bOnce = false;	//새로운 사이트가 로드된 시점

}

char buf[256] = "";

strUrl.Delete(0,7);

int pos = strUrl.Find('\/');

if(pos != -1)

strncpy(buf, strUrl.GetBuffer(255), pos);

if(!strcmp(buf, m_sURL))

return;	//URL 이 같다면 하위는 안하고 패스

strcpy(m_sURL, buf);	//URL 저장

struct sockaddr_in name;

memset((char*)&name, 0, sizeof(name));

struct hostent *phe;

char *ipaddr;

in_addr addr;

phe = gethostbyname(buf);

sRecord sitelocation;

if(phe != NULL)

{

CopyMemory(&addr, phe->h_addr_list[0], sizeof(in_addr));

ipaddr = inet_ntoa(addr);

if(!strcmp(ipaddr, m_sIP))

return;	//같으면 탈출

strcpy(m_sIP, ipaddr);	//저장

//ip 를 얻어온다.

IpToLocation(&sitelocation,ipaddr);	//ip로 db에 접근해 국가코드와 gmt를 가지고 온다.

strncpy(m_sCurrentCountry,sitelocation.nation1,2);

m_sCurrentCountry[3] = '/0';	//국가코드저장

m_iGMT=sitelocation.time;	//gmt저장

LoadFlag(m_sCurrentCountry);

}

}

}

void worldclock::GMTTimeToStr(char* result, int GMT)

{

time_t t;

tm *gmtm = NULL;

time(&t);

t += GMT * 3600;

gmtm = gmtime(&t);

sprintf(result, "%02d:%02d\0", gmtm->tm_hour, gmtm->tm_min);

if(gmtm->tm_min!=m_min)

{

m_min = gmtm->tm_min;

m_bRedraw = true;

}

if(gmtm->tm_hour != m_hour)

{

m_hour = gmtm->tm_hour;

m_bRedraw = true;

}

//_strtime( result );

}

bool worldclock::GetTime(char * stime)	//출력을 위한 시간을 가져오는 함수

{

GMTTimeToStr(stime, m_iGMT);

return false;

}

bool worldclock::LoadFlag(char * name)

{

char filename[255] = "";

char FullPath[255]="";

GetModuleFileName(NULL, FullPath, 255);

CString ExPath = FullPath;

ExPath.Delete(17,30);

sprintf(filename, "%sworldclock\\flagbmp\\%s.bmp",ExPath.GetBuffer(255), name);

if(m_hFlag)

DeleteObject(m_hFlag);

m_hFlag = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);

return false;

}

HBITMAP worldclock::GetFlagImg(void)

{

return (HBITMAP)m_hFlag;

}

bool worldclock::isRedraw(void)

{

if(m_bRedraw){

m_bRedraw = false;

return true;

}

else{

return false;

}

return false;

}

int worldclock::ChangeHtml(IHTMLDocument2* pElement)

{

IHTMLElement* pElementBody = NULL;

HRESULT hr = pElement->get_body(&pElementBody);

if (FAILED(hr))	return FALSE;

if( !pElementBody )	return FALSE;

BSTR bstrHTMLText = (BSTR)"";

//if(bstrHTMLText == NULL)

//	return 0;

try{

hr = pElementBody->get_outerHTML(&bstrHTMLText);

}catch(string str)

{

}

if (FAILED(hr))

{

return FALSE;

}

if(m_bOnce==false)

{

char m_cGMT[255];

CComBSTR    bstrTest(_T("<BR><SCRIPT DEFER LANGUAGE=\"JScript\">\n"));

bstrTest += _T("<!--\n");

bstrTest += _T("function scrollLayer(p_obj_name) \n");

bstrTest += _T("{ \n");

//bstrTest += _T("alert('하하하하하하');\n");

bstrTest += _T("    var startY_point, endY_point, startX_point, endX_point, timer; \n");

bstrTest += _T("    var xMax = document.body.offsetWidth, yMax = document.body.offsetHeight;\n ");

bstrTest += _T("    var obj_layer   = document.getElementById(p_obj_name);\n ");

bstrTest += _T("    startY_point = parseInt(obj_layer.style.top, 10); \n");

bstrTest += _T("    startX_point = parseInt(obj_layer.style.left, 10); \n");

bstrTest += _T("    p_gap_Ypoint = parseInt(yMax)-160; \n");

bstrTest += _T("    p_gap_Xpoint = parseInt(xMax)-160; \n");

bstrTest += _T("    if ( startY_point < p_gap_Ypoint )    startY_point = p_gap_Ypoint;\n");

bstrTest += _T("    if ( startX_point < p_gap_Xpoint )    startX_point = p_gap_Xpoint;\n");

bstrTest += _T("    endY_point   = parseInt(document.body.scrollTop + p_gap_Ypoint); \n");

bstrTest += _T("    endX_point   = parseInt(document.body.scrollLeft + p_gap_Xpoint); \n");

bstrTest += _T("    limitY_point = parseInt(window.document.body.scrollHeight) -10; \n");

bstrTest += _T("    limitX_point = parseInt(window.document.body.scrollWeight) -10; \n");

bstrTest += _T("    if ( endY_point > limitY_point )  endY_point = limitY_point; \n");

bstrTest += _T("    if ( endX_point > limitX_point )  endX_point = limitX_point; \n");

bstrTest += _T("    if ( startY_point != endY_point ) \n");

bstrTest += _T("    { \n");

bstrTest += _T("        scrollY_amount = Math.ceil( Math.abs( endY_point - startY_point ) / 15 ); \n");

bstrTest += _T("        obj_layer.style.top = parseInt(startY_point, 10) + ( ( endY_point < startY_point ) ? -scrollY_amount : scrollY_amount ); \n");

bstrTest += _T("    } \n");

bstrTest += _T("    if ( startX_point != endX_point ) \n");

bstrTest += _T("    { \n");

bstrTest += _T("        scrollX_amount = Math.ceil( Math.abs( endX_point - startX_point ) / 15 ); \n");

bstrTest += _T("        obj_layer.style.left = parseInt(startX_point, 10) + ( ( endX_point < startX_point ) ? -scrollX_amount : scrollX_amount ); \n");

bstrTest += _T("    } \n");

bstrTest += _T("    timer = window.setTimeout (\"scrollLayer('\" + p_obj_name + \"', \" + p_gap_Ypoint + \", \" + p_gap_Xpoint+\");\", 1); \n");

bstrTest += _T("} \n");

bstrTest += _T("//-->\n");

bstrTest += _T("</SCRIPT>");

//bstrTest += _T("<div id=\"objLayerRightMenu\" style=\"position:absolute; left:1000px; top:500px; z-index:3;\">하하하하하</div>");

bstrTest += _T("<div id=\"objLayerRightMenu\" style=\"position:absolute; left:900px; top:500px; z-index:3;\" onresize=return >\n<embed src=\"http://pdapro.cbnu.ac.kr/blog/WorldWatch.swf\" FlashVars=\"namooya=" );

bstrTest += _T(m_sCurrentCountry);

bstrTest += _T("&gmt=");

sprintf(m_cGMT,"%d",m_iGMT);

bstrTest += _T(m_cGMT);

bstrTest += _T("\" width=150 height=150></embed></div>"); //플래시

//bstrTest.AppendBSTR(bstrHTMLText);

//CComBSTR    bstrTest(_T("<script language=\"javascript\" src=\"file:///c:/abc.js\"></script>"));

//bstrTest.AppendBSTR(bstrHTMLText);

/*bstrTest += _T("&nbsp;<script language=\"JavaScript\" Event=\"onLoad\" For=\"window\"><!--centerWindow();//-->");*/

/*bstrTest += _T("<div id=divMenu style=\"position:absolute; left:600; top:50\"><table width=\"100\" height=\"100\" border=\"1\" bgColor=gold><tr><td></td></tr></table></div>

<script language=javascript src="c:\view.js"></script> ");*/

pElementBody->insertAdjacentHTML(CComBSTR(_T("afterBegin")), bstrTest);

//m_pElementBody->put_innerHTML(bstrTest);

//MessageBox(0, bstrTest, 0, 0);

IHTMLWindow2* pWin = NULL;

hr = pElement->get_parentWindow(&pWin);

if( FAILED(hr) )	MessageBox(0, _T("get_parentWindow Error"), 0, 0);

CComVariant varRet;

//pWin->navigate(CComBSTR(_T("javascript:OnLoad();")));

hr = pWin->execScript(CComBSTR(_T("scrollLayer('objLayerRightMenu')")), CComBSTR(_T("JScript")), &varRet);

m_bOnce=true;

}

return TRUE;

}

bool worldclock::GetCode(char * code)

{

strcpy(code,m_sCurrentCountry);

return true;

}

dbsearch.cpp

#include "stdafx.h"

#include <iostream>

#include <fstream>

#include <string>

#include <stdio.h>

#include "dbsearch.h"

using namespace std;

unsigned long addToDec(char* p_ip)

{

char ipAddress[20];

char hexString[9];

int a,b,c,d;

unsigned long decimal = 0;

char* endptr;

strcpy(ipAddress, p_ip);

sscanf(ipAddress, "%d.%d.%d.%d", &a, &b, &c, &d);

sprintf(hexString, "%02X%02X%02X%02X", a,b,c,d);

decimal = strtoul(hexString, &endptr, 16);

return decimal;

}

//unsigned dbSearch(unsigned long p_target)

bool dbSearch(sRecord *rec, unsigned long p_target)

{

int dataSize = 18;

unsigned long l = 0;

unsigned long u = 4900000-1;

unsigned long m = 0;

unsigned long t = p_target;

sRecord data1;

char FullPath[255]="";

GetModuleFileName(NULL, FullPath, 255);

CString ExPath = FullPath;

ExPath.Delete(ExPath.Find("\\",ExPath.GetLength()-14),13);

ExPath += "\\outbin.dat";

ifstream inData(ExPath.GetBuffer(255), ios::in|ios::binary);

if(!inData){

cout<<"Can't Open File"<<endl;

return false;

}

while(l<=u)

{

m = (l+u)/2;

inData.seekg(m*18, ios_base::beg);

inData.read((char*)&data1, dataSize);

if(data1.num1 < t && data1.num2 < t){

l=m+1;

}

else if(data1.num1 <= t && t <= data1.num2)	{

memcpy(rec, &data1, sizeof(sRecord));

return true;

}

else if(data1.num1 > t && data1.num2 > t)

{

u = m-1;

}

}

return false;

}

bool IpToLocation(sRecord *rec, char* ipaddr)

{

unsigned long result=0;

result = addToDec(ipaddr);

return dbSearch(rec,result);

}

8. 참고문헌

- COM Bible, 삼양 미디어, 김응연 저

- Visual C++.NET Programming Bible, 삼양 미디어, 박광호 외2명 공저

- http://blog.naver.com/hypermin?Redirect=Log&logNo=70001547159

(ATL을 이용한 Band Object사용)

- http://www.jcomdot.com/ko/board_lecture/ATL_ToolBand1.htm

(ATL을 이용한 IE Extension)

- http://www.jcomdot.com/ko/board_lecture/ATL_ToolBand1.htm

(BHO 예제)

- http://www.codeproject.com/KB/shell/ietoolbartutorial.aspx

(DeskBand Tutorial)

- http://blog.naver.com/ratmsma?Redirect=Log&logNo=40023011192

(ATL/COM)