음..더이상은 저도 모르겠네요 ^^
참고자료를 하나 드리겠습니다. HTML을 직접 고치는거죠 -_- target을...;
『C++ Builder Programer's Group-질답 게시판 (go SGCCCC)』 1484번
제 목:[참고/1477] HTML 소스 보기...
올린이:ultras (박진국 ) 01/01/31 23:51 읽음: 28 E[7m관련자료 있음(TL)E[0m
-----------------------------------------------------------------------------
안녕하세요.
CppWebBrowser Control.. 즉 Internet Explorer Control 은
크게 두부분으로 나뉩니다...
Connection 과 HTML Parsing 등을 담당하는 mshtml (mshtml.dll, mshtml.tlb)
그리고, 윈도우에 디스플레이(렌더링)하는 shdocvw (shdocvw.dll, shdocvw.tlb)
여기에서 기본적으로 CppWebBrowser 는 ShDocVw 이며, mshtml 은 밑에
숨어있다보니... 기본적인 메소드, 프로퍼티 등에는 HTML 소스와 관련된
내용이 나타나지 않습니다...
하지만 Document 라는 프로퍼티가 있습니다.
ShDocVw 에서 MsHtml.dll 의 HTMLDocument2 에 접근하는 것으로,
기본적으로 많이 쓰일꺼 같아 겉으로 빼논듯 합니다..
사실 기본적인 Parse 된 내용이 모두 저기에 들어 있습니다...
Visual Basic 이나 Delphi 등에서는 이 프로퍼티에 접근할때,
자동화로 처리해서 DisPatch 를 다 알아서 내부 객체로의 접근을
하더군요.. Ole Automation....
그 내부의 Document Object 는 기본적인 mshtml 의 Document Object 와
동일한 Property, Method, Event, Collection 으로 구성되어 있기 때문에
MSDN 에서 Document Object 중 'Web Workshop'에 관련된 부분을
참고 하시면 도움이 되실겁니다...
DOM (Document Object Modeling) 개념으로, 모든 Tag 가 객체화 되어 있습니다
MsXml.Dll (XML 파서) 에서도 동일 하죠...
xml 자체가 DOM 이라, Netscape, IE 모두 XML 을 지원하다 보니 HTML도
DOM 으로 파서 해서 늘어 놓습니다... (어떻게 보면 편하고 어떻게 보면 불편)
여튼, 이런 Document Object 가 있는데, C Builder 에서 이걸 어떻게 접근 하느냐..
3~4가지 방법이 있습니다....
여러 서적이나, 관련 사이트에서 Ole Automation 부분을 찾아보시면
방법이 다 나와있습니다....
그 중에 가장 간단하게 할 수 있는 방법을 알려 드리겠습니다..
비교적 많이 쓰이고(퍼포먼스(속도)를 생각 한다면 별로 입니다.)
직관적인 프로그래밍이 가능한 Ole-Variant 로의 접근을 소개해 드리죠.
Variant 가 아주 좋아서.. Ole Object 로 Variant 에 우겨 넣을 수 있습니다.
^도
Visual Basic, Delphi 등이 Variant 를 기반으로 변수를 운영하니
그들 둘에선 Ole Automation 이 말 그대로 자동으로 다 되버리죠...
여튼 C Builder 의 Variant 에도 그와 같은 기능이 있습니다.
OlePropertyGet, OlePropertySet, OleFunction 등이 있구요...
C Builder 에만 있는거기에(- -;) 다른 레퍼런스(MSDN 등)에는 없네요 - -;
C Builder 의 레퍼런스에도 아주 간략히만 나와있습니다.
여튼 위의 3 함수는 Ole Automation 을 통한 프로퍼티 접근, 함수 접근을
시각적으로 표현 한겁니다.. (내부적으로 엄청 많은 일을 하다보니 - -;
속도가 쪼까 느립니다.)
기본적으로 Document Object 에서 All 이라는 Collection 을 접근 하고자
한다면
Variant MyDocument = CppWebBrowser1->Document;
MyDocument.OlePropertyGet("all");
이렇게 하면 됩니다... 델파이, 비베보다는 거추장 하지만.
만만치 않은 시각적 자동화가 가능합니다...
OlePropertyGet : 프로퍼티에서 값을 불러낼때
OlePropertySet : 프로퍼티에 값을 써 넣을때
OleFunction() : 함수에 값을 넣고 리턴 받을때.
이렇게 기본적인 3가지가 있습니다.
클래스, 컴포넌트 에 익숙한 분이라면 쉽게 뭔지 아실겁니다.
여기에서 젤로 중요한 소스보기..
아쉽게 Document 객체에서 Ole Automation 을 이용해 따운받은 원 소스를
볼수 있는 방법은 없습니다... 다만 무식(?)하게...
Document Object (IDispatch) 를 스트림으로 다른 스트림으로 샤샥 해버리면
내용이 다 넘어 옵니다.. Document Object 라는게
실제로는 HTML 소스를 가지고 있고 mshtml 에서 그 Ole Object를 가지고
노는거죠...
여튼 그 방법 말고, Ole 를 통해선....
아까 그 MyDocument
AnsiString BodySource = MyDocument.OlePropertyGet("body").OlePropertyGet("inner
html);
입니다....Body의 Html 을 불러 옵니다...
여튼 불러오면 원본 소스랑은 조금 틀릴겁니다....
mshtml 이 이것저것 오류가 생길 수 있는 부분, 문법이 약간 어긋난 부분
태그를 열어놓고 안닫아논거 등을 모두 오류 안나게 처리한 소스입니다.
이 외에, 참고로 Collection 에 접근 하는 방법을...
기본적으로 VB 나 Delphi 에서는
Document.All(1).tagname 이라고 하면 전체 html 에서 첫번째에 위치한
tag의 tag 이름을 반환해줍니다... All 이 Collection 이죠.
이걸 C Builder 에서는 Property로 대처 합니다...
Document.OlePropertyGet("All").OleFunction("item", 1).OlePropertyGet("tagname")
; 이렇게 하면 이건 AnsiString 형식으로 전체 HTML 중 첫번째 Tag의
Tag 이름을 반환합니다..
이 외에, WebBrowser 에 접근할때는 잘 쓰이지 않지만, 온갖 OLE Object에
접근할때 OlePropertySet("...", ...) 도 많이 쓰일겁니다...
Excel, Word, 등등 Office 등이 대표적이죠...
WebBrowser 에서 쓰이는 예를 보여 드리면,
CppWebBrowser 에 어떤 내용을 넣은 후에(about:blank 혹은
http://www.???....등)
MyDocument.OlePropertyGet("body").OlePropertySet("innerhtml","hahaha");
이렇게 하면 Body 에 hahaha 라는 내용으로 html 에 쓰이게 됩니다...
그래서 웹 브라우저에는 hahaha라고 나타날겁니다...(기존의 웹 브라우저의
데이터는 없어지구요..)
이 외에 Document Object 의 각종 Property, Collection, Method 등을
잘 구현 하시면.. WebBrowser 컨트롤에 맘데로 내용 넣고 고치고 등을
하실 수 있습니다... (Java Script를 많이 다뤄보셨으면 이 말이
어떤 뜻인지 아실겁니다.... 완전 동일하죠.)
그 외에
나 등의 Tag 나 웹브라우저의 각종 객체(이미지, 링크
DIV, Span, Style 등등...)를 주무를 수 있습니다...
설명이 너무 길어졌습니다...
씨 빌더에서 이와 관련된 내용이 거의 없어서(- -;) 이것 저것 보면서
알아낸겁니다...
다른 님들은 저같은 고생 하시지 마시라고 글이 길어 졌습니다...
여튼, 참고 하세요....
OLE Automation 을 제외한 부분은 MSDN 에도 많이 나와있으므로 참고 하시기 바랍
니다...
그럼, 글 읽어 주셔서 감사 합니다.