|
이진수 님이 쓰신 글 :
: 안녕하세요?
: 저는 빌드6.0을 쓰고 있습니다.
: 이번에 activex 로 작업을 하는데 activexform에 CppWebBrowser1을 장착하고
: 여기에 주소를 매칭 시키고 스크롤바를 없애려고 합니다.
: 근데 실제 웹브라우저에서 띄우니 에러가뜨는군요...
: Access violation at address 06D2E21F in module 'XUP1PR~1.OCX'. Read of address 00000800
:
: 이런 에러가 뜹니다...
: 어떻게 해야 하나요?
: 여러분의 조언을 부탁 합니다.
:
: 아래는 소스입니다.
: void __fastcall Txup1::CppWebBrowser1DocumentComplete(TObject *Sender,
: LPDISPATCH pDisp, Variant *URL)
: {
: Variant HTMLDoc = ((TCppWebBrowser *) Sender)->Document;
: if ( !VarIsEmpty( HTMLDoc ) )
: {
: Variant Body = HTMLDoc.OlePropertyGet("body");
:
: if ( !VarIsEmpty( Body ) )
: {
: Body.OlePropertyGet("style").OlePropertySet("borderStyle", "none");
: Body.OlePropertySet("scroll", "no");
: VarClear(Body);
: }
: VarClear(HTMLDoc);
: }
: }
DocumentComplete 이벤트는 매 프레임마다 발생합니다.
스크롤바에 국한해서 생각한다면,
프레임이 나누어지지 않은 경우 ((TCppWebBrowser *) Sender)->Document로 해도 별 이상이 없습니다.
하지만, 프레임이 나누어진 경우에는 pDisp를 통해 액세스해야 하며 마지막으로 발생하는 DocumentComplete 이벤트는 무시해야 합니다.
마지막으로 발생하는 DocumentComplete 이벤트는 프레임을 나누는 소스가 있는 HTML을 위한 것으로서 이는 창을 가지지 않게됩니다. 그리고 이 이벤트 시에는 pDisp==CppWebBrowser1->ControlInterface입니다.
프레임이 나누어지지 않은 경우에도 pDisp==CppWebBrowser1->ControlInterface입니다.
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
Variant webbrowserframe=Unassigned,HTMLDoc=Unassigned,Body=Unassigned;
try{
//Caption=(String)*URL;
//Variant HTMLDoc = ((TCppWebBrowser *) Sender)->Document;
webbrowserframe = pDisp;
HTMLDoc=webbrowserframe.OlePropertyGet("Document");
if ( !VarIsEmpty( HTMLDoc ) )
{
Body = HTMLDoc.OlePropertyGet("Body");
if ( !VarIsEmpty( Body ) )
{
Body.OlePropertyGet("style").OlePropertySet("borderStyle", "none");
Body.OlePropertySet("Scroll", "no");
}
}
}catch(...){
}
VarClear(Body);
VarClear(HTMLDoc);
VarClear(webbrowserframe);
}
|