// 웹페이지에 있는 javascript 함수를 호출한다.

    m_pIWeb = GetIWebPointer();

    IDispatch *pDisp=NULL;

    VARIANT varRet;

    m_pIWeb->get_Document(&pDisp);

    IHTMLDocument2* pHtmlDoc = (IHTMLDocument2*)pDisp;

    IHTMLWindow2* pHtml;

    pHtmlDoc->get_parentWindow(&pHtml);



    CString sFunc = "func_control_call();";

    BSTR pbFunc = sFunc.AllocSysString();

    CString sLang = "javascript";

    BSTR pbLang = sLang.AllocSysString();

    pHtml->execScript(pbFunc, pbLang, &varRet);

    pDisp->Release();

   // ------------------------------------------------------------



IWebBrowser2* CClockCtrl::GetIWebPointer()        // 브라우저 포인터 얻기.

{

    HRESULT hr ;

    IOleContainer *pIContainer = NULL ;

    IWebBrowser2 *pIWeb = NULL ;

    IServiceProvider *pISP = NULL ;

    

    // Get IOleClientSite interface pointer.

    LPOLECLIENTSITE pIClientSite = GetClientSite() ;

    

    // Get IOleContainer interface poineter.

    hr = pIClientSite->GetContainer(&pIContainer) ;

    if (hr != S_OK) {

        pIClientSite->Release() ;

        return NULL ;

    }

    

    // Get IServiceProvider interface pointer.

    hr = pIClientSite->QueryInterface(IID_IServiceProvider,

        (void **)&pISP) ;

    if (hr != S_OK) {

        pIContainer->Release() ;

        pIClientSite->Release() ;

        return NULL ;

    }



    // Get IWebBrowser2 interface pointer.

    hr = pISP->QueryService(IID_IWebBrowserApp,

        IID_IWebBrowser2,(void**)&pIWeb) ;

    if (hr != S_OK) {

        pIContainer->Release() ;

        pIClientSite->Release() ;

        pISP->Release() ;

        return NULL ;

    }

    // release interface.

    pIContainer->Release() ;

    pIClientSite->Release() ;

    pISP->Release() ;

    return pIWeb ;

}

제목에서 말한 걸 할려구 갖은 방법을 다 써봐도 잘 안되더군요...  

찾아낸 방법이 예전에 ActiveX 에서 자신을 포함한 웹브라우저를 찾는 방법을 이용하니 제대로 찾아지더군요..



다음은 코드입니다... 필요하신 분들 참고하시기 바랍니다.



    // Get IOleContainer interface pointer
    IOleContainer*  pContainer;
    hr = spDoc->QueryInterface(IID_IOleContainer, (void**)&pContainer);

    if(FAILED(hr) || pContainer == NULL)
        return FALSE;

    IServiceProvider *pISP = NULL;

    // Get IServiceProvider interface pointer.
    hr = pContainer->QueryInterface(IID_IServiceProvider, (void **)&pISP);
    pContainer ->Release();
    if(FAILED(hr) || pISP == NULL)
        return FALSE;

    // Get IWebBrowser2 interface pointer.
    hr = pISP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&pIExplorer);
    pISP->Release();
    if(FAILED(hr) || pIExplorer == NULL)
    {
        pIExplorer = NULL;
        return FALSE;
    }

Screen Saver를 동작 못하게 함.

Program Visual C++ 2007. 3. 22. 09:58 Posted by HisPark
XP환경에서 작업 중이었습니다.

PreTranslateMessage() 내에서

//Screen Saver를 동작 못하게 함.

VERIFY(SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, 0, 0));

//Screen Saver를 동작하게 함.

VERIFY(SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, 0, 0));



이 방법 외에 다른 방법.



SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT,0,m_uScrSaveTime,0);

SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, 0, NULL, 0);

//Screen Saver를 다시 초기화 함.

SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,m_uScrSaveTime,NULL, 0);



위와 같은 함수를 사용하니 금방 해결되는군요.



WM_SYSCOMMAND, wParam == SC_SCREENSAVE 인 경우 화면보호기가 작동하는 것은 맞습니다만. 여기에 먼저 소개된 방법을 사용해선 화면보호기 종료 처리가 안되었습니다. (XP, Window 2000모두에서)



그럼 즐프하세요.

Visual C++ Release 디버깅2

Program Visual C++ 2007. 2. 28. 16:05 Posted by HisPark
우연히 얻었는데,..,...
쓸만하군요.

<요약> 어플리케이션을 릴리즈 모드로 Build 할 때 디버깅 정보를 남기어서 VC++ Debugging Tool에서 디버깅을 가능하게 합니다.
이 방법을 사용하는 경우, 실제 릴리즈 실행 파일은 거의 영향을 받지 않으면서,
디버그에서 브레이크 포인터를 잡거나, Trace를 가능하게 하므로,
릴리즈모드 에서만 발생하는 버그를 잡을수 있습니다.


<추가정보>
이 방법을 사용하게 되면 _DEBUG free define으로 포함되는 디버깅 메크로는 포함되지 않으나,
Source code안으로 Step in 가능하게 하는 디버깅 정보들은 OBJ와 PDB 파일에 남게 됩니다.
이를 이용하게 되면 VC++ IDE 환경에서 source level 까지의 step in이 가능해 집니다.


<방법>
1. Project를 open한뒤 menu 'Project/Settings'를 선택합니다.
2. 'Settings For'를 'Win32 Release'로 선택합니다.
3. 'C/C++' tab에서 'category'를 'General'로 선택하고 'Program Database'로 선택합니다.
4. 'Link' tab에서 'category'를 General'로 선택하고 'Generate debug info'를 체크합니다.
5. 'Rebuild All'를 실행하여서 프로그램을 다시 빌드 합니다.

이제 디버깅 하고자 하는 위치에 브레이크포인터를 잡고 'Go'를 실행하면,
디버깅을 진행할수 있습니다.