조경민 bro@shinbiro.com
HTML코드를 임시파일로 저장한 파일 URL얻기 2002-11-20
=================================================================

가끔가다보면 동적으로 HTML코드를 만들어서 이를 네비게이트해야하는 경우가 있습니다.
이 경우 아주 심플한 경우 다음과 같은 것으로 할 수 있습니다.
m_Web.Navigate(_T("about:<HTML><BODY>hihi</BODY></HTML>", NULL, NULL, NULL, NULL );
실제로 위의 예는 간단하 익스플로러를 실행시킨 후 웹주소 넣는 곳에 about:<HTML><BODY>hihi</BODY></HTML> 만
넣어서 실행해볼 수도 있죠.
하지만 about 프로토콜의 제약으로 인해 몇 K 이상되는 코드는 넣을수 없습니다.
(비극은 여기서 부터 시작합니다 )

일딴 그런 비극을 care할 필요없는 간단한 동적 생성된 HTML의 경우
1. 내장 웹브라우저에 네비게이트 시킬때
m_Web.Navigate(_T("about::<HTML><BODY>hihi</BODY></HTML>", NULL, NULL, NULL, NULL );

2. 새로뜨는 웹브라우저에 네비게이트시킬때
ShellExecute( NULL, "open", "iexplore.exe",_T("about::<HTML><BODY>hihi</BODY></HTML>"), NULL, SW_SHOWNORMAL);

코드가 길어지면 제가 여러방법을 찾아봤지만, 능력의 한계인지 방법을 찾을수 없었습니다.
(1, 2 같은 케이스를 모두 만족시키는 말이죠)
1번만을 하겠다면 다큐먼트에게 직접 HTML 메모리 스트림을 넣어주는 약간의 테크닉으로 가능합니다

1,2번 만족시키는 IE 모든 버전과 호환되는 것을 얻고 싶어서 저는 다음처럼 트릭을 썼습니다.
임시파일에다가 해당 소스를 넣은 후 임시파일의 file url을 리턴받아 이를 navigate시키는 것입니다.

코드는 간단하여 다음과 같이 해결됩니다.

CString GetHTMLFileURL( LPCTSTR pszHTML )
{
        CString sHTML(pszHTML);
        
        TCHAR szTempPath[MAX_PATH];
        GetTempPath( MAX_PATH, szTempPath );
        // 임시 파일을 만든다.
        TCHAR szTempName[MAX_PATH];
        ZeroMemory( szTempName, sizeof(szTempName) );
        GetTempFileName(szTempPath, _T("bro"), 0, szTempName);

        HANDLE hTempFile;
        hTempFile = CreateFile((LPTSTR) szTempName, GENERIC_READ | GENERIC_WRITE,  
                                        0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);                        // no attr. template

        DWORD dwWritten;
        WriteFile( hTempFile, (LPCTSTR)sHTML, (DWORD)sHTML.GetLength(), &dwWritten, NULL );

        CloseHandle(hTempFile);

        // 생성된 임시파일의 File URL을 리턴한다.
        CString sURL;
        sURL.Format(_T("file://%s"), szTempName );
        return sURL;
}

1.의 경우
m_Web.Navigate(  GetHTMLFileURL(_T(":<HTML><BODY>hihi</BODY></HTML>"), NULL, NULL, NULL, NULL );

2번 역시
ShellExecute( NULL, "open", "iexplore.exe",GetHTMLFileURL(_T(":<HTML><BODY>hihi</BODY></HTML>"),  NULL, SW_SHOWNORMAL);

로 하시면 됩니다.

+ Recent posts