MoniWiki¸Þ¸ðÀå_Web
Login:
Password:
´ë¹®|ã±â|¹Ù²ï±Û|¸ñ·Ï|¸Þ¸ðÀå|Ã¥°¥ÇÇ|¿¬²É|¸µÅ©
Edit Diff Reload Search Print Info Mail Help RSS

@ 2010-08-20 @
  ¸Þ¸ðÀå Web

1 Âü°í
2 À¥ºê¶ó¿ìÀú
2.1 uBrowser
2.2 °ÔÀÓ¼ÓÀÇ À¥ºê¶ó¿ìÀú Rogue
3 Program
3.1 IWebBrowser::Navigate Post µ¥ÀÌÅÍ º¸³»±â
3.2 IWebBrowser2¸¦ ÀÌ¿ëÇؼ­ ºê¶ó¿ìÀú¸¦ ¶ç¿ï ¶§, ºê¶ó¿ìÀú¸¦ ´Ù¸£°Ô Çغ¸ÀÚ
3.3 POST ¹æ½ÄÀ¸·Î À¥ÆäÀÌÁö¸¦ Àоî¿À±â
3.4 POST ¹æ½ÄÀ¸·Î À¥ÆäÀÌÁö È£ÃâÇؼ­ °á°ú°ª ¾ò¾î¿À±â
3.5 ÆÄÀÏ ¹ÞÀ» ¶§ Æú´õ ¼±ÅÃÇϴ â
3.6 Programming the MSHTML Web Browser Control with C++
Á¤¸®
http://www.mykit.com/kor/ele/data_22/internet.htm - ÀÎÅÍ³Ý ¿ë¾î


1 Âü°í #

ÀÛÀº ÁÖÁ¦
{_o} Meta_Tag - robots.txtÆÄÀÏ°ú ¸ÞŸ ű×

ÁÖÁ¦¾î ; Google "Embedded browser C++ sample" or "À¥ºê¶ó¿ìÀú ÀÓº£µù"
library

2 À¥ºê¶ó¿ìÀú #

2.1 uBrowser #


¢¹ http://ubrowser.com/
uBrowser´Â Mozilla¿£ÁøÀ» ÅëÇØ Firefox 1.5·Î º¸ÀÌ´Â À¥ ÆäÀÌÁö¸¦ 3Â÷¿øÀ¸·Î ·»´õ¸µ ÇÒ ¼ö ÀÖ°Ô ÇÏ´Â OpenGL(tm) ÇÁ·Î±×·¥ÀÌ´Ù. À¥ÆäÀÌÁö¿¡ ´ëÇÑ Á¿ì Å©±â º¯°æ, Âî±×¸®±â, ÆĵµÇü µî ´Ù¾çÇÑ ÀÎÅÍÆäÀ̽º·Î º¯ÇüÀ» °¡´ÉÇÏ°Ô ¸¸µç´Ù.

CallumÀº 3Â÷¿ø °¡»ó Ä¿¹Â´ÏƼ ¼ÒÇÁÆ®¿þ¾î¸¦ °³¹ßÇÏ´Â SecondLifeÀÇ °³¹ßÀÚÀ̱⵵ ÇÏ´Ù. (SecondLife´Â 2006³â web2con¿¡¼­ ²Ï ÁÁÀº ¹ÝÀÀÀ» ¾ò±âµµ Çß´Ù.) ±×´Â ÀÌ ÇÁ·Î±×·¥À» ¸¸µç ÀÌÀ¯°¡ 2-D ºê¶ó¿ìÀú¸¦ ´ëüÇÏ°íÀÚ ÇÏ´Â °Ô ¾Æ´Ï¶ó, ¹º°¡ Á» ´õ Àç¹Õ°í Çõ½ÅÀûÀÎ °É ¸¸µé°í ½Í¾î Çß´Ù´Â °ÍÀÌ´Ù.

2.2 °ÔÀÓ¼ÓÀÇ À¥ºê¶ó¿ìÀú Rogue #

Rogue´Â Adobe AIR ±â¹ÝÀÇ °ÔÀÓ ºê¶ó¿ìÀú·Î XP¿Í ºñ½ºÅ¸¿¡¼­ »ç¿ë ÇÒ ¼ö ÀÖ´Ù. CSS, ÀÚ¹Ù½ºÅ©¸³Æ®, Ç÷¡½Ã¸¦ Áö¿øÇϸç ÅÇÀº ¹°·Ð ȨÆäÀÌÁö ÁöÁ¤°ú ºÏ¸¶Å©µµ °¡´ÉÇÏ´Ù.

´ÜÃàÅ°...
F11 : Rogue¿Í °ÔÀÓ°£ÀÇ ¸¶¿ì½º/Å°º¸µå ÄÁÆ®·Ñ Àüȯ
F10 : Rogue¸¦ ´ú Åõ¸íÇÏ°Ô..
F9 : Rogue¸¦ ´õ Åõ¸íÇÏ°Ô..

Áö¿øµÇ´Â °ÔÀÓ ¸ñ·ÏÀº...
. Age of Conan
. Battlefield 2
. Call of Duty
. Call of Duty 2 (not on menu screens)
. Civilization IV
. Counter-Strike: Source
. Counter-Strike 1.6
. Gears of War
. Guild Wars
. Half-Life 2
. Halo: Combat Evolved
. Neverwinter Nights
. Neverwinter Nights 2
. Portal
. Unreal Tournament III
. Warhammer 40,000
. Warhammer: Dawn of War
. World of Warcraft

Áö¿øÇÏÁö ¾Ê´Â °ÔÀÓ¸ñ·Ï...
. Call of Duty 4
. Diablo 2
. Doom 3
. Quake 4
. Starcraft
. Warcraft III
. Wolfenstein: Enemy Territory

°ÔÀÓÇϸ鼭 ºí·Î±× ´ñ±ÛÀ» ´Þ°Å³ª À¯Æ©ºê ºñµð¿Àµµ º¼ ¼ö ÀÖ´Ù.

3 Program #

3.1 IWebBrowser::Navigate Post µ¥ÀÌÅÍ º¸³»±â #

¿ø¹®; http://zzoouc.tistory.com/2

IWebBrowser::Navigate Post µ¥ÀÌÅÍ º¸³»±â
À̰͵µ ¿ª½Ã Á» Çì¸å´Ù.
IWebBrowser::Navigate ÇÔ¼ö¸¦ ÀÌ¿ëÇØ µ¥ÀÌÅ͸¦ Post ÇؾßÇß´Ù.
À̰͵µ ½ÃÀ۽ô ¾öû °£´ÜÇÒ °ÍÀ¸·Î »ý°¢Çß´Ù.
±Ùµ¥ ¼Ò½º¸¦ ¾Æ¹«¸® ºÁµµ À߸øµÈ Á¡Àº ¾ø´Âµ¥ ÀÛµ¿ÀÌ µÇÁú ¾Ê¾Ò´Ù...
³­°¨... Navigate ¸Þ¼­µå¸¦ È£ÃâÇÒ ¶§ ÆĶó¹ÌÅÍÁß Headers Ç׸ñÀÌ ÀÖ´Ù.
ÀÌ°ÍÀº À¥¼­¹ö¿¡ HTTP Çì´õ¸¦ Æ÷ÇÔÇÏ´Â °ªÀÌ´Ù.
³ª´Â ´ç¿¬È÷ HTTP Post °ª¸¸ ³Ö¾îÁÖ¸é µÉ°ÍÀ¸·Î »ý°¢Çß´Ù.

"µ¥ÀÌÅÍ Post ÇÒ¶§´Â ¹Ýµå½Ã Çì´õ ³»¿ëµµ ³Ö¾îÁÖ¾î¾ß ÇÑ´Ù."

´ÙÀ½Àº ¼Ò½ºÀÌ´Ù.
#include <Exdisp.h>

// CString sUrl = "c:/Help.htm"; // cf. file://c:/help.htm
CString sUrl = "http://www.naver.com";
BSTR bstrUrl = sUrl.AllocSysString();

VARIANT vtHeader={0}, vtPost={0}, vtEmpty={0};

CString sHeader = "Content-Type: application/x-www-form-urlencoded\n";
vtHeader.vt = VT_BSTR;
vtHeader.bstrVal = sHeader.AllocSysString();

LPCTSTR szPostData = "postdatatest";
int nPostLen = strlen(szPostData);

LPSAFEARRAY psa = SafeArrayCreateVector(VT_UI1, 0, nPostLen);
if (!psa) return;

LPSTR pPostData;
HRESULT hr = SafeArrayAccessData(psa, (void**)&pPostData);
memcpy(pPostData, szPostData, nPostLen);
hr = SafeArrayUnaccessData(psa);

V_VT(&vtPost) = VT_ARRAY|VT_UI1;
V_ARRAY(&vtPost) = psa;

IWebBrowser2 *pWeb;
CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
IID_IWebBrowser2, (void**)&pWeb);
pWeb->Navigate(bstrUrl, &vtEmpty, &vtEmpty, &vtPost, &vtHeader);
pWeb->Release();

SafeArrayDestroy(psa);
SysFreeString(vtHeader.bstrVal);
SysFreeString(bstrUrl);

ÀÌ»óÀÔ´Ï´Ù.

3.2 IWebBrowser2¸¦ ÀÌ¿ëÇؼ­ ºê¶ó¿ìÀú¸¦ ¶ç¿ï ¶§, ºê¶ó¿ìÀú¸¦ ´Ù¸£°Ô Çغ¸ÀÚ #

¿ø¹® ; http://intel.tistory.com/2460582

#include <Exdisp.h>
¿ì¼± IWebBrowser2¸¦ ¼±¾ð. ±× ¿Ü º¯¼öµé ¼±¾ð

IWebBrowser2* pWebBrowser = NULL;
BSTR bstrURL = NULL;
BSTR bstrHeader = NULL;
VARIANT vtPostData = {0};
VARIANT vtEmpty;
VARIANT vtHeader;

bstrURLÇÏ°í, bstrHeader´Â ÇÊ¿äÇÑ °ªÀ¸·Î ä¿ì°í...(Navigate ÇÒ ¶§ ÇÊ¿ä)

±× ´ÙÀ½ »ý¼º.

hr = ::CoCreateInstance( __uuidof(InternetExplorer), NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
__uuidof(IWebBrowser2), reinterpret_cast<LPVOID *>(&pWebBrowser) );

¶ç¿ï À¥ ºê¶ó¿ìÀúÀÇ Å©±â¸¦ ¼³Á¤

pWebBrowser->put_Left(200);
pWebBrowser->put_Top(300);
pWebBrowser->put_Width(578);
pWebBrowser->put_Height(298);

´Ù¸¥ °ªµéµµ ¼³Á¤ ȤÀº µðÆúÆ®·Î ³õ°í »ç¿ë.

VariantInit( &vtEmpty );
VariantInit( &vtPostData );
VariantInit( &vtHeader );

V_VT( &vtHeader ) = VT_BSTR;
V_BSTR( &vtHeader ) = bstrHeader;

±× ´ÙÀ½ ºê¶ó¿ìÀú¿¡¼­ ÇÊ¿ä¾ø´Â °Íµé »èÁ¦.

pWebBrowser->put_ToolBar(VARIANT_FALSE); // ÀͽºÇ÷ξî Åø¹Ù ¾ø¾Ú
pWebBrowser->put_MenuBar(VARIANT_FALSE); // ¸Þ´º¹Ù ¾ø¾Ú
pWebBrowser->put_AddressBar(VARIANT_FALSE); // ÁÖ¼Òâ ¾ø¾Ú
pWebBrowser->put_StatusBar(VARIANT_FALSE); // »óŹ٠¾ø¾Ú
pWebBrowser->put_Resizable(VARIANT_FALSE); //¸®»çÀÌÁî ºÒ°¡

pWebBrowser->put_Visible ( (VARIANT_BOOL) TRUE );

ÀÌ·¸°Ô ÇÏ°í Navigate

hr = pWebBrowser->Navigate( bstrURL, &vtEmpty, &vtEmpty, &vtPostData, &vtHeader );

À§ ó·³ Çϸé Åø¹Ùµµ ¾ø°í, ¸Þ´º¹Ùµµ ¾ø°í, ÁÖ¼Òâµµ ¾ø°í, »óŹٵµ ¾ø°í, ¸®»çÀÌÁîµµ ¾ÊµÇ´Â ºê¶ó¿ìÀú°¡ ¶á´Ù.

¸¶Áö¸·À¸·Î...

HWND hIE;
hr=pWebBrowser->get_HWND((long *)&hIE);
::SetWindowPos(hIE, HWND_TOPMOST, 0, 0,0 ,0 , SWP_NOMOVE | SWP_NOSIZE);

À§ ÄÚµå´Â ¹æ±Ý Àü¿¡ ¶ç¿î ºê¶ó¿ìÀú¸¦ ÃÖ»ó´Ü¿¡ ¶ç¿ì°Ô ÇÏ´Â ÄÚµåÀÌ´Ù.

3.3 POST ¹æ½ÄÀ¸·Î À¥ÆäÀÌÁö¸¦ Àоî¿À±â #

Ãâó ; http://intel.tistory.com/2460623

int WINAPI PostPageUseIE( IN LPCTSTR pszURL, IN LPBYTE pbPostData, IN LPCTSTR pszRes )
{
int result;
IWebBrowser2* pWebbrowser = NULL;
COleVariant vtURL;
COleVariant vtEmpty;
IDispatch* pDispatch = NULL;
IHTMLDocument2* pHtmlDocument2 = NULL;
int i;
IHTMLElement* pHtmlElement = NULL;
BSTR bstrText;
CString sText;
READYSTATE rs;
VARIANT vtPostData;
SAFEARRAY* psa = NULL;
LPBYTE pbValue = NULL;
COleVariant vtHeader( _T( "Content-Type: application/x-www-form-urlencoded" ) );
CString strRes = pszRes/*_T("Status=Success")*/;
CString sURL = pszURL;

//
// IE °´Ã¼ »ý¼º
//
result = CoCreateInstance( CLSID_InternetExplorer,
NULL,
CLSCTX_LOCAL_SERVER,
IID_IWebBrowser2,
(LPVOID*)&pWebbrowser );
if( FAILED( result ) )
{
result = ERRORMSG( result, _T( "Can not create Webbrowser control" ) );
STACKTRACE( _T( "CoCreateInstance()" ) );
goto finish;
}

//
// È£ÃâµÇ´Â ºê¶ó¿ìÀú È­¸éÀ» º¼·Á¸é TRUE ·Î ¼³Á¤
//
pWebbrowser->put_Visible( FALSE );

//
// ¹ÙÀ̳ʸ® POST DATA ¸¦ Àü´ÞÇϱâ À§Çؼ­ SAFEARRAY¸¦ »ý¼ºÇÑ´Ù
//
psa = SafeArrayCreateVector( VT_UI1, 0, strlen( (LPSTR)pbPostData ) );
if( psa == NULL )
{
result = ERRORMSG( ERROR_NOT_ENOUGH_MEMORY, NULL );
DEBUGINFO( _T( "mem size = %d" ), strlen( (LPSTR)pbPostData ) );
STACKTRACE( _T( "SafeArrayCreateVector()" ) );
goto finish;
}

SafeArrayAccessData( psa, (LPVOID*)&pbValue );
CopyMemory( pbValue, pbPostData, strlen( (LPSTR)pbPostData ) );
SafeArrayUnaccessData( psa );

vtPostData.vt = VT_ARRAY;
vtPostData.parray = psa;

//
// URL ¼³Á¤
//
vtURL = sURL;

//
// NULL °ª ¼³Á¤
//
vtEmpty.Clear();

//
// HTTP ¿äû
//
result = pWebbrowser->Navigate2( vtURL, vtEmpty, vtEmpty, &vtPostData, vtHeader );
if( FAILED( result ) )
{
result = ERRORMSG( result, _T( "Can not navigate license issue url" ) );
STACKTRACE( _T( "IWebBrowser2::Navigate2()" ) );
goto finish;
}

//
// 10Ãʵ¿¾È ºê¶ó¿ìÀú°¡ ¸ðµç ÀÏÀ» ÇÒ ¶§±îÁö ´ë±â
//
rs = READYSTATE_UNINITIALIZED;
for( i = 0; i < 100; i++ )
{
pWebbrowser->get_ReadyState( &rs );
if( rs == READYSTATE_COMPLETE )
{
break;
}

Sleep( 100 );
}

if( rs != READYSTATE_COMPLETE )
{
//
// ¹®¼­¸¦ ´Ù ¹ÞÁö ¸øÇÔ.
//
result = ERRORMSG( ERROR_CAN_NOT_COMPLETE, _T( "Can not download license issuer url" ) );
goto finish;
}

//
// ¼º°øÇß´ÂÁö ½ÇÆÐÇß´ÂÁö ¾Ë±â À§Çؼ­ HTML ³»¿ëÀ» ºÁ¾ß ÇÑ´Ù
//
result = pWebbrowser->get_Document( &pDispatch );
if( FAILED( result ) )
{
result = ERRORMSG( result, _T( "Can not get document of IWebbrowser2" ) );
STACKTRACE( _T( "IWebbrowser2::get_Document()" ) );
goto finish;
}

result = pDispatch->QueryInterface( IID_IHTMLDocument2, (void**)&pHtmlDocument2 );
if( result != 0 )
{
result = ERRORMSG( result, _T( "Can not query IHtmlDocument2 interface from IDispatch" ) );
STACKTRACE( _T( "IDispatch::QueryInterface()" ) );
goto finish;
}

result = pHtmlDocument2->get_body( &pHtmlElement );
if( result != 0 )
{
result = ERRORMSG( result, _T( "Can not get body html" ) );
STACKTRACE( _T( "IHTMLDocument2::get_body()" ) );
goto finish;
}

result = pHtmlElement->get_innerText( &bstrText );
if( result != 0 )
{
result = ERRORMSG( result, _T( "Can not get inner text of html" ) );
STACKTRACE( _T( "IHTMLElement::get_innerText()" ) );
goto finish;
}

sText = bstrText;

//
// HTML ¹®¼­ ³»¿ë Áß¿¡¼­ ¼º°ø ¸Þ¼¼Áö°¡ ÀÖ´ÂÁö È®ÀÎ
//
if( sText.Find( strRes ) < 0 )
{
result = ERRORMSG( ERROR_INTERNAL_ERROR, _T( "invalid response." ) );
DEBUGINFO( sText );
goto finish;
}

result = 0;

finish:
if( result != 0 )
{
STACKTRACE( _T( "PostPageUseIE()" ) );
}

if( psa != NULL )
{
SafeArrayDestroy( psa );
}

if( pWebbrowser != NULL )
pWebbrowser->Quit();

SAFE_RELEASE( pHtmlElement );
SAFE_RELEASE( pHtmlDocument2 );
SAFE_RELEASE( pDispatch );
SAFE_RELEASE( pWebbrowser );

return result;
}

ÀÌ ÇÔ¼öÀÇ ÀåÁ¡Àº IE ControlÀ» ±×´ë·Î »ç¿ëÇϱ⠶§¹®¿¡, ÁÖ¼Ò°¡ http, https ±¸ºÐÀ» ÇÏÁö ¾Ê°í, Àß µ¿ÀÛÇÑ´Ù. ÇÏÁö¸¸ »ç¿ë½Ã âÀÇ Æ÷Ä¿½º°¡ ±ôºýÀδٴ ´ÜÁ¡µµ ÀÖ±ä ÇÔ.

3.4 POST ¹æ½ÄÀ¸·Î À¥ÆäÀÌÁö È£ÃâÇؼ­ °á°ú°ª ¾ò¾î¿À±â #

Ãâó ; http://intel.tistory.com/2460623

LPBYTE PostWebPage( LPCTSTR pszURL , LPBYTE pbPostData )
{
int result;
DWORD dwLength;
int nContentLength;
BYTE baBuffer[ 64 ];
DWORD dwServiceType;
INTERNET_PORT nPort;
HINTERNET hInternet = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;
CString sServer, sObject;
CString strHeaders = _T( "Content-Type: application/x-www-form-urlencoded" );
LPBYTE pbContent = NULL;
CString sLicenseXML;
LPSTR pszFirst = NULL, pszLast = NULL;
CString sLog ;
DWORD dwFlags = 0 ;
CString ss;
//
// URL È£Ãâ
//
hInternet = InternetOpen( _T( "Mozilla" ), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
if( hInternet == NULL )
{
result = GetLastError();
goto finish;
}
result = AfxParseURL( pszURL, dwServiceType, sServer, sObject, nPort );
if( result == FALSE )
{
result = GetLastError();
goto finish;
}


hConnect = InternetConnect( hInternet, sServer, nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL );
if( hConnect == NULL )
{
result = GetLastError();
goto finish;
}

//
// ¹Ýµå½Ã Æ÷½ºÆ® ¹æ½ÄÀ¸·Î
//
hRequest = HttpOpenRequest( hConnect, _T( "POST" ), sObject, NULL, NULL, NULL,INTERNET_FLAG_NO_CACHE_WRITE , NULL );
if( hRequest == NULL )
{
result = GetLastError();
goto finish;
}

//
// À¥¼­¹ö¿¡ µ¥ÀÌŸ¸¦ Àü¼Û
//
result = HttpSendRequest( hRequest, strHeaders, strHeaders.GetLength(), (LPVOID)pbPostData, strlen( (LPSTR)pbPostData ) );
if( result == FALSE )
{
result = GetLastError();

goto finish;
}

//
// HTTP STATUS ÄÚµå
//
dwLength = sizeof( baBuffer );
result = HttpQueryInfo( hRequest, HTTP_QUERY_STATUS_CODE, (LPVOID)baBuffer, &dwLength, NULL );
if( result == FALSE )
{
result = GetLastError();
goto finish;
}

if( strcmp( (LPCSTR)baBuffer, "200" ) != 0 )
{
//
// HTTP Request °¡ ½ÇÆÐÇß´Ù. ¿Ö???
//
//CString s = (LPCSTR)baBuffer;
result = ERROR_HTTP_INVALID_QUERY_REQUEST;
goto finish;
}

dwLength = sizeof( baBuffer );
result = HttpQueryInfo( hRequest, HTTP_QUERY_CONTENT_LENGTH , (LPVOID)baBuffer, &dwLength, NULL );
if( result == FALSE )
{
result = GetLastError();
goto finish;
}

nContentLength = atoi( (LPSTR)baBuffer );
pbContent = new BYTE[ nContentLength + 1 ];
if( pbContent == NULL )
{
result = ERROR_NOT_ENOUGH_MEMORY;
goto finish;
}

result = InternetReadFile( hRequest, pbContent, nContentLength, &dwLength );
if( result == FALSE )
{
result = GetLastError();
goto finish;
}

pbContent[ nContentLength ] = '\0';
result = 0;
finish:
if( hInternet != NULL )
InternetCloseHandle( hInternet );
if( hConnect != NULL )
InternetCloseHandle( hConnect );
if( hRequest != NULL )
InternetCloseHandle( hRequest );

return pbContent;
}


»ç¿ë¹æ¹ýÀº ¾Æ·¡¿Í °°ÀÌ...

LPBTYEpbPostData = new BYTE[ 512 ];
CString strRes;
memset( pbPostData, 0, sizeof( BYTE ) * 512 );
sprintf( (char*)pbPostData, "id=%s&pw=%s", loginDlg.GetID(), strPass64 );

strRes = PostWebPage( À¥ÁÖ¼Ò, pbPostData );

strRes¿¡ Post¹æ½ÄÀ¸·Î ³¯¸° À¥ÆäÀÌÁöÀÇ ÀÀ´ä°ªÀÌ µé¾î¿Â´Ù. LPBYTEÇüÀ» ¸®ÅÏÇÏÁö¸¸, ÀÚµ¿Çüº¯È¯ µÇ¾î µé¾î°£´Ù.


3.5 ÆÄÀÏ ¹ÞÀ» ¶§ Æú´õ ¼±ÅÃÇϴ â #

Ãâó ; http://intel.tistory.com/2460623
long SelectDownloadFolder()
{
// TODO: Add your dispatch handler code here
int result;
TCHAR szDir[ 4096 ];
BROWSEINFO bi;
LPITEMIDLIST pidl = NULL;

ZeroMemory( &bi, sizeof( BROWSEINFO ) );
bi.hwndOwner = this->GetSafeHwnd();
bi.lpfn = NULL;
bi.lParam = 0;
bi.lpszTitle = _T( "Choose download folder" );
bi.ulFlags = BIF_NEWDIALOGSTYLE;
pidl = SHBrowseForFolder( &bi );
if( pidl != NULL )
{
//
// »ç¿ëÀÚ°¡ µð·ºÅ丮¸¦ ¼±ÅÃÇß´Ù
//
result = SHGetPathFromIDList( pidl, szDir ); //szDir¿¡ ÀúÀåµÈ Æú´õ°¡ µé¾î°¨.
}

3.6 Programming the MSHTML Web Browser Control with C++ #

http://www.adp-gmbh.ch/win/misc/mshtml/index.html

It is possible to render HTML in an ordinary Windows program with MSHTML. This makes it possible to have a web look and feel in a program. Because I think this is quite interesting, I decided to write some C++ classes that make it possible to use MSHTML in an easy way. I found some ideas on how to do that with
Embed an HTML Control in your own window using plain C .

Test program

This test programm displays a simple HTML document in a window. The HTML document consists of three links. These links are fully operational.
MSHTMLTest.cpp
#include <windows.h>
#include "HTMLWindow.h"

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE /*unused__*/, LPSTR /*lpszCmdLine*/, int /*nCmdShow*/) {

  HTMLWindow* html_window = new HTMLWindow (

      // Parameter html_or_url:
      "<html><head>"
      "<title>MSHTMLTest</title>"   // seems a little useless in this context
      "</head><body>"
      "<h1>This is a test</h1>"
      "I offer the following links:"
      "<ul>"
      "<li><a href='http://www.google.com'>www.google.com</a>"
      "<li><a href='http://www.adp-gmbh.ch'>www.adp-gmbh.ch</a>"
      "<li><a href='http://www.yahoo.com'>www.yahoo.com</a>"
      "</ul>"
      "</body></html>",
      // Parameter title 
       "MSHTMLTest", 
       hInstance,
      false  // indicates: this not an url, but html 
       );

  MSG msg;
  while (GetMessage(&msg, 0, 0, 0)) {
    TranslateMessage(&msg);
    if (msg.message >= WM_KEYFIRST && 
        msg.message <= WM_KEYLAST) {
      ::SendMessage(html_window->hwnd_, msg.message, msg.wParam, msg.lParam);
    }
    DispatchMessage(&msg);
  }

  return 0;
}
Displaying an HTML document

The following program displayes an URL. So, it can be called like:
DisplayHTML.exe www.your-favorite-url.zzz
If the URL happens to be an HTML file on the harddisk, call it like so:
DisplayHTML.exe file://c:/path/to/your/document.html
DisplayHTML.cpp
#include <windows.h>
#include "HTMLWindow.h"

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) {

  if (__argc < 2) {
    ::MessageBox(0, "DisplayHTML.exe html-document", "Specify HTML document to be displayed", 0);
    return -1;
  }

  HTMLWindow* html_window = new HTMLWindow (
    __argv[1],
       "DisplayHTML", 
       hInstance,
       true  // it is an url 
     );

  MSG msg;
  while (GetMessage(&msg, 0, 0, 0)) {
    TranslateMessage(&msg);
    if (msg.message >= WM_KEYFIRST && 
        msg.message <= WM_KEYLAST) {
      ::SendMessage(html_window->hwnd_, msg.message, msg.wParam, msg.lParam);
    }
    DispatchMessage(&msg);
  }

  return 0;
}

Downloading MSHTMLTest
The sources (including makefile) as well as the exes can be downloaded here: MSHTMLTest.
I compiled it with the mingw compiler.




November, 2024
 12
3456789
10111213141516
17181920212223
24252627282930

ÇÒ ¼ö ÀÖ´Ù°í ¹Ï´Â »ç¶÷ÀÌ ¼º°øÇÑ´Ù(¿ùÅÍ D.À©Æ²)

¹Ù¶÷_gems_Localizing
RecentChanges
¸µÅ©
edu2014_Storytelling
last modified 2010-08-24 15:31:22
°íÄ¡±â|ã±â|ÂÊ Áö¿ì±â|ºñ½ÁÇÑ ÂÊ Valid XHTML 1.0! Valid CSS! powerd by MoniWiki
0.2324 sec