페이지

글타래

2009년 6월 28일 일요일

윤아아빠,전자담배 에바코 참고~

http://www.ebacomall.com/

에바코 정품은 위처럼 닷컴(.com)임
뽀로꾸 유사 싸이트 co.kr 를 주의.

에바코 제품은 라띠,에바,미니,라온 등 세부적으로 제품의 종류가 나뉘어 있음
각각 흡연량과 밧데리 지속시간에 차이.

하루에 한갑 정도 는 에바(담배크기와 가장유사 - 가장선호,추천)
좀더 피는양이 많거나 밧데리를 오래쓰길 원하면 에바코 미니(에바다음으로 잘나감-조금 길어서 장초라고 보면됨)나 라온.
밧데리 두개는 있어야 번갈아가면서 충전해서 그때그때 피울수있음.
에바는 하루에도 4-5번 너무 자주 번갈아가면서 피우는거 같음.
롱런밧데리원하면 미니나 라온..

제품상세정보는 본사홈피인 http://www.ebaco.co.kr/ 에서

카트리지(필터부분을 말함)는 니코틴 용량대로 구매함
자세한건 http://www.ebaco.co.kr/product/product8.php 에서 !

카트리지구매는 http://ebacokorea.com/board/view.php?id=qna&no=6094 보고 가까운곳에 전화주문이나 방문 하면 된다..(배송비 무료)

액상- 20ml 1만5천(40~50갑분량,다른 타사제품은 10ml당 3-4만원선인것에 반해 아주 저렴하다)
카트리지=36000원(에바) 미니,라온은 좀더 비쌈.

에바카트리지는 1개당 약 1200원꼴 로 연초 10까치, 미니는 약 1400원 꼴로 20까치 라..


usb 부팅하는법은 아래 글의 가장 위에 있는 링크 클릭하여 따라하면됨.
어제는 xp sp3를 잘못궈서 부팅이 안되는 오류가 있었을 지도 모름...
부팅이미지,부팅시디만들기,usb부팅만들기 툴은
http://www.durumul.com 의 하단에서 다운로드 가능.

2009년 6월 27일 토요일

usb 로 xp 설치

USB로 Windows 설치하기 최종판 1부 (파코즈 전인수님 작성)

USB로 Windows 설치하기 최종판 2부 (파코즈 전인수님 작성)

운영체제(OS) 설치, USB 메모리로 완전정복!


텍스트큐브 테스트 : Windows XP에 SP3 포함 버전 만들기

USB 외장장치로 XP 를 설치하자


[브레인박스] Tip & Tech - USB 메모리로 XP설치하자!!!
Amras Minyatur : eee pc(ausus701)구입!!






http://blog.noonipoony.com/145 <==!! gang chu http://www.brainbox.co.kr/community/board_view.asp?id=288&boardname=tipntech

ML115 서버 및 구닥다리 M925보드 업글용 백업메모

ProLiant ML115 Memory Specifications
Standard Memory 512 MB (removable)
Maximum Memory 8.0 GB
Memory Expansion 4 sockets
Memory Comments PC2-5300 ECC DDR2 SDRAM DIMMs. Supports Dual Channel DDR2.
CPU Type AMD Athlon 64 / Opteron 1200 Series
Model Comments NVIDIA MCP55S Pro Chipset, 4U Form Factor.
365 W

무소음 쿨링팬 다이시,

[쿨링팬/튜닝용품] CNPS8000T 1팩 (iWORKS용)(잘만)
인텔소켓 775/92mm팬/알루미늄,구리/92mm팬/PC방 1팩 25,000원

[파워서플라이] GW-450SE DUAL V2.2 [벌크](Great Wall) 33,600원
450W/ATX/120mm팬/저소음/20+4pin/SATA/PCI-E/오토팬컨트롤/과전압,과전류방지회로

[그래픽카드] GeForce 9500GT Ostar D2 512MB PCI-E 렉스텍(HaoStar)
지포스 9500GT/512MB GDDR2 128bit/DVI + D-Sub/TV-Out/PCI Express x16(2.0)

WinFast PX8600 GT(NVIDIA)
Radeon HD 3850 512MB.

http://forums13.itrc.hp.com/service/forums/questionanswer.do?admit=109447627+1246072609056+28353475&threadId=1335068


ML115의 그래픽카드 해상도 오류 문제 - 보드와 버스의 쫑난현상 또는 OS문제임

G1의 가장 Best 한 case의 조합이다.

ATI Radeon HD 3450 PCI-E graphic board (41,000)
http://www.enuri.com/view/List.jsp?cate=0705&menu=false&flag=&islist=


Windows Vista Ultimate 64-bit
and 3 GB of RAM.


메모리 구성정보
http://h18004.www1.hp.com/products/quickspecs/12704_div/12704_div.html#Memory

512MB 하나
1GB 하나
2GB 하나
512MB 2개 + 2GB 2개
2GB 4개
slot 1=3 ,2=4 same size

파워서플라이
370 Watts, PFC (Power Factor Correcting)
8A @ 115V, 4A @ 230V 0.75mA@240V 0.45mA@120V 80A

----------------------------------------------------------------------------------------
아래는 2004년경 산 구닥다리 보드로 팬4계열로 업그레이드가 가능하다고 하여 조회한 결과이다.

M925G 마더보드에 셀러론 2.4GHz 인데 펜4 2.8 과 거의 차이없다 ,HT가 아닌이상,

지원 CPU
펜티엄4 3.06GHz(FSB 400/533지원) 셀러론 2.8GHz

마더 보드

▣칩셋: VIA P4M266A+VT8235
▣지원CPU: Intel Pentium4/Celeron
▣지원메모리
-DDR SDRAM (PC2100 까지)
-최대: 2GB
▣FSB: 533Mhz
▣IDE: ATA 133
▣AGP슬롯: 1개(4X)
▣PCI슬롯: 3개
▣USB 포트: 6xUSB 2.0
▣내장사운드: CMI 9739A (6채널)
▣내장그래픽: S3 Graphics ProSavage8™
▣보드타입: Micro ATX
▣LAN: VIA VT6103 10/100 PHY Chipset

cpu
▣CPU: Intel Pentium 4 - 2.26GHz
▣코어종류: 노스우드
▣제조공정: 0.13Micron
▣소켓규격: Socket 478
▣캐쉬메모리
-L1 캐시: 20KB
-L2 캐시: 512KB
▣코어전압: 1.5V
▣FSB: 533MHz

마더 보드와 cpu를 바꾸려고 하는데 위에 있는 내용을 보시고 마더 보드와 cpu가 사양이 맞는지 좀 알려주세요
비아 p4m266a 칩셋의 경우는 fsb533을 지원하는 펜4 시피유를 사용가능 합니다.
그러므로 fsb800짜리 시피유는 사용불가능 입니다. 그러므로 지원가능한 시피유종류는
노스우드 a b 코어 프레스캇a 코어를 사용가능합니다. (예로 노스우드2.8A/2.8B 프레스캇2.8A 등)
노스우드C 코어와 프레스캇E 코어는 fsb가800 이므로 사용 불가능 합니다.
물론 셀러론D코어를 제외한 모든 셀러론 시피유도 사용가능 합니다.

한물간 M925보드를 폐기하고 최대한 저렴하게 업그레이드 하기위한 몸부림 업글계획:
(그래도 약 20만원이다 --;;;;;;;)

지원CPU 그래픽 메모리 메인보드 Intel G31 - ICH7 코어2쿼드~펜티엄듀얼코어 GMA3100 DDR2 667/800 DIMM2개 최대4GB PCIex16 1개,PCI 2개 리얼텍오디오 8채널G31T-M7 V1.0(ECS코리아) 49,120 Micro-ATX 슬림 SATA II x 2 , IDE x 1 ALC850CPU 88,630 펜티엄 듀얼코어 E5300(울프데일/그레이/벌크) RTL8111C기가비트RAM 12,000 DDR2 667 pc2-5300 1GB CPU 쿨러 8,500 정품쿨러 LGA775(4핀) http://www.enuri.com/view/Detailmulti.jsp?modelno=1083939&cate=07070301&Mname=&fb=1&porder=14&key=minprice&factory=&search=NO&m_price=&spec=&sel_spec=&pagesize=20&page=2&keyword=&orgkeyword=&logkeyword=&spec_name=&from=list 파워 23,320 Wixx LGP-350M PLUS 케이스 24,000 아무거나
합계 205,570

돈 생기면 사야되는것! (총알장전!!)
-------------------------------------

<공유기업글용>
-N5004 기가비트 유무선 공유기 80,000

<서버다이용>
-서버메모리 PC2-5300 2GB ECC DDR2 SDRAM UNBUFFERED / REG 1개 당 50,000 (장터가)
-서버보드에 끼울 그래픽카드 궁합맞는놈으로 ATI Radeon HD 3450 (약41,000)
-서버무소음 작전용 쿨링팬,파워서플라이등

<큰애 PC#1본체업글용>
-m925보드용 펜4프레스캇 cpu 2.8,3짜리(장터가 2만),pc2700 512MB (장터가 1만)
-아님 코2듀오나쿼드로 새로사고잡.

<작은애 놋북#1업글용>
-N100UA 나 N200UA 무선랜카드 사기

<내놋북>
-이미 메모리 최대치 4GB 업글된 상태.
-현 Core2Duo T7300, 차후에 봐서 보드최고 지원모델인 펜린계열로 CPU업글(맞나..기억이가물)
(현재 로썬 터무니없는 40 ~ 90만원선 --;;)
내 이전블로그 http://krkim.net/ 또는 http://blog.hanafos.com/yeamaec 에 cpu 업글가능한 모델 표있음


-PC포맷대비용 온라인 백업문서-

2009년 6월 26일 금요일

g304와 g300p를 팔고 N5004를 질러...??

집에서 인터넷쓴지는 이제 만 10년이 되가는데 이제야 광랜대열에 합류 ㅋㅋ
16,000원에 인터넷 20Mbps 싼맛에 하다가... sk브로드밴드에 힘을보태기로했다.
덕분에 다운 7-8Mbps,업 0.7Mbps 에서 각각 10배로 튀어버려서 멀쩡한 공유기가
갑자기 구닥다리가 된 느낌이다. 주택 광랜은 아파트랑 다르게 다운로드가 10Mbps
안팎이네,뭐가 다르지? 근데 다들,,요금은 얼마??








2009년 6월 22일 월요일

은행 인터넷뱅킹시 짜증나는 잡동사니 ActiveX 악성 보안툴들

내 기억으론) 사실 2000년초까지만 해도 이러지 않았는데,
기껏해야 softforum의 xecure 하나 살짝 표안나게 가뿐히 깔릴뿐,

요새 은행 초기화면 접속부터 할라치면,완전 쓰레기장에 온듯한
여러가지 잡다한 대여섯개의 프로그램들이 내 pc를 분탕질 해가며
지멋대로 깔리는데에 속수무책인 상태에서 기분나쁜 찜찜함을 느낀다.

단순한 암호화거기다가 각종 방화벽,바이러스 백신까지...
뭐 키보드보안 어쩌구 말도안되는 nProtect가 수년전부터 게임실행 접속시보이더니만,
이젠 대놓고 은행권까지 섭렵해서 너무 발광 요동을 친다.

난 솔직히 저 키보드 보안 그 프로그램 자체가 검증된것인지 내부동작은 무슨짓을 하는지 의심스럽다. 키보드 후킹해서 눌린키가 뭔지 비밀번호가 뭐가 눌렸는지 등의 정보를 다 가져갈수있는 것이 후킹인데 과연 저놈도 똑같이 그 짓을 할것인데 과연 안전한가? 검증은 되었는가?

솔직히,키보드 보안이니 뭐니 이런건 아예 그런 프로그램이 존재한다는 자체도 스스로 보안성을 해치는 것이다.

내가 내PC에서 내 브라우저를 켜고 내 계좌의 정보를 보는데 왜 내PC를 심하게 훼손시켜놓는것인가? 내가 내 계좌의 정보를 크래킹할까봐? 솔직히 PC보안 이라 외쳐대며 보안솔루션등을 금융권에 고가에 납품하는 재미가 솔솔하겠지만, PC보안 이것은 가정용 컴퓨터에서는 어떤 잘못된 싸이트의 방문이나 바이러스 나 악성 스크립트를 유발하는 인터넷 싸이트의 방문,불법자료 다운로드로 인한 감염등이 아니면 전혀 피해를 입을 만한 분야가 아니다.

내컴 내가 나혼자 쓰는데 왠 nProtect 같은 쓸데없이 자원만 먹는 것이 필요한가.
이런건 PC방이나 깔릴일이지..

뭐든지 밀어붙여서 팔고야 마는 우리나라 영업력 대단하다. 그래서 이렇게 우리나라 금융 시스템 인터넷 거래가 개판된거 아닌가 말이다.
더이상 바이러스,보안을 핑계로 PC의 훼손을 가장 먼저 앞당기며(정작 PC를 침입하는 것은 그들 프로그램 자신들이다) 무분별한 혼돈을 초래한 현상에 대해 반드시 재정돈할 필요가 있다.

깔끔한 PC,깔끔한 인터넷 금융거래 정책,깔끔한 솔루션이 필요한 시점이다.
은행 초기화면에서 잔고하나 확인하려해도 우후죽순 무차별 설치되고 설쳐대는 잡동사니 프로그램들의 모습은 불꽃놀이 할때 사방팔방 튀는 불꽃덩어리 처럼 지랄발광하는 정도가 더 심해져 정말 짜증난다. 1-2MB로 충분한 기능을 담당하던 이 작은 프로그램들이 덩치가 비대해져서 이젠 완전히 수십MB 이상 하드디스크에 떡하니 깔려서 무슨일을 벌이고 있는건지 사실상 대놓고 기생하고 있는 것이다.

보안을 빙자한 내 PC칩입하여 내PC를 점령한 트로이목마성 잡동사니 악성 프로그램들.

무분별한 무차별적 ActiveX 개발로 인해 시스템이 개판이다.
누차 지적되어온 것처럼 Linux 에서 쓸수있고 pc에 육중하게 인스톨되지 않고도 가볍게 안전한 거래를 할수있는 대안이 있어야 한다.

짜증나는 키보드보안..
짜증나는 nprotect
짜증나는 은행
짜증나는 보안 프로그램 KLDP

이탈리아 인터넷 뱅킹, 어떻게 하나?

2009년 6월 20일 토요일

전자담배 에바코 에바,연기적을때 응급조치요령

연기가 적을 경우(교체후)
기화기에 새 카트리지로 교환하고 배터리만 분리 한 후
기화기가 위로 향하게 한 후 강하게 5번 정도 털어주시면
연기 량이 빠른시간안에 증가합니다.

연기가 잘 나지 않을 경우(교체시점)
새 카트리지를 기화기에 삽입후 5분정도 지난뒤 완전히 충전된 배터리가 결합된 상태에서 조금 길게 (약 3초) 깊숙히 5~10초 간격으로 3~5회 정도 흡입해보시길 바랍니다.

카트리지의 니코틴액이 어느 정도 소모되어 갈 경우
일반카트리지의 니코틴액이 사용되어지면서 연기량도 조금씩 줄어듭니다. 이 경우엔 카트리지필터부위를 2~3회정도 불어 카트리지필터의 액를 기화기쪽으로 흐르도록 한 후 사용하시면 됩니다.

배터리 충전이 필요한 경우
배터리가 방전되면 배터리의 LED에 깜빡깜빡 경고등이 몇차례 표시된 후 점등이 되지 않고 그에따라 연기가 발생되지 않습니다. 충전된 배터리로 교환하여 사용하거나 배터리를 충전하여 사용하시면 됩니다.

카트리지 교체시기는?
1개의 니코틴 카트리지는 100~120회 흡입이 가능하며 연초담배 약 10~15개피에 해당 됩니다. 하지만 흡연자의 흡연 습관에 따라서 교체시기의 오차 범위가 있을 수 있습니다. 교체시기는 흡입 량이 점차 줄어드는 시기 또는 분무 량이 급격히 줄어 흡입이 되지 않으면 교체시기라고 판단 하셔야 합니다.

전자담배는 충전만 하면 계속 무한대로 쓸 수 있나요?
전자담배는 크게 배터리,무화기,카트리지로 구성되는데 배터리와 무화기는 영구적인 제품이고 에바코에서는 배터리 6개월, 무화기 1년의 무상AS를 지원하고 있습니다. 반면에 카트리지는 내부의 액이 소진될 경우 재 구매를 해주셔야 합니다. 일반적으로 에바의 카트리지 1개가 담배 반갑 분량이고 라온의 카트리지가 한갑 미니의 카트리지가 한갑이상의 분량이라고 생각하시면 됩니다

[스크랩]전자담배 에바코로 금연에 성공하자...

전자담배, 건강에 덜 해롭다? 안전성 검증 시급

전자담배, 건강에 덜 해롭다? 안전성 검증 시급

진짜 같은 '전자담배'. 효과도 OK?


등록일 2009.06.05 12:06:27 조회수 20295

흡연이 백해 무익하며 공공의 적이라고 다들 느끼기 때문일까? 여기 저기서 금연을 시도하는 이들이 많다. 하지만 참 어려운 것 중 하나가 바로 금연이다.

필자 역시 금연을 하고자 수 차례 시도하였으나 번번히 고배를 마셨다. 벌써 흡연만 햇수로 15년째다. 담배를 피워대던 장소, 시간에 따른 습관 등 금연의 적이 너무도 많다. '담배 끊는 사람하고는 친구도 하지 말라'는 말에서 희열을 느끼거나 '이 즈음에서는 꼭 한 개피 피워줘야 한다'는 말도 안 되는 자기정당화로 금연에 번번히 실패한 바 있다.

http://news.danawa.com/News_List_View.php?nModeC=10&nSeq=1474173&sMode=review&auth=1
내가 산건 이건 아니지만,, TV온라인 쇼핑몰에서도 파네 ?
카트리진 불법이라 직접 매장판매 한다면서??
TV홈쇼핑에선 버젖히 팔다니?? 헐..

2009년 6월 19일 금요일

게임 개발자 중에서 서버개발이랑 클라이언트 개발 차이점은 뭔가요?

서버와 클라이언트로 분야를 나눈다면 클라이언트 개발자는 많고 서버 개발자는 상대적으로 적은 양상을 보인다. 서버 개발자는 IOCP나 쓰레딩 모델 등 다양한 지식을 섭렵해야 하며 겉으로 보기엔 어려울 것이 없어 보여도 하나의 서버를 안정화시키는 데는 상당한 노력과 시간이 소요된다. 서버는 리눅스와 윈도우의 두 가지 OS가 주류이며 전통적으로 게임 회사에서는 윈도우 서버를 사용하는 곳이 많다. 윈도우에서 서버를 개발하고자 한다면 Ralph Davis의 『Win32 Network Programming』을 강력하게 추천한다(번역서도 있다). 출판된 지 10년 가까이 되었지만 필자가 아는 한 윈도우에서의 네트워크 프로그래밍을 다룬 제대로 된 거의 유일한 책이다. 리눅스 분야에서의 서버 개발이라면 매우 유명한 서적인 스티븐스의 『Unix Network Programming』, 속칭 UNP 볼륨 1을 보기를 권한다.

http://ask.nate.com/qna/view.html?n=3535076


Network Programming for Microsoft Windows 2판 - Win32 소켓 프로그래밍을 하실려면 꼭 가지고 있어야할 바이블입니다. 좀 비쌉니다. T_T;
TCP/IP 소켓 프로그래밍 (C버전) - 소켓 프로그래밍을 처음 시작하시는 분들은 필독서입니다. UNIX/Win32겸용예제입니다만 다소 UNIX쪽에 치중한 면이 있습니다.
링크도 더 있응께,더보러가려면 이곳 http://nineye.net/blog/archives/434

언제부턴가 인터넷 접속 모니터링 당하고 있다

클릭하면 원본을 볼수있습니다











위 화면에서의 웹 페이지 오류 세부 정보
사용자 에이전트: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)타임스탬프: Thu, 25 Jun 2009 02:18:52 UTC
메시지: 액세스가 거부되었습니다.
줄: 12문자: 93코드: 0URI: http://210.117.120.2:8080/xs_btn/shvn03.asp?mode=SSL3H&n=0&x=www.hometax.go.kr&u=3045723030469&b=123&cv=219636&ci=0&cg=S&cp=H&ct=2006-05-25 오전 11:17:23






---







브라우저로 주소치고 엔터치면 상태창 하단에 아래문구로 시작하는 뭔가가 포착된다.
어떤 사이트를 가건 오로지 저곳을 먼저 경유한다..

http://210.117.120.2:8080/xs_btn/

query: 210.117.120.2# KOREAN조회결과는 아래와 같으며, 실제 정보와 상이할 수 있습니다.
IPv4주소 : 210.117.120.0-210.117.120.255네트워크 이름 : HANANET-INFRA연결 ISP명 : broadNnet할당내역 등록일 : 20040601할당정보 공개여부 : Y[ IPv4주소 사용 기관 정보 ]기관고유번호 : ORG3930기관명 : 에스케이브로드밴드주식회사주소 : 서울 중구 남대문로5가 SK남산그린빌딩우편번호 : 100-711[ 네트워크 담당자 인물 정보 ]이름 : 관리자기관명 : 에스케이브로드밴드주식회사주소 : 서울 중구 남대문로5가 SK남산그린빌딩우편번호 : 100-711전화번호 : +82-2-106-2전자우편 : ip-adm@skbroadband.com

리다이렉션,스니프,,? isp 업체의 공유기 사용여부 감시?? 뭐지?각자 체크해보자,찜찜하다.

http://miniwini.com/miniwinis/bbs/index.php?bid=talk&mode=read&id=109139

여기에 모든 음모가!! (↓)
http://miniwini.com/miniwinis/bbs/index.php?bid=talk&m=my&mode=read&id=104186&p=1&who

여기또~
http://saickho.egloos.com/1613681

공유기 사용여부 감시 당하는 시대
http://sirjhswin.egloos.com/1440454


http://wariua.egloos.com/2255292

내가 그동안 둔감했었나..








구글크롬이 대안!!??









추가)) User Agent 쉽게 바꾸는 방법- 크롬으로 사용하면 이거 잘하면 쉽게 풀릴수도,,,,













크롬의 사용자 에이전트를 바꾼다. 크롬의 User-Agent 바꾸기라는 글에서 알 수 있듯이 예전에는 크롬의 사용자 에이전트를 바꾸기 위해서는 직접 패치해야 했지만 이제는 명령행 옵션으로 바꿀 수 있다. 예를들어 -user-agent="DoA/1.1"라는 명령행 옵션을 주면 User-AgentDoA/1.1로 나타난다.








2009년 6월 18일 목요일

아,고민되네 서버 프로그래밍 구성기술은 뭘로하지?...

100% MS윈빠가 아닌이상 다음 고민을 해보지 않을수가 없다..
이걸 MS-Windows 기반의 IOCP로 플랫폼 의존적으로 할지,
아님 범용으로 Linux 의 epoll로 구현할지를...........
아님 전통적인 단순 select / poll 로 가야할지,,ㅋㅋ

간만에 우분투에서
Linux코딩도 잼있을것 같기도 하고... 시간은 많지않고...
흠,,

http://kldp.org/node/60222 글에서는
단순 소켓코딩의 차이는 아니라고도 하고,,
도구나 플랫폼 성능보다도 역시 개발자의 역량인가..
어떻게 개발하기 나름인가?
논쟁의 불씨가 남아있는듯...
하기야 더 좋은 신발었다고 더 잘달리는건 아니지.....
육상경기에서도 1등여부는 단순히 신발의 성능문제만은 아니니까..

http://www.google.co.kr/search?complete=1&hl=ko&q=unix+iocp&lr=&aq=f

The C10K problem (http://www.kegel.com/c10k.html)

windog IOCP vs linux epoll

MS-Windows Network Programming 2

Win32 IOCP를 따라잡을 Unix, Linux, *BSD계열의 방법은?

http://kldp.org/node/60222

정말 평소엔 낭비라 생각했던 Windows의 이벤트방식과 쓰레드의 결합이란게 엄청난 효율을 발휘하는 것을 보고 놀랐습니다.
이렇듯 국내 대부분이 아니라 거의 모든 온라인 게임회사의 서버는 Windows NT 계열로 IOCP를 이용한 서버입니다.
이렇게 멀티소켓 컨넥션 쓰레드 처리라는 단 하나의 부분이 Linux나 오픈소스 OS가 Windows 에 뒤지는 퍼포먼스 벤치마크 분야라고 볼수 있는데요.
어떻게 대안이나 따라잡을 방법은 현재 없는것일까요?
kqueue나 epoll 등 현존 기술 모두 뒤져봐도 못따라잡는거로 검색결과 나타나던데, 다른 기술이라던가 아니면 앞으로 곧 나타날 신기술이 있는지 아니면 색다른 조합으로 가능한지?

답변中
IOCP 와 프로그래밍 방식이 비슷한 것으로 따지자면RTS (Real Time Signal) 정도가 될 것 같네요. 이 또한 이벤트방식입니다. 물론 RTS 가 구현하기 복잡하긴 합니다만.
제 생각엔 IOCP 나 RTS 나 어차피 I/O 이벤트가발생하면 시그널 보내주는 건데, 이 효율이 얼마나 차이날지모르겠네요.
물론 구현해 본 경험에 따르면, IOCP 가 효율적이면서도쉽기도 하고, 파일 입출력 등도 같이 처리할 수 있어서 같은 기능을더 나은 방식으로 지원한다는 것은 인정합니다.하지만, 리눅스로 못하는 건 아니에요...

답변中

펜티엄 4 2.8기가 메모리 2기가 linux rhel4 update2 현재 동접 10082 명
입니다.
게임써버는 아니고 이미지써버입니다.트래픽 280메가쯤 나옵니다.

서버구성 기술은 epoll 입니다.
게다가 요즘 N 모사 광고써버도 epoll 로 돕니다.
그놈도 동접 몇만되는걸로 압니다 -_-;
IIS 가 동접 만개에서도 잘도나요? ( 제가 윈도우는 잘 몰라서 그럽니다 )

답변中

IOCP나 epoll이나 kqueue나 하는 것들에 대해서는 제가 보기에는 논의 대상으로삼는것은 옳지 않다고 봅니다. 실재로 성능 차이가 별로 없을 뿐 아니라 어느것이성능이 좋네 하는 것도 플랫폼의 특성을 최대로 이끌어 내는 것이 더 중요하기때문이죠.
ms-윈도우즈를 서버로 선택했다면 어쩔 수 없는 선택으로 IOCP를 사용해야 하고, 리눅스(Linux)를 서버로 선택했다면 epoll을 신중히 검토해야 하며, BSD계열을 사용한다면 kqueue를선택하는게 좋겠죠.
그리고 이 녀석들의 성능이 이제는 전체 성능에 그다지 영향을 미치지 않습니다.시스템 성능과 운영체제의 튜닝이 그만큼 좋아졌기 때문입니다.
제가 온라인게임에서 동시 접속이 4000이상 나오는 서버들을 별로 본 적이 없습니다.

프로그래머가 되는 방법

http://wiki.kldp.org/wiki.php/HowToBeAProgrammer

2009년 6월 17일 수요일

모던토킹 80년대 롤라장음악 '쉐리쉐리 레이디' 자작 공짜 벨소리 다운로드 해가삼!!

블로그스팟 입주(?) 기념 자작!!

나만의 아지트 대 공개!무료 음악! 최신 MP3 싸이트와 툴들을 공개합니다!!

난DJ 라는 http://www.imdj.net/music (( 조선족 최대 음원 싸이트 - 예의-매너필)

가입 불필요하고 그냥 다운아이콘 클릭하면 내 PC에 바로 받을수 있다.
단,몰리는 시간이 있는듯,,속도가 조금 느림 ㅋㅋ
(너무많이 몰려가면,싸이트없어지거나
자폭될지도.. 자중하시라..ㅜㅜ)

아래는 두루물 홈페이지(메인화면 하단)에 링크된 mp3 툴인데,

벨소리 & MP3 만들기 도구

MP3Gain 는 mp3 볼륨 레벨 db(데시빌)을 모두 동일하게 맞춰준다.
CD구울때 어느 한,두노래가 무지 크거나 작을때 굽기전에 맞춰주면 딱좋다.

Jodix WMA to MP3 Converter 는 WMA 포맷(위 싸이트에서 받은) 을 MP3로 변환한다.

NZellBell (make .mmf) 는 이렇게 변환한 MP3를 핸드폰 벨소리인 mmf 파일로 변환한다.
변환후 그냥 핸드폰 전송 플그램
(skt는 멜론 lgt는xx등 각자 프로그램으로..)

아래는 뽀너스!! 무료 벨소리 다운!!

독일 최대의 롤라장 80-90 년대 히트곡인 모던토킹(Modern Talking) 의 쉐리쉐리 레이디를 위 과정을 거쳐서 만들어 봤다, 내폰 벨소리로 들어가 있음 ^^!

CheriCheriLady Bell

MS-Windows 플랫폼의 Socket I/O Model 에는

다음과 같은 다양한 구현방법들이 있으므로 택1하여 사용한다.

Blocking

WinCE를 포함한 모든 Platform
장점 : 구현이 쉽다.
단점 : 많은 Thread가 필요하다.

Select

WinCE를 포함한 모든 Platform
UNIX기반 Berkeley Socket에서 사용되던 모델
장점: 여러 Socket처리 가능
단점: 64 < size="5">WSAAsyncSelect

Win95(Winsock1)이상
MFC CAsyncSocket
장점: select모델과 같은 부하 없이 많은 연결 처리
단점: MS-Window 에만 가능하다

WSAEventSelect

Win95(Winsock2)이상
WSAEvent Object를 사용
장점: Window 불필요
단점: 한 Thread에서 64개의 Socket만을 처리

Overlapped I/O

Win95(Winsock2)이상
장점: 고성능 Socket I/O, 시스템이 Buffer관리
단점: 한 Thread에서 64개의 Socket만을 처리

I/O Completion Port (IOCP)

WinNT이상
장점: 우수한 성능과 확장성 제공,적은 수의 Thread로 많은 Socket처리
단점: 초기화 복잡

솔직히 이 블로그스팟은,

며칠써보니,그냥 간단메모나 낙서장으로 딱인거 같군..
아님 댓글놀이라도... 각목말대로 한줄짜리 블로그인가...ㅋㅋ
아님 뭐 놀러가서 찍은 사진올리고 보는덴 딱인거 같기도 하네,,,
언뜻 본 기억으로 사진첨부용량이 1기가 정도 되는거 같더만...
그 이외의 용도로 쓰기란,...다소 억지스러움이 존재하는군..
사진말고 일반 파일 첨부도 없으니 힘들고,글을 분류,정돈하기도 불가하니 그렇고..
강좌같은 글을 올리기엔 좀 많이 부족하구나,,아니 성격이 안맞네그려,,

2009년 6월 16일 화요일

[강좌] MFC Ribbon Programming - MFC 리본 사용하기

어차피,피할수 없다면 즐겨라!!
MFC 공유 DLL로 밖에 안된다면 코드크기 따지지 말고 VS2008의 기능을 맘껏 즐겨라!


http://www.anycoding.com/bbs/board.php?bo_table=acProgram_Cpp&wr_id=3783




이 글은 Furyheimdall 에 의해 furyheimdall.tistory.com 과 http://www.ac-plus.net/ 에서
작성되었습니다.

퍼가실 때는 이 박스를 함께
복사해주세요



Visual Studio 2008 Feature Pack 에서
도입된 MFC Next 에는 Ribbon Interface 가 추가되었습니다.
쉽게 말해 MFC 로 Office 2008 같은 UI 의
프로그래밍을 할 수 있게 되었지요.

특별히 자료가 필요할 만큼 어렵지는 않고 이런 혁신적으로 바뀐 UI를 몇 줄(?)의 코드만으로
변경할 수 있다는 데 놀랐습니다. UI가 다 그렇듯 노가다성이 좀 짙게 띄는 단점이 있습니다. 그리고 설계는 잘 되어있는 듯 보이지만 자잘한
버그들이 많이 보고 되고 있는 것 같네요.

어찌됬건 이번 포스팅에서는 프로젝트를 진행하면서 Ribbon 을 이용하여 프로그램을
제작하였던 경험을 바탕으로 처음 사용하시는 분들을 위해 사용법을 알려드릴까 합니다.

MFC Next 에서 추가된 점은 이전 포스팅
Visual C++ 2008 Feature Pack 정식판 를 참고하세요.







사용자 삽입 이미지









사용자 삽입 이미지


<Ribbon 클래스 구조 - 출저: http://zeroone.tistory.com/>





1. 리본 생성, 추가하기
리본을 사용하게 되면 CMainFrame 를 주시하여야 합니다.
실제 리본에 관련된 초기화 부터 설정까지 모든 작업이
CMainFrame 에서 이뤄지게 됩니다.
OnCreate() 에서 리본바 생성및 초기화를 하고, InitializeRibbon() 에서
리본에 대한 설정을 하게 됩니다.

InitializeRibbon() 내부를 보면 수 많은 코드들이 반복적으로 나열되어 있는데
바로 이 코드들이 리본을 설정하는 코드입니다.

InitializeRibbon() 에서 리본 생성및 설정은 크게 다음과 같은 순서로
진행됩니다.


1.
툴바 이미지 로드
2. 메인 버튼 초기화&설정(메인 메뉴)
3. 메인 메뉴 아이템 추가
4.
카테고리 메뉴 추가(Category)
5. 패널 추가(Panel)
6. 아이템 추가(Base Element)



실제로 가장 많이 사용되고 반복되는 코드가 4,5,6번에 해당됩니다.


실제 사용되었던 4,5,6의 예제 코드입니다.









  1. // 4. Category insert
  2. bNameValid = strTemp.LoadString(IDS_RIBBON_CATEGORY_CAMERA);
  3. ASSERT(bNameValid);
  4. CMFCRibbonCategory* pCategoryCamera = m_wndRibbonBar.AddCategory(strTemp, IDB_WRITESMALL, IDB_WRITELARGE);
  5. // 5. Panel insert
  6. bNameValid = strTemp.LoadString(IDS_RIBBON_CAMERA_INTERFACE);
  7. ASSERT(bNameValid);
  8. CMFCRibbonPanel* pPanelClipboard = pCategoryCamera->AddPanel(strTemp, m_PanelImages.ExtractIcon(27));
  9. // 6. Item create & insert
  10. bNameValid = strTemp.LoadString(IDS_RIBBON_CAMERA_INTERFACE_1394);
  11. ASSERT(bNameValid);
  12. CMFCRibbonButton* pBtn1394 = new CMFCRibbonButton(ID_RIBBON_CAMERA_INTERFACE_1394, strTemp, 0,0);
  13. pPanelClipboard->Add(pBtn1394);
  • // 4. Category insert
    bNameValid =
    strTemp.LoadString(IDS_RIBBON_CATEGORY_CAMERA);
    ASSERT(bNameValid);

    CMFCRibbonCategory* pCategoryCamera = m_wndRibbonBar.AddCategory(strTemp,
    IDB_WRITESMALL, IDB_WRITELARGE);


  • // 5. Panel insert
    bNameValid =
    strTemp.LoadString(IDS_RIBBON_CAMERA_INTERFACE);
    ASSERT(bNameValid);

    CMFCRibbonPanel* pPanelClipboard = pCategoryCamera->AddPanel(strTemp,
    m_PanelImages.ExtractIcon(27));
    // 6. Item create &
    insert
    bNameValid =
    strTemp.LoadString(IDS_RIBBON_CAMERA_INTERFACE_1394);

    ASSERT(bNameValid);
    CMFCRibbonButton* pBtn1394 = new
    CMFCRibbonButton(ID_RIBBON_CAMERA_INTERFACE_1394, strTemp, 0,0);

    pPanelClipboard->Add(pBtn1394);

    1. 개인적으로 리본메뉴는 깊이에 따라서 탭으로
      구분하여 넣어주고 있습니다.
      코드가 길어질 경우 눈에 잘 들어오지 않아서 저렇게 넣어주게 되었네요.

      IDS 접두어로
      시작하는 식별자들은 모두 VS에서 지원하는 스트링테이블에 등록된 문자열로 실제 패널이나 아이템, 카테고리의 표시되는 이름입니다.

      카테고리를 생성할 때는 AddCategory 를 호출하며 반환되는 녀석은 추가된 카테고리의 접근할 수 있는 포인터입니다. 이 포인터를
      이용해서 패널을 등록하고, 그리고 이 등록된 패널 내부에 아이템을 등록하는 것입니다.
      6번의 경우 실제 아이템 타입이 결정되게 되는데
      CMFCRibbonButton 타입으로 버튼을 생성했네요.

      실제 아이템 객체를 생성하는 부분 입니다.

      new
      CMFCRibbonButton(ID_RIBBON_CAMERA_INTERFACE_1394, strTemp, 0,0);

      첫번째 인자는 실제 메뉴의 ID (아래에 설명하겠습니다)
      두번째 인자는 메뉴 이름
      세번째 , 네번째
      인자는 표시할 메뉴에 대한 아이콘입니다.
      4번항목에서 카테고리 등록시 IDB_WRITESMALL,
      IDB_WRITELARGE를 메뉴에 사용할 이미지 ID 로 설정하고,
      실제 아이템을 등록할때 몇번째 아이콘을 사용할 것인지 결정하게
      됩니다.

      하나의 카테고리 안의 하나의 패널 안의 여러개의 아이템을 넣고 싶을 경우 위 상태에서 아이템 생성 및 추가에 해당하는
      6번 코드 블럭을 밑에 추가적으로 나열하면 됩니다.



      2. 리본 메뉴와 실제
      메뉴와의 관계

      리본을 사용함으로서 기존 메뉴는 사용하지 않을 듯 하지만 그렇지는 않습니다.
      리본
      메뉴는 단순한 껍데기일 뿐이며 메뉴 핸들러와 메뉴에 대한 식별자는 모두 메뉴리소스에 의존합니다.
      리본버튼을
      생성할때 넘겨주는 첫번째 인자의 ID가 바로 메뉴리소스의 메뉴ID 입니다.


      사용자 삽입 이미지


      <메뉴
      리소스>

      위 이미지를 보시면 리본버튼을 생성할때 ID 값을 가지는 메뉴리소스의 메뉴입니다.

      위 메뉴에 대한 핸들러가 생성되지 않으면 리본버튼도 비활성화 되어있고, 핸들러가 생성되면 리본버튼이 활성화 되는 등 리본은 결국 껍데기에
      불과합니다.



      3. 리본 메뉴의 아이콘 리소스
      만들기

      사실 이 항목은 별도로 포스팅할 까 고민하던 내용이었습니다만 워낙 위의 내용이 부실해서 추가합니다.
      ㅡㅡ;

      PNG 를 통해서 만드는 방법도 있지만 32Bit BITMAP 파일을 이용하여 사용하는 방법이 차후 관리가 편하므로 이
      방법을 통해서 아이콘을 만드는 방법을 알아보도록 하지요.

      일단 준비물은 Photoshop 입니다. 꼭 포토샵이 아니더라도 32Bit BITMAP 이미지를 제작하고
      편집할 수 있는 환경이면 가능합니다.


      사용자 삽입 이미지


      진행중인 프로젝트를 기준으로 위의 첫번째 버튼인
      IEEE1394
      항목의 버튼을 바꿔보도록 하겠습니다.



      사용자 삽입 이미지


      우리가 넣을 리본바의 이미지는 32x32 픽셀의 사이즈를
      가집니다.
      위 이미지는 웹에서 받은 이미지를 32x32 픽셀로 잘라서 포토샵으로 가져온 상태입니다.



      사용자 삽입 이미지


      위 이미지를 확대해서 배경 부분을 선택합니다. (Magic wand tool - 마법봉) 을 선택한 후 흰색을 클릭합니다.
      (복잡한 배경의 경우
      조금 더 손이 더 갑니다만 이 포스트에서는 설명하지 않겠습니다.)



      사용자 삽입 이미지


      배경부분이 선택된 상태에서 마우스 오른쪽 버튼을 클릭후 [Select Inverse]
      를 클릭합니다.



      사용자 삽입 이미지


      그러면 위와 같이 배경이 아닌 캐릭터 부분만 선택하게 됩니다.
      선택이 되면 하단
      오른쪽(워크스페이스 설정에 따라 위치가 다를 수 있습니다) 에 [Channels] 탭을 선택 후 [Create new channel] 을 클릭합니다.



      사용자 삽입 이미지


      클릭하면 위와같이 화면이 검은색으로 변하며 알파채널이 추가되고 알파채널상태를 보게
      됩니다.
      위 단계에서 선택한 영역이 남아있는데 이부분을 흰색으로 채워줍니다.
      (알파채널은
      투명도입니다. 0(검은색)일때 완전한 투명 부터 255(흰색)일때 불투명까지 총 255단계로 표현합니다.
      즉 위 작업을 수행하면
      배경부분은 투명하게, 캐릭터 부분은 불투명하게 하는 결과가 나옵니다.
      )


      사용자 삽입 이미지


      이제 아이콘 파일 작성은 완료되었습니다.
      아이콘 파일에 합치는 작업을 해봅시다.
      (이부분은 꼭 하지 않고 코드로 별도로 추가해도 되지만 번거롭습니다 :)
      프로젝트 리소스 파일의 writelarge.bmp 가 현재 우리가 추가하려는 규격의 아이콘들이 있는 파일입니다.

      포토샵으로 불러온 후 writelarge.bmp 가 선택된 상태에서 [Image
      -> Canvas size
      ] 를 선택합니다.
      그러면 위 이미지 처럼 별도의 대화상자가 나오는데 위와같이
      설정해준 후 OK 를 선택합니다.



      사용자 삽입 이미지


      OK 버튼을 누르면 writelarge.bmp 파일 오른쪽에 32x32px 의 빈공간이
      생기게 되는데
      이 곳에 아이콘 이미지와 알파채널 이미지를 별도로 복사해서 넣어줍니다.
      Ctrl+A 를 누르시면 전체 선택 가능하니
      전체를 복사하신 후 writelarge.bmp 에서 붙여넣어서 오른쪽에 넣습니다.

      알파채널 이미지도 마찬가지로 [Channel -> Alpha] 를 선택하면 흑백 이미지로 변하게
      되는데
      아이콘 이미지처럼 똑같이 복사하면 됩니다.
      그리고 writelarge.bmp 파일의 레이어 병합 [Layer -> Patten Image] 을 하신 후 Save 를
      합니다.


      사용자 삽입 이미지


      아이콘 파일밑에 숫자가 인덱스 번호입니다.
      아이템 생성시 이 번호를 인자로
      넘기면 해당 인덱스의 아이콘이 보이게 됩니다.



      사용자 삽입 이미지


      MFC 리본 사용법이 어느덧 포토샵 강의로 변질되어가는 지점에서 드디어 결과물이
      나왔네요. :)
      실행시키면 위와 같이 추가한 아이콘이 표시되는걸 볼 수 있습니다만...
      알파채널이 오른쪽으로 살짝 밀려서인지
      ㅡㅡ; 보이는 부분이 조금 이상하군요.
      알파채널과 이미지는 정확하게 위치를 맞춰줘야 하기 때문에 주의하셔야 합니다.




      4. 그 외...
      많은 분들이
      눈치채셨든 리본 관련으로 추가된 클래스는 모두 CMFC 라는
      접두사를 붙이고 있습니다.
      사실 리본과 관련된 라이브러리는 MS 에서 제작한 것이 아닌 BCGSoft 라는 곳에서 판매하는 상용
      라이브러리로 구성된 것입니다. BCGSoft 의 라이브러리는 CBCG 라는 접두사를 사용하는데
      Find->"BCG"->Replace->"MFC" 인 듯 합니다. ㅡㅡ;; (거 참 성의 없네 MS)

      MFC Next 에서 CFrameWnd 클래스를
      상속받는 SDI,MDI 관련 클래스들이 변경되었습니다.
      CMDIFrame-xWnd -> CMDIFrame-xWndEx , CMDIChildWnd -> CMDIChildWndEx 처럼 Ex 라는 접미어가 붙습니다.
      Ex 가 붙은 녀석들은 모두 각각의 기존 클래스에서
      (CMDIFrame-xWnd, CMDIChildWnd, ETC) 상속 받아 MFC Next 의 새로운 기능들을 적용할 수 있게 추가된 클래스
      입니다.

      MFC 툴바를 사용하려면 이전의 CToolBar 가 아닌 CMFCToolBar 를 사용하셔야 됩니다.

      버튼 외에 아이템 종류는 상단의
      리본 클래스 구조도의 BaseElement 를 상속받는 요소들을
      참고하시기 바랍니다.




      처음으로
      상당히 긴 포스트를 작성해서인지 , 생각도 안하고 적어대서인지 참 복잡한 포스트가 되어버렸습니다.
      특히나 아이콘 제작부분의 분량이 절반이
      넘어가서 이게 포토샵 강의인지 리본 설명인지 알 수 없을 정도로 정체성을 잃기 직전이네요. 어찌됬건 많은 분들에게 도움이 되었으면 합니다.
      :) 그럼 좋은 하루 되세요 ~

      블로그의 오른쪽 마우스 금지시킨거나 풀자!!

      나는 이해할 수 없다.
      누구나 보라고 블로그에 글을 써놓고 또 퍼와서 올려놓았으면서 왜 퍼가게는 못하는건지??
      그럴려면 아예 올리지말고 비밀글로 혼자 보던지........ 저작권 따질거면 책을 집필하던지...말이야..
      ----------------

      블로그의 글을 퍼가거나 복사 할수 있도록 오른쪽 마우스클릭 잠금을 풀어주는 플러그인 (스크립트) 입니다.

      다운로드 하세요!!

      http://myhome.hanafos.com/~yeamaec/%BA%ED%B7%CE%B1%D7%BF%C0%B8%A5%C2%CA%B8%B6%BF%EC%BD%BA%B1%DD%C1%F6%C7%D8%C1%A6.url

      1) 다운로드후 즐겨찾기 폴더("자신의 계정 홈 C:\Documents and Settings\내이름" 디렉토리 밑에)에 복사

      2)브라우저에서 원하는 블로그 띄운후 즐겨찾기메뉴에서 한번 실행!

      개떡같은 MS-VS++ 플랫폼 및 MFC DLL

      MSVC++ 1.0 , MFC1.0 부터 곧 정식릴리즈될 10.0 버전까지 십수년을 동고동락 했지만,MS의 것은 스케일만 거창하게 패러다임을 추구하는듯 폼만 잔뜩잡을 뿐 개발플랫폼과 개발자가 담당해야만하는 부분의 그 내실에 있어서는 갈수록 조잡해지는 느낌이다.
      솔직히 똑같은 제품을 놓고 리눅스/유닉스/맥os/MS-Windows 중에 유일하게 돈내고 사서써야하는 동네가 MS 동네이다..개발자들의 물이 그만큼 순수하지도 못하고 오로지 기업정신에 의해 일관되게 운영되는 , MS 의 매니아나 알바생들에게 주는 MVP가 벼슬인양 으시대며 서로 신성하지 못하게 경쟁을 부축이며 치열한 각축을 벌이는 개발자VS 개발자, 매니아VS매니아, 알바생VS알바생,사용자VS사용자가 서로 MS의 그늘에 있음을 자랑스러워 하며 너보다 내가 MS와 더 친하고 잘났음을 뽐내는 초딩수준의 경쟁시대를 살아 왔다.MS가 경영 전략상 그렇게 분위기를 조장하고 부추기는 것이다.
      그러니,일반 사용자나 학생,직장인,나름 전문가라 자칭하는 족속에 속한 분들... MVP다 뭐다 허울 좋은 그림의 떡에 혹해서 제발 ms 본사한번가서 사진찍고 관광이나 하고 시종잡배 생각으로 MS의 알바 1빠 노릇을 하기 보다는 고개를 들어 진정한 IT인 답게 Open Source를 지향하며 큰물에서 한번 놀아보기를 바란다. 뭐 큰물이라 봐야 지금까지 봐왔던 협소한 시선을 ms에서 돌려 좀 더 넓은 세상이 있음을 바라보라는 것이다.
      사실 ms도 쫒아가기 바쁠것이지, 수많은 오픈 프로젝트의 일환 하나하나를 따라갈 수가 없다.
      국내에도 많다.. 숨은 org 싸이트를 찾아다니자.
      개떡같은 MS-VS++ 플랫폼 및 MFC DLL은 솔직히 mfc 를 만드는게 아니었다.WIN SDK 기반으로 좀더 심플하게 갔어야 하는데...... 차라리 WTL을 진작에 근본으로 했어야 할지도...
      자바를 잡겠다고 C# 급조하고 .NET 플랫폼이라 내놓고,,, 이제 표준화를 넘어서 특화된 비표준화 방향으로 개발자를 사병으로 키우려고 한다...
      어쨋튼 MFC는 클래스를 파생하여 나만의 클래스를 만들수 있는 DLL이 확장형 DLL인데,이놈은 정적라이브러리 링크로 빌드하지 못한다. MFC 공유 DLL들을 배포시 항상 같이 깔아야 한다.
      강제로 정적으로 링크하면,MFC 내부에서 런타임오류가 나더라...
      반면에 , 확장형 DLL말고 정규DLL이라하는것 은 MFC 내부클래스를 파생해서 Export 못한다.
      해도 되는데 역시,MFC 내부에서 런타임오류가 나더라... 하지만 정적으로 링크가 가능하다는것..
      결국 mfc 클래스로 코딩해서 쓰려면 그냥 공유 DLL 쓰라는 것이다.
      MFC90의 버전 (VS2008) 의 MFC90.DLL 은 1MB 정도이다. (버전이 9.0.21022.8 이고 Windows/WinSxs/x86_Microsoft.VC90.MFC_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_a173767a에 존재한다) 그런데 이것이 VS2008 SP1 이라 불리는 Feature Pack (이것은 소스xx 싸이트들에서 돌아다니던 BCG 라이브러리를 MS에서 구매해 자신들의 MFC에 그 코드를 탑재한것) 을 설치하거나 그 VS2008 SP1 용 재배포 설치킷을 설치하면 MFC90.DLL의 크기만 4MB가 넘어버린다.(버전이 30729인가 어쩌구임-)
      어쨌튼, 필자마져도 생각은 이래도 이런 패러다임을 한사람이 분위기를 확 바꿀수 있는것도 아니고 그저 묻어가지만....
      알고는 쓰자는 얘기이다.. 최소한 GTK라도 좀 해 둘 것을...

      사족을 덧붙이자면,,

      IT 발전에 진정 헌신하고 공헌하길 원하는 사람은 MS맨이 되어서는 안된다는 것이다.

      MS-Windows 에서도 Paint.Net 말고 더 좋은 김프를 쓰자! GTK와 GDK

      ms-windows 유저분들,혹시 김프를 아십니까??

      김프의 다름아닌 장점 한가지를 말하라면,다른것 보다도 윈도우즈에서(ms) 32bpp 비트맵을 로드하고 저장하는 편집할 수 있는 몇안되는 (현재까지(2009년초) 알아본 이미지 편집기 중에서) 유일한 이미지 편집기(포토샵제외) 라는 것이다. 이 사실자체만으로도 대단하다. 이것은 Paint.net도 안되고 Paintshop도 아직 안되는것으로 알고있다.즉,24비트 비트맵까지만을 지원한다..ms-windows 플랫폼에서 32비트 비트맵을 지원하는 그 어떤 심플한 그래픽툴이없다. (비스타의 그림판은 될려나...확인못함..하지만 그림판의 차세대라고 점찍은 Paint.Net이 안되니,,, 그것또한 남의 공개라이브러리를 가져다 쓴 작은 아웃소싱 회사의 작품이다)
      Paint.Net은 cximage라는 공개 라이브러리 소스를 사용하는데 그것이 24비트만 지원한다.
      참고로,공개라이브러리 중 PaintLib 라는것이 훨씬 탁월하다. 이것은 32BPP 그리기가 지원된다.
      왜 32비트 ,32bpp 라고 말하냐면, 이 포맷부터가 RGBA 즉 알파브렌딩을 지원하기 때문이다.
      즉,윈도우 스킨이나 기타 비트맵 이미지에서 투명,반투명한 모양새를 나타낼수 있는 것이다.
      (PNG등의 포맷은 예전부터 있던 ALPHA BLEND 였지만,,, 그래서 크기도 작고 장점이 있어서 요새 다시 부각되며 자주 쓰이는 복고풍의 이미지 포맷인 것이다 ㅋㅋ,PNG 부활시대)




      GTK와 GDK




      1. GIMP Toolkit
      * 양해의 글 - 저도 어설프게 나마 알고 있는 부분들이라 객관적인 사실과 특성에 있어서 틀린 부분이 있을 수 있겠습니다. 바르게 고쳐 알려주신다면 자료를 찾아보고 변경하겠습니다.
      GTK는 "GIMP Toolkit"의 약자이다.

      그럼 GIMP는 무엇인가 리눅스에 관심이 있는 사람들이라면 한번쯤 들어봤을만한 이미지 편집기이다.바로 리눅스에서 사용할 수 있는 포토샵인것이다 두둥 (과장이 너무 심한건가 ㅡ.ㅡ).
      본인도 별로 똑똑한 사람은 아니라 정확히는 모르고 GIMP를 만들기 위해 존재했었다는 얘기를 들었던 기억이 있다. 하지만 지금은 어떤가 GTK의 Tutorial을 보면 이런말이 가장 처음 적혀있다. "GTK (GIMP Toolkit) is a library for creating graphical user interfaces" 그렇다 GUI를 만들기 위한 툴킷 라이브러리이다.

      2. GDK
      GDK와 우리가 가장많이 할일은 그리기와 Event이다.
      "GDK 라이브러리는 GTK+ 위젯(어플리케이션)과 윈도우 시스템을 이어주는 추상적 계층을 제공해줍니다" 라고 '그놈 플랫폼 아키텍쳐 개관'란에 적혀있다. -_-; 그 이전은 본인도 안해봐서 잘은 모르겠으나 듣기로는 GTK와 GDK의 구분이 없었다고 한다. 하지만 지금은 GTK와 윈도우 시스템 사이에 GDK가 있다.실제로 X Window든 MS Windows든 플랫폼과의 대화는 GDK가 맡아서 하고 GTK는 GDK와 좀더 쉬운 대화를 하는것이다. Event나 Drawing처럼 X Window와 친하게 지내야하는 작업들을 GTK와 플랫폼(일반적으로 X Window) 사이에서 처리 해 주는것이다. 그뿐 아니라 Font, Style, 이미지제어등 GUI의 중요한 부분들을 담당하고 있다. GTK는 이러한 GDK를 이용하여 구조적인 부분을 담당한다.현재에는 Xlib을 래핑하고 있는것은 GDK이다. GTK는 그 GDK를 이용하는것이다.

      3. GTK와 GDK 그리고 X Window
      X Window에서의 GUI 구현을 편리하게하고 개발자를 여유롭게 만들어 준다.
      우리가 X Window에서 GUI를 만들려면 어떻게 해야할까? 가장 기본적인 방법으로는 Xlib을 이용하여 개발하는것이 있다. 이것은 매우 귀찮고 어려울 수 있는 일이다.Xlib은 X Window에서 GUI 개발을 할 수 있는 가장 기본적인 라이브러리이다. 화면에 필요한 Widget들을 그려내고 GUI뿐만 아니라 X Window 시스템에 관련된 대부분의 기능을 지원하지만 원초적인 정보와 기능들만을 제공한다. 개발자가 Xlib을 사용하여 GUI부분을 구현한다면 직접 정보를 관리하고 안정성을 책임져야한다.





      기사를 더 읽으려면 http://www.gnome.or.kr/web/default/58 이곳으로 !





      김프받기: http://www.gimp.org/ http://gimp.kr/

      http://jaist.dl.sourceforge.net/sourceforge/gimp-win/gimp-2.6.6-i686-setup.exe

      무료소프트웨어

      http://freeoffice.tistory.com/category/Development
      http://freeoffice.tistory.com/category/Internet

      정적으로 MFC에 링크된 기본 DLL

      정적으로 MFC에 링크된 기본 DLL

      정적으로 MFC에 링크된 기본 DLL은 MFC를 내부적으로 사용하는 DLL이며, MFC 또는 비 MFC 실행 파일에서 이러한 DLL의 내보내기 함수를 호출할 수 있습니다. 이름에서 알 수 있듯이 이러한 종류의 DLL은 MFC의 정적 연결 라이브러리 버전을 사용하여 빌드됩니다. 기본 DLL에서 함수는 대개 표준 C 인터페이스를 사용하여 내보내집니다. 기본 DLL의 작성, 빌드 및 사용 방법에 대한 예제를 보려면 DLLScreenCap 샘플을 참조하십시오.
      USRDLL이라는 용어는 Visual C++ 설명서에서 더 이상 사용되지 않습니다. 정적으로 MFC에 링크한 기본 DLL의 특징은 이전 USRDLL의 특징과 같습니다.
      정적으로 MFC에 링크된 기본 DLL에는 다음과 같은 특징이 있습니다.
      C, C++, 파스칼, Visual Basic 등 DLL 사용을 지원하는 모든 언어로 클라이언트 실행 파일을 만들 수 있으며 이 실행 파일은 MFC 응용 프로그램이 아니어도 됩니다.
      DLL은 응용 프로그램에서 사용하는 것과 동일한 MFC 정적 연결 라이브러리에 링크됩니다. 따라서 DLL에 대한 별도의 정적 연결 라이브러리 버전은 필요하지 않습니다.
      MFC 버전 4.0 이전에 USRDLL은 정적으로 MFC에 링크된 기본 DLL과 같은 형식의 기능을 제공했습니다. 그러나 Visual C++ 버전 4.0부터는 USRDLL이라는 용어를 사용하지 않습니다.
      정적으로 MFC에 링크된 기본 DLL의 요구 사항은 다음과 같습니다.
      이 형식의 DLL에서는 CWinApp에서 파생된 클래스를 인스턴스화해야 합니다.
      이 형식의 DLL에서는 MFC에서 제공하는 DllMain을 사용합니다. 따라서 일반적인 MFC 응용 프로그램과 마찬가지로 모든 DLL과 관련된 초기화 코드는 InitInstance 멤버 함수에, 종료 코드는 ExitInstance에 포함시켜야 합니다.
      USRDLL이라는 용어가 더 이상 사용되지 않지만 컴파일러 명령줄에서는 "_USRDLL"을 정의해야 합니다. 이 정의는 MFC 헤더 파일에서 가져올 선언을 결정합니다.
      기본 DLL에는 MFC 응용 프로그램과 마찬가지로, CWinApp 파생 클래스 및 해당 응용 프로그램 클래스의 단일 개체가 있어야 합니다. 그러나 응용 프로그램의 CWinApp 개체와 달리 DLL의 CWinApp 개체에는 기본 메시지 펌프가 없습니다.
      응용 프로그램이 기본 메시지 펌프를 소유하므로 CWinApp::Run 메커니즘은 DLL에 적용되지 않습니다. DLL이 모덜리스 대화 상자를 열거나 자체의 기본 프레임 창을 갖는 경우, 응용 프로그램의 기본 메시지 펌프는 DLL에서 내보내는 루틴을 호출해야 합니다. 그러면 이 루틴이 DLL의 응용 프로그램 개체에 대한 CWinApp::PreTranslateMessage 멤버 함수를 호출하게 됩니다.
      이 함수의 예제를 보려면 DLLScreenCap 샘플을 참조하십시오.
      기호는 대개 표준 C 인터페이스를 사용하여 기본 DLL에서 내보내집니다. 기본 DLL에서 내보내기 함수의 선언 형식은 다음과 유사합니다.

      코드 복사

      extern "C" __declspec(dllexport) MyExportedFunction( );
      기본 DLL 내의 모든 메모리 할당은 DLL 내에 존재해야 하므로 DLL에서 다음 중 어떤 것도 호출 실행 파일에 전달하거나 호출 실행 파일로부터 받아서는 안 됩니다.

      MFC 개체에 대한 포인터
      MFC에서 할당한 메모리에 대한 포인터

      위와 같은 작업이 필요하거나 호출 실행 파일과 DLL 사이에 MFC 파생 개체를 전달해야 하는 경우에는 확장 DLL을 빌드해야 합니다.
      C 런타임 라이브러리에서 할당한 메모리에 대한 포인터는 해당 데이터의 복사본을 만들어야만 응용 프로그램과 DLL 간에 안전하게 전달됩니다. 이러한 포인터를 삭제하거나 크기를 변경하거나 사용하려면 반드시 메모리의 복사본을 만들어야 합니다.
      또한 정적으로 MFC에 링크된 DLL은 공유 MFC DLL에 동적으로 링크될 수 없습니다. 정적으로 MFC에 링크된 DLL은 다른 DLL과 마찬가지로 응용 프로그램에 동적으로 바인딩되며, 응용 프로그램은 다른 DLL과 마찬가지로 그것에 링크합니다.
      표준 MFC 정적 연결 라이브러리는 MFC DLL의 명명 규칙에 설명된 규칙에 따라 이름이 지정됩니다. 그러나 MFC 버전 3.0 이상에서는 링커에 링크하려는 MFC 라이브러리 버전을 직접 지정할 필요가 없습니다. 대신 MFC 헤더 파일에서 _DEBUG 또는 _UNICODE 등과 같은 전처리기의 정의에 따라 링크할 올바른 버전의 MFC 라이브러리를 자동으로 결정합니다. MFC 헤더 파일에 /DEFAULTLIB 지시문을 추가하여 링커가 특정 버전의 MFC 라이브러리에 링크하도록 합니다.

      http://msdn.microsoft.com/ko-kr/library/f22wcbea(VS.80).aspx

      동적으로 MFC에 링크하는 기본 DLL을 빌드할 때에는 AFX_MANAGE_STATE 매크로를 사용하여 MFC 모듈 상태를 올바르게 전환해야 합니다. DLL에서 내보낸 함수의 시작 부분에 다음과 같은 코드 행을 추가하여 이를 수행합니다.

      AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
      정적으로 MFC에 링크하는 기본 DLL이나 확장 DLL에 AFX_MANAGE_STATE 매크로를 사용해서는 안 됩니다. 자세한 내용은 MFC 모듈의 상태 데이터 관리를 참조하십시오.

      2009년 6월 15일 월요일

      MFC 확장 DLL,정적 라이브러리로 링크는 안되는 것일까? -- 정답:안된다

      환경 : Windows XP
      Visual Studio 2008 SP1, 한글
      일반적으로 바이너리에 정적 라이브러리를 포함하기 위해서는 아래 그림과 같이 프로젝트 속성 페이지에서
      "구성속성 - 일반 - MFC 사용"을 정적 라이브러리에서 MFC 사용으로 변경하면 된다.

      하지만, DLL의 경우 "fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds" 이런 에러 메세지를 만나게 될것이다.
      이럴때는 아래의 두개의 이미지에 보이는대로 "전처리기 - 전처리기 정의"에 _AFXDLL를 추가하고 "코드 생성 - 런타임 라이브러리"를 다중 스레드 디버그 DLL(/MDd)로 변경하면된다.
      * 릴리즈 모드일때는 다중 스레드 DLL(/MD)로 변경하면 되겠죠.


      ------------------------------------------------------------------------------------------------
      위(↑) 라고 되어있는 부분에 대해 사견을 펼칩니다.
      물론 맞는 말입니다만,

      근데 이렇게 하면 빌드는 에러없이 되도 나중에 Dependency 로 보면 그 DLL이 MFC에 정적으로 빌드된게 아니란걸 알게될겁니다.즉,MFCxx.dll 들이 물려있습니다.예를 들어 , MFC 클래스중 CDialog 를 파생한 나만의 CMyDialog를 DLL에 구현하고 EXE 측에서 이를 오버라이드한 CAboutDlg를 생성한후 런하면 바로 죽습니다.

      (MFC클래스를 안쓰면 잘돌겠지만,,,API만 쓴다면 표준 라이브러리 DLL 과 구분지을 필요도 없고..목적은 MFC를 쓰려는건데..)즉,만들었지만 MFC함수나 클래스를 쓰지도 못하는 빈껍데기의 무용지물의 정적 dll이되고 마는거죠..

      이 MFC 를 정적으로 링크한 DLL을 만들려면 위옵션과 반대로 /MT 에다가 _AFXDLL은 없어야 하며, 정적라이브러리에서 MFC사용으로 해야 합니다..

      단지,이것 EXE와 AFX_MANAGE_STATE 관련해서 오류가 난다는것..오류가 없으려면 DLL내에서 만든 클래스는 오직 DLL내에서만 사용하고 소멸되어져야 하거나, 아니면 AfxGetApp()나 MFC내부적으로 쓰는 위의 AFX_MANAGE_STATE 관련 코드를 타지않도록 피해가야 한다는것입니다.결국 MFC에 문제가 많다는 결론입니다.

      MFC의 많은 DLL을 설치배포시 포함안하려고 정적링크를 택해서 EXE만들고, 그에 딸린 나만의 DLL 식구들도 정적으로 링크해서 빌드하려했는데,위의 쓰레드나 메시지 처리등에서 치명적인 오류로 걸리는 군요...
      VC++의 DLLHusk 와 DllScreenCap 샘플 프로젝트로 테스트 해보시면 됩니다.
      CResizeDialog를 dll에 선언한후 Export 하고, EXE의 CAboutDlg를 CDialog 대신 CResizeDialog로부터 오버라이드 하면 됩니다. 아마도 OnNTColor() 이벤트에서 AFX_MANAGE_STATE 관련하여 ,또는 CThreadSlotData 에 ASSERT(nSlot != 0 && nSlot < color="#3333ff">OO 개의 댓글을 누르면 됩니다.


      MFC 확장 Extension DLL _declspec(dllexport) 사용하는 방법

      확장 DLL
      http://msdn.microsoft.com/ko-kr/library/h5f7ck28(VS.80).aspx

      MFC 확장 DLL은 일반적으로 기존의 MFC 라이브러리 클래스에서 파생된 다시 사용할 수 있는 클래스를 구현하는 DLL입니다.
      MFC 확장 DLL에는 다음과 같은 기능 및 요구 사항이 있습니다.
      클라이언트 실행 파일은 _AFXDLL이 정의된 상태에서 컴파일된 MFC 응용 프로그램이어야 합니다.
      동적으로 MFC에 링크한 기본 DLL에서 확장 DLL을 사용할 수도 있습니다.
      확장 DLL은 _AFXEXT가 정의된 상태에서 컴파일되어야 합니다. 그러면 _AFXDLL도 정의되고 MFC 헤더 파일에서 올바른 선언을 가져올 수 있습니다. 또한 DLL을 빌드할 때 AFX_EXT_CLASS가 __declspec(dllexport)으로 정의될 수 있으며, 이러한 정의는 이 매크로를 사용하여 확장 DLL에 클래스를 선언할 경우에 반드시 필요합니다.
      확장 DLL은 CWinApp에서 파생된 클래스를 인스턴스화하지 않아야 하며, 클라이언트 응용 프로그램 또는 DLL의 도움을 받아 이 개체를 제공해야 합니다.
      그러나 확장 DLL은 DllMain 함수를 제공해야 하며 이 함수에서 필요한 초기화 작업을 수행해야 합니다.
      확장 DLL은 MFC의 공유 버전이라고도 하는 MFC의 동적 연결 라이브러리 버전을 사용하여 빌드됩니다. MFC의 공유 버전을 사용하여 빌드된 MFC 실행 파일(응용 프로그램 또는 기본 DLL)만 확장 DLL을 사용할 수 있습니다. 클라이언트 응용 프로그램과 확장 DLL은 모두 같은 버전의 MFCx0.dll을 사용해야 합니다. 확장 DLL을 사용하면 MFC에서 새로운 사용자 지정 클래스를 파생시킨 다음 DLL을 호출하는 응용 프로그램에 이 확장된 버전의 MFC를 제공할 수 있습니다.

      STATUS_DLL_NOT_FOUND with VS2008,VS200x

      How to slove STATUS_DLL_NOT_FOUND message error or Could not found mfc90d.dll or mfc90.dll, mfc90u.dll mfc90ud.dll......

      In Debug or Release Folder,

      1) Delete All manifest,
      YourProjectName.embed.manifest
      YourProjectName.intermediate.manifest
      2)Change no manifest > Configure > Linker > manifest > No

      3) Rebuild All

      4)Rechange manifest yes!

      5) Rebuild All and run!


      VC++ Hints! => http://www.debuglab.com/knowledge

      통합 메신저



      Multi-Protocol-Messenger Pidgin 은 멀티 프로토콜을 사용하여 다양한 메신저들을 지원한다.


      홈페이지 : http://pidgin.im/




      Pidgin user survey results
      IM all your friends in one place
      Pidgin is an easy to use and free chat client used by millions. Connect to AIM, MSN, Yahoo, and more chat networks all at once.
      Supported chat networks:
      AIM
      Bonjour
      Gadu-Gadu
      Google Talk
      Groupwise
      ICQ
      IRC
      MSN
      MySpaceIM
      QQ
      SILC
      SIMPLE
      Sametime
      XMPP
      Yahoo!
      Zephyr



      아래는 http://ulsanin.tistory.com/ 의 글,

      1. 왜 오픈소스교육용메신저인가?
      1) PC를 부팅할 때 가장 먼저 하는 일이 무엇인가? 자동로그인되는 메신저에서 이메일을 확인하는 일이다. 즉, PC를 사용한다는 것은 메신저를 사용한다는 말과 동일한 의미이다.
      2) 수요자는 어떤 서비스를 원하는가?
      초등 사교육의 대표주자인 특정회사의 서비스를 통해 초등교사들은 음악교과의 우려를 덜었다. 이 서비스가 아니었다면 초등교사들은 지금도 오르간 또는 디지털피아노 앞에서 많은 시간을 보내고 특히 초등남교사들은 심한 스트레스를 받을 것이다. 이처럼 교육웹서비스에도 킬러어플리케이션(줄여서 킬러앱)이 필요하다는 얘기다.
      3) 네이트온은 어떻게 MSN을 앞질렀나?
      때마침 불어준 싸이월드 미니홈피에 더하여 SMS 월100건이라는 당시로서는 파격적인 서비스를 통해 이용자를 유인하는데 성공하였다. 그렇다면 에듀넷은 어떤 킬러앱을 갖고 있는가? 2.0서비스로 신규서비스되는 ‘마이포털’이나 ‘지인맺기’는 싸이월드의 1촌맺기의 인기가 시들한 것으로 보아 이미 킬러앱으로서의 지위를 상실했다. 더구나 싸이와 통하지도 않는다. 이는 요즘 추세인 ‘open API'와도 배치되는 흐름이다. 지금 이 시점에서 왜 오픈소스 교육용메신저인지 살펴보자.
      2. 무엇을 하자는 얘기인가?
      혹시 네이트온이라는 메신저를 쓰시나요? 그렇다면 얘기를 이해하기가 쉬워집니다. 매일 반복되는 생활 속에서 PC를 켤 때 자동로그인 설정으로 인해 부팅될 때마다 네이트온이 같이 켜집니다. 클릭 한 번으로 네이트 이메일을 확인하고, 필요한 경우에 SMS 보내고 ‘신한메신저뱅킹’을 이용해 은행업무를 봅니다. 오후 4시에는 ‘KBS라디오 콩’을 이용해 성기영의 경제투데이를 청취하면서 오늘의 경제상황을 정리합니다. 이처럼 네이트온은 킬러앱이 존재하는겁니다. 이래서 저는 네이트온을 씁니다.
      상황을 바꾸어서 우리반 2학년 학생은 집에서 PC를 키면 무엇을 할까요? 샘이 내준 숙제인 사이버가정학습 1차시 분량을 5줄로 요약하는 학습을 하고, 한컴타자연습에서 영어타자를 10분간 연습합니다. 그 다음에 야후꾸러기와 쥬니버에서 플래시게임을 하든지 동화를 보던지 합니다.
      이 경우는 담임이 ICT활용교육에 관심이 많은 경우이고 그 외의 대다수의 교사와 학생들은 공교육(사이버가정학습, EBS 등)과 상관없는 다른 활동을 주로 하고 있을 겁니다. 친구들과 채팅을 한다든지 온라인게임을 한다든지 하면서 어른들이 원하지 않는 서비스에 많이 노출되고 있을 겁니다.
      그렇다면 오픈소스교육용메신저를 통해 학생들의 이용서비스를 조절할 수 있는 방법이 가능할까요?
      3. 오픈소스교육용메신저(가칭 오샘메신저)에서는 어떤 서비스가 가능한가?
      이런 모습을 한번 상상해 볼 수 있습니다.
      초등학교6학년인 소윤이는 학교를 마치고 집에 와서 오후 5시가 되자 PC를 켜고 오샘메신저를 통해 영어대화방에 들어갑니다. 거기서 영어에 익숙한 친구들과 오늘의 토픽을 갖고 짧은 영어실력으로 대화를 나눕니다. 인공지능기능을 이용해 모르는 영어표현을 질문하기도 하고, 미니사전을 이용해 뜻을 파악합니다. 그리고, 저녁 8시에는 숙제를 하러 사이버가정학습 탭을 눌러 우리반 사이버학급에 들어가서 중1예비과정 영어 콘텐츠를 수강합니다. 겨울방학기간동안 32차시 중1EBS영어과정을 들으려면 매일 한차시씩 정리해야 숙제를 겨우 마칠 수 있습니다. 40분 동안 한 차시를 다 듣고 5줄로 요약 정리를 했습니다. 잠시 콘텐츠를 정지시켜놓고 샘이 추천하신 영어참고도서를 구입하려고 쇼핑몰탭을 눌러서 Longman Childrens Picture Dictionary를 주문하는데, 그동안 쌓은 포인트 10000점을 이용하여 4000원으로 책을 주문할 수 있었습니다. 다음번에 포인트를 써먹으려면 사이버가정학습 콘텐츠를 더 꾸준히 들어야겠습니다. 저녁 10시에는 엄마와 약속한 대로 오샘메신저에서 제공하는 슈팅게임을 30분간 했습니다. 친구들이 약속대로 10시 10분에 들어 와 있어서 정말 재밌습니다.
      4. 오샘메신저를 통해 무엇을 하려 하는가?
      네이트온의 경우처럼 시장에서 주도권을 쥐게 되면 사교육에 끌려 다닐 필요가 없이 원하는 방향으로 이끌어 나갈 수 있게 됩니다. 내가 원하는 교육서비스를 그림 그리듯이 그려 나갈 수 있게 되는 멋진 상황이 전개되는 것입니다. 물론 주도권을 쥐기까지는 주도면밀한 계획과 실행을 통해 지속적으로 추진을 해나가야 합니다. 주도권을 쥐고 나서 원하는 방향으로 지속적으로 가려면 오픈소스로 시작을 해야합니다. 아니면 구글이나 네이트온 API를 이용하여 콘텐츠 제공에 대한 MOU를 체결하고 처음에는 쉽게 시작하는 방법도 있습니다. 구글의 구글어스 서비스도 처음에는 몽상에 불과했습니다. 그렇지만 지금은 MS에서는 꿈도 꾸지 못할 킬러앱이 됐다고 생각합니다. 우리 교육계에서도 이러한 꿈과 같은 일이 가능할까요?

      2009년 6월 14일 일요일

      MFC정적으로 DLL 링크 + /MT 시 다음의 wincore.cpp 1475 line 에서 에러가 난다!

      MFC정적으로 DLL 링크 + /MT 시 다음의 wincore.cpp 1475 line 에서 에러가 난다!
      (다이얼로그 클래스를 DLL내부에서 호출하지 않고 EXE에서 override 하여 쓰는 경우)
      즉,CResizeDialog 를 DLL에 구현하고 EXE의 CAboutDlg를 CDialog가 아닌 DLL's CResizeDialog에서 상속받아 처리한경우에 발생!

      말이 보기좋게 정적링크로 DLL 사용가능하다고 한것 뿐이지 이렇게 정적 링크로 DLL을 MFC에 링크로 생성한 DLL 프로젝트에서 확장 컨트롤 클래스나 커스텀 컨트롤 클래스를 구현해놓고 이를 EXE 로 호출하면 빌드는 되더라도 EXE 런타임 에러가 난다. 그렇다면 공유 DLL 모드에서 밖에 MFC를 쓸수 밖에 없다는 말이나 마찬가지 아닌가??? 자꾸만 비대해지는 MFC DLL 들을 내프로그램과 함께 배포안하려는데..?? 방법이 음단말인가??
      아니면 EXE 안에 그많은 커스텀 컨트롤 (CWnd 파생등....) 의 소스코드를 fix 시켜서 덩치를 크게 만들어야 하나.. 공유 DLL 모드에서는 참 잘 도는데,정적 DLL모드는 왜 호환이 안되는건지,,내가 모르는 다른 설정이 있는건지,, 아니면 분명히 M$의 버그나 문제로써 Feedback되어 이 문제를 해결했으면 한다.
      리본바니 뭐니 지원하려고 MS에서 돈주고 껴넣은 BCG 라이브러리가 MFC에 내장되는 바람에 덩치가 한없이 커지는군...

      LRESULT CWnd::OnNTCtlColor(WPARAM wParam, LPARAM lParam)
      {
      // fill in special struct for compatiblity with 16-bit WM_CTLCOLOR
      AFX_CTLCOLOR ctl;
      ctl.hDC = (HDC)wParam;
      ctl.hWnd = (HWND)lParam;
      _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
      ctl.nCtlType = pThreadState->m_lastSentMsg.message - WM_CTLCOLORMSGBOX;
      //ASSERT(ctl.nCtlType >= CTLCOLOR_MSGBOX);
      ASSERT(ctl.nCtlType <= CTLCOLOR_STATIC);

      // Note: We call the virtual WindowProc for this window directly,
      // instead of calling AfxCallWindowProc, so that Default()
      // will still work (it will call the Default window proc with
      // the original Win32 WM_CTLCOLOR message).
      return WindowProc(WM_CTLCOLOR, 0, (LPARAM)&ctl);
      }

      테스트 방법은 간단하다.
      VC++샘플중에 DLLScreenCap 프로젝트를 열어서 DLLScreenCap DLL프로젝트에 CDialog형에서 override 한 CResizeDialog를 선언한다. 물론,
      #ifdef _USRDLL //UICTRLS_EXPORTS
      #define UICTRLS_API __declspec(dllexport)
      #else
      #define UICTRLS_API __declspec(dllimport)
      #endif
      식으로 export 선언해주고,,,

      ScreenCap 에서 screencap.cpp ,
      #include "../DllScreenCap/ResizingDialog.h"

      CAboutDlg 에서 CDialog 를 CResizingDialog 로 교체한다(Replace).

      Build ==> Error!

      MFC에 정적 또는 동적으로 링크하는 기본 DLL

      MFC에서 DLL의 종류는 두가지이다.
      _USRDLL(MFC정규DLL)과 _AFXDLL(MFC확장DLL)이다.
      _USRDLL은 MFC라이브러리의 초기화 종료를 위해 하나의 CWinApp 객체를 필요로한다.
      _AFXDLL은 CWinApp 객체를 필요로 하지 않는다.
      이는 애플리케이션의 MFC 클래스들을 공유하기 때문이다. AFXEXT는 AFXDLL이다.
      _AFXDLL이 정의가 되면, AfxGetResourceHandle함수로 리턴되는 값은 MFC의 전역 변수로 저장된 값이 리턴되는데 이 값은 EXE나 확장 DLL또는 MFC DLL 모두가 공유하는 값이다.
      엄격히 말해, 리소스를 로드한다는 말은 인스턴스 핸들 보다는 모듈 핸들가 연관있다. (인스턴스는 각 다른 데이타를 갖는 모듈(즉, 코드와 리소스들)들을 공유한다. )
      DLL은 EXE의 핸들과 다른 모듈 핸들을 갖는다.
      ::GetModuleHandle을 DLL의 모듈핸들을 얻기 위해 쓸수 있고, AfxSetResourceHandle을 통해서 DLL이 리소스를 찾을려고 할때 바로 찾을수 있게 처음에 위치하게 할 수 있다. 그러나 알아둘점은 이렇게 하게 되면 .EXE 모듈을 찾을 수 없게 된다. 그래서 보통 AfxSetResourceHandle을 호출하기전에 AfxGetResourceHandle로 핸들값을 복사해 저장한다.
      DLL리소스의 로드가 끝나면 다시 EXE모듈 핸들을 세팅하면된다.(http://webdizen.new21.net/blog/2520)

      DLL을 MFC 라이브러리에 정적으로 링크시키는 기술에 대한 자세한 내용은 Technical Note 11: Using MFC as Part of a DLL을 참조하십시오. DLLScreenCap 샘플은 확장 DLL이 되지 않고도 MFC에 동적으로 링크될 수 있습니다. MFC에 정적으로 링크시켜 사용자 지정 DLL을 구현하려면, 먼저 DLL Version of MFC의 설명과 DLLHUSK 샘플에서 보여 주는 것처럼 DLL을 MFC 확장 DLL로 구현할 것을 고려하십시오.

      DLL version of MFC xx ~ 90
      http://msdn.microsoft.com/ko-kr/library/hw85e4bb.aspx

      Download Visual Studio 2010(VS2010) Professional Beta1

      Download Visual Studio 2010(VS2010) Professional Beta1, click here to download the ISO image directly.


      Download Visual Studio 2010(VS2010) Team System Beta1, click here to download the ISO image directly. click here to download the ISO image directly.

      Performance Tools를 실제 환경에서 사용하기

      비주얼스튜디오 2010 : Win32가 전면으로 돌아온다

      아직은 다운받아 쓰기엔 부족하다.다시 지웠음. 참고로 MFC100.DLL 크기가 무려 4MB가 넘어간다..

      RedistributingVisualCppRunTimeLibrary

      1 개요
      VisualCpp 8.0부터 뭔가 배포가 귀찮아졌다. A required .DLL file, "MSVCR80.dll" was not found. app.exe has failed to start because the application configuration is incorrect. 응용프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다. 이 문제를 해결하려면 응용 프로그램을 다시 설치하십시오.
      2 Side-by-side Assembly
      DLL 충돌 문제 때문에 마이크로소프트가 Side-by-side Assembly인지 뭔지를 만들었다. 같은 컴퓨터 안에서 여러 버전의 DLL을 동시에 실행할 수 있도록 해주는 기능인 모양이다. 즉 각각의 애플리케이션에게 독립적인 DLL 환경을 보장해준다는 말이다. 이 파일들은 \Windows\WinSxS 디렉토리에 존재한다. Side-by-side Assembly가 무엇인지는 .NET 어셈블리 쪽을 참고하기 바란다. 어쨌든 이것 때문에 기존 방식(배포할 애플리케이션과 같은 디렉토리에 VisualCpp 런타임 DLL을 같이 넣어두기)이 통하지 않게 되었다. 애플리케이션을 정상적으로 돌아가게 하기 위해서는 이 Side-by-side DLL들을 배포하고, 뭔가 레지스트리를 잔뜩 건드려야한다.
      3 해결 방안

      3.1 윈도우즈 인스톨러를 이용해 셋업 프로젝트를 만든다
      아. 짱나.
      3.2 VC 8.0 안에 있는 셋업 파일을 같이 배포한다
      "...\Microsoft Visual Studio 8\SDK\v2.0\Bootstrapper\Packages\vcredist_x86\vcredist_x86.exe"
      또는 웹에서 다운로드받는다. Visual C++ 2005 Redistributable Package (x86) Visual C++ 2005 Redistributable Package (x64) Visual C++ 2005 Redistributable Package (ia64) Visual C++ 2005 SP1 Redistributable Package (x86) Visual C++ 2005 SP1 Redistributable Package (x64) Visual C++ 2005 SP1 Redistributable Package (ia64)
      위 파일을 먼저 설치한 후, 원래 애플리케이션을 돌리면 된다. 그런데 이상하게 인스톨 화면도 딱히 없고, 프로세스 창에 msiexec.exe가 반응이 없는 채로 상당 시간 떠 있는 것을 볼 수 있다. 뭐 어쨌든 설치는 되더라. 비교적 간단한 방법이기는 하지만 이넘을 실행시키기 위해 필요한 것들이 많다는 게 문제다. from http://www.codeproject.com/useritems/vcredists_x86.asp
      OS
      Installable
      Required Service Pack
      Other Software
      Windows 3.x/NT/95
      No
      N/A
      N/A
      Windows 98/ME
      Yes
      Internet Explorer 5.0 required (included in Win98SE/ME)
      Windows Installer 2.0 required
      Windows 2000
      Yes
      Service Pack 3 required (includes Windows Installer 2.0)
      Windows Installer 3.0 required
      Windows XP
      Yes
      Service Pack 2 Recommended
      Windows Installer 3.0 required (included in Service Pack 2)
      Windows Server 2003
      Yes
      Service Pack 1 Recommended
      Windows Installer 3.0 required (Windows Installer 3.1 included in Service pack 1)
      Windows Vista
      Yes
      None
      None
      3.3 Private Assembly를 설치한다
      실행 파일 자체와 실행 파일에서 액세스하는 DLL들에 대한 manifest 파일들을 private assembly로서 같이 배포하면, 에러를 피할 수 있다. 실행 파일의 manifest 파일은 오브젝트 파일 생기는 디렉토리 잘 뒤져보면 있을 것이다. 대충 아래와 같은 내용이다. XXX.exe.manifest












      그 다음 각각의 어셈블리, 즉 DLL에 대한 manifest 파일도 같이 배포해야 한다. (이 파일들은 기본적으로 ...\Microsoft Visual Studio 8\VC\redist 디렉토리 아래에 각 플랫폼 별로 존재한다.) Microsoft.VC80.CRT.manifest



      type="win32"
      name="Microsoft.VC80.CRT"
      version="8.0.50608.0"
      processorArchitecture="x86"
      publicKeyToken="1fc8b3b9a1e18e3b" />




      Microsoft.VC80.MFC.manifest



      type="win32"
      name="Microsoft.VC80.MFC"
      version="8.0.50608.0"
      processorArchitecture="x86"
      publicKeyToken="1fc8b3b9a1e18e3b" />





      이 manifest 파일과 DLL 파일들을 애플리케이션 실행 파일이 존재하는 디렉토리에 같이 넣어두면, 별도의 셋업 없이도 실행이 된다. 문제는 이렇게 했을 때, 저 DLL들의 새 버전이 나와도 XXX.exe는 이 혜택을 받을 수 없다는 점이다.
      3.4 .NET framework 2.0을 설치한다
      다운 열라 받아야함...
      3.5 CRT 소스를 이용해 커스텀 CRT를 빌드한다
      빌드한 파일을 마이크로소프트에서 배포하는 이름과 똑같은 이름으로 배포하면 법에 저촉되는 모양이다. 사실 빌드하기도 귀찮다.
      3.6 정적 링크를 이용한다
      C/C++ > Code Generation 항목에서 DLL 버전 말고 정적 CRT를 사용하도록 한다. 제일 간단한 방법이기는 하지만, 온라인 게임 클라이언트 같은 경우에는 매번 업데이트 때마다 커다란 크기의 실행 파일을 다운로드받아야하는 단점이...
      4 링크
      Bootstrapper for the VC++ 2005 Redists (with MSI 3.1)
      Visual C++ Deployment (C++)
      Visual C++ 배포 예제
      How to redistribute the Visual C++ Libraries with your application
      Visual C++ Libraries DLL Deployment
      How to build the 8.0 MFC and CRT DLLs with MSLU
      Redistributing Visual C++ Libraries
      Running C++ application built by VC++ Express on another computer
      Q&A on adapting VS2005 SP1 to build your applications
      How to silently install the VC++ runtime files redistributable package
      How to detect the presence of the VC 8.0 runtime redistributable package Updated VC 8.0 runtime redistributable packages are included in Visual Studio 2005 SP1
      How to detect whether or not the VS 2005 SP1 version of the VC++ runtime files redistributable package is installed on a system
      Building an MSI using WiX v3.0 that includes the VC 8.0 runtime merge modules
      http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=149470&SiteID=1
      http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=164465&SiteID=1
      see also VisualCpp

      http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary

      윈도 애플리케이션을 개발할 때 주로 쓰는 마이크로소프트(이하 MS)의 개발 도구들

      윈도 애플리케이션을 개발할 때 주로 쓰는 마이크로소프트(이하 MS)의 개발 도구들은 크게
      Visual Studio
      Windows Software Development Kit (Windows SDK)
      .NET Framework SDK
      Windows Driver Kit (WDK)
      정도를 꼽아볼 수 있겠다(이것 말고도 상당히 많은 개발 도구들이 있지만 생략..). 이 개발 도구들은 워낙 다양한 버전이 존재해서 윈도 애플리케이션 개발을 처음 시작하는 사람들이 헷갈리기 쉬울 것 같다. 도구별로 버전 관계를 정리해 보았다.
      Windows
      윈도는 개발 도구는 아니지만 버전을 잘 알고 있으면 좋을 때가 많으니 먼저 짚고 넘어가자. 윈도 2000, XP, 서버 2003, 비스타, 서버 2008은 모두 윈도 NT로부터 유래한 OS라는 것은 잘 알려진 사실이다. 윈도 NT 계열 OS에 관한 버전 정리는 여기에 잘 나와 있다(내용은 건너뛰고 중간의 표만 보면 된다). 요점은 저 위키백과 페이지에서 말하는 윈도의 내부 버전 번호(5.0, 5.1, 5.2, 6.0 등)는 커널 버전을 뜻한다는 것.
      커널 버전 외에 네 자리 숫자의 빌드 번호를 알아놓는 것도 중요하다. XP의 빌드 번호는 우리가 흔히 쓰는 x86 플랫폼의 경우 2600이고 나머지 별로 안쓰는 플랫폼에서는 3790, 서버 2003은 어디서나 항상 3790, 비스타는 6000이었다가 SP1이 되면서 6001로 올라갔고, 서버 2008은 처음부터 6001이다. 이 빌드 번호를 놓고 보면 XP와 서버 2003은 x86에선 다른 커널을 쓰지만 나머지 플랫폼에선 같은 커널을 쓰고 있고, 비스타는 SP1부터 서버 2008과 커널을 공유한다는 것을 알 수 있다.
      Windows SDK
      윈도 SDK(이하 SDK)는 우리가 매일같이 사용하는 윈도 애플리케이션(흔히 Win32라고 부르는)을 개발할 때 필요한 라이브러리와 프로그램을 모아놓은 것이다. 서버 2003 이전까지는 "플랫폼 SDK"라는 이름으로 불렀고, 비스타 이후로 .NET 프레임워크 SDK를 내장하면서 윈도 SDK라고 부른다. 윈도 SDK부터는 명령줄 기반의 C++ 컴파일러가 들어 있어서 비주얼 스튜디오를 돈주고 사서 쓰기 싫은 사람도 공짜로 윈도 애플리케이션을 만들 수 있다(에디터나 통합 환경은 각자 알아서..).
      SDK는 항상 윈도 새 버전에 맞춰 나온다. 근래 나온 것으로는 Windows Server 2003 SP1 Platform SDK, Windows Server 2003 R2 Platform SDK, Windows SDK for Windows Vista, Windows SDK Update for Windows Vista, Windows SDK for Windows Server 2008 등이 있다. 중간에 있는 Windows SDK Update for Windows Vista는 비스타용 SDK를 비스타 출시일에 맞춰 급하게 내놓는 바람에 문서를 미처 업데이트하지 못했던 것을 보강한 버전이다. 이름이 업데이트라서 꼭 패치같은 느낌을 주지만 실제로는 다른 SDK와 같은 풀버전이다.
      폴더를 보고 버전을 구분할 수도 있다. 서버 2003용 SDK까지는 "%ProgramFiles%\Microsoft Platform SDK" 폴더 밑에 설치된다. 비스타용 SDK부터는 방식이 달라져서 "%ProgramFiles%\Windows SDKs\Windows" 폴더 밑에 버전별로 따로 설치된다. 비스타용 SDK는 v6.0 폴더, 서버 2008용 SDK는 v6.1 폴더에 설치된다.
      Visual Studio
      MS의 핵심 개발 도구인 비주얼 스튜디오(이하 VS)는 어느 시점부터는 OS와 상관없이 .NET 프레임워크의 버전에 맞추어 새 버전이 나오고 있다. 아래는 .NET 프레임워크와 VS와의 버전 대응표다:

      중간에 .NET 3.0용 VS가 빠져 있는 것을 볼 수 있는데, 3.0은 .....
      http://junyoung.tistory.com/archive/200808 (여기에서 계속)

      Microsoft Side-by-Side Horror Visual C++ 2008

      http://www.reddit.com/comments/67woc/microsoft_sidebyside_horror

      파일만 잘 다뤄도 파워유저(?)

      파일관리
      http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=105&oid=030&aid=0002012838

      2009년 6월 12일 금요일

      Seoul City Hall and DeokSuGung



      덕수궁 The royal palace 'DeokSuGung'
      http://www.deoksugung.go.kr/eng/



      Seoul City Hall

      2008' 남해에 가려면 삼천포로 빠져야 한다!! 휴가지 남해일주,삼천포의 대교~여수


      우리는 용산 전쟁기념관에 비치된 탱크안에 있었습니다. We were in the tank of the War Memorial in Yongsan.


      귀염둥이 막내딸,토끼가면 쓰다.
      My Lovely youngest daughter put on the rabbit mask which i made.




      남해앞바다 도착,The coast of Namhae









      즐거운 휴가,The Happy summer holidays
      은모래로 유명한 상주해수욕장 (The silversands, SangJu beaches)
      http://www.sangjubeach.co.kr/











      처음 시작했던 주제와 벗어난 얘기를 많이 하면 사람들이 "얘기가 삼천포로 빠진다 " 라고 하는 바로 그 삼천포로 빠진다는 그 삼천포대교! 새벽 여명에 도착한 그곳 멋지다! 남해에 가려면 삼천포로 빠져야 한다!!
      SamChunPo Large Bridge in Namhae.


      URL Parse for SDK Function like AfxParseUrl

      필요한분 쓰시기 바람
      (MFC 코드를 WIN32 모드 DLL에서 쓰기위해
      MFC 의 AfxParseUrl() 함수를 WIN32 SDK에 맞게 수정함)
      http://durumul.com
      krkim

      BOOL MyParseUrl(LPCTSTR pstrURL, DWORD& dwServiceType,
      LPSTR strServer, LPSTR strObject, int &nPort,
      LPSTR strUsername, LPSTR strPassword, DWORD dwFlags = 0);
      #include "shlwapi.h"
      #include "wininet.h"
      #pragma comment (lib,"shlwapi.lib")
      #pragma comment (lib,"Wininet.lib")

      BOOL _myparseurl(LPCTSTR pstrURL,
      LPURL_COMPONENTS lpComponents, DWORD& dwServiceType,
      int & nPort, DWORD dwFlags)
      {
      // this function will return bogus stuff if lpComponents
      // isn't set up to copy the components
      LPTSTR pstrCanonicalizedURL;
      TCHAR szCanonicalizedURL[INTERNET_MAX_URL_LENGTH];
      DWORD dwNeededLength = INTERNET_MAX_URL_LENGTH;
      BOOL bRetVal;
      BOOL bMustFree = FALSE;

      // Decoding is done in InternetCrackUrl/UrlUnescape
      // so we don't need the ICU_DECODE flag here.

      DWORD dwCanonicalizeFlags = dwFlags & (ICU_NO_ENCODE ICU_NO_META ICU_ENCODE_SPACES_ONLY ICU_BROWSER_MODE);

      DWORD dwCrackFlags = 0;

      BOOL bUnescape = FALSE;

      if((dwFlags & (ICU_ESCAPE ICU_DECODE)) && (lpComponents->dwUrlPathLength != 0) )
      {
      // We use only the ICU_ESCAPE flag for decoding even if
      // ICU_DECODE is passed.

      // Also, if ICU_BROWSER_MODE is passed we do the unescaping
      // manually because InternetCrackUrl doesn't do
      // Browser mode unescaping

      if (dwFlags & ICU_BROWSER_MODE)
      bUnescape = TRUE;
      else
      dwCrackFlags = ICU_ESCAPE;
      }

      bRetVal = InternetCanonicalizeUrl(pstrURL, szCanonicalizedURL,
      &dwNeededLength, dwCanonicalizeFlags);

      if (!bRetVal)
      {
      if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER)
      return FALSE;

      pstrCanonicalizedURL = new TCHAR[dwNeededLength];
      if (pstrCanonicalizedURL == NULL)
      return FALSE;

      bMustFree = TRUE;
      bRetVal = InternetCanonicalizeUrl(pstrURL, pstrCanonicalizedURL,
      &dwNeededLength, dwCanonicalizeFlags);
      if (!bRetVal)
      {
      delete [] pstrCanonicalizedURL;
      return FALSE;
      }
      }
      else
      pstrCanonicalizedURL = szCanonicalizedURL;

      // now that it's safely canonicalized, crack it

      bRetVal = InternetCrackUrl(pstrCanonicalizedURL, 0,dwCrackFlags, lpComponents);

      if(bUnescape)
      {
      if(FAILED(UrlUnescape(lpComponents->lpszUrlPath,NULL,NULL,URL_UNESCAPE_INPLACE URL_DONT_UNESCAPE_EXTRA_INFO)))
      {
      if (bMustFree)
      delete [] pstrCanonicalizedURL;

      return FALSE;
      }

      lpComponents->dwUrlPathLength = lstrlen(lpComponents->lpszUrlPath);
      }

      if (bMustFree)
      delete [] pstrCanonicalizedURL;

      if (!bRetVal)
      dwServiceType = INTERNET_SCHEME_UNKNOWN;
      else
      {
      nPort = lpComponents->nPort;
      dwServiceType = lpComponents->nScheme;
      }
      return bRetVal;
      }
      //SDK available function to parser url string
      //durumul.com
      BOOL MyParseUrl(LPCTSTR pstrURL, DWORD& dwServiceType,
      LPSTR strServer, LPSTR strObject, int & nPort,
      LPSTR strUsername, LPSTR strPassword, DWORD dwFlags/* = 0*/)
      {
      dwServiceType = INTERNET_SCHEME_UNKNOWN;
      if (pstrURL == NULL)
      return FALSE;

      URL_COMPONENTS urlComponents;
      memset(&urlComponents, 0, sizeof(URL_COMPONENTS));
      urlComponents.dwStructSize = sizeof(URL_COMPONENTS);
      urlComponents.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH;
      urlComponents.lpszHostName = strServer;
      urlComponents.dwUrlPathLength = INTERNET_MAX_PATH_LENGTH;
      urlComponents.lpszUrlPath = strObject;
      urlComponents.dwUserNameLength = INTERNET_MAX_USER_NAME_LENGTH;
      urlComponents.lpszUserName = strUsername;
      urlComponents.dwPasswordLength = INTERNET_MAX_PASSWORD_LENGTH;
      urlComponents.lpszPassword = strPassword;
      BOOL bRetVal = _myparseurl(pstrURL, &urlComponents,dwServiceType, nPort, dwFlags);
      return bRetVal;
      }