// icwtutor.cpp : Defines the entry point for the application. // #include #include #include #include #define STR_BSTR 0 #define STR_OLESTR 1 #define ARRAYSIZE(a) (sizeof(a)/sizeof((a)[0])) #define A2B(x) (BSTR)A2W((LPSTR)(x), STR_BSTR) LPWSTR A2W (LPSTR psz, BYTE bType); BSTR GetHtmFileFromCommandLine (HINSTANCE hInst, LPSTR lpCmdLine); BOOL bFileFromCmdLine = FALSE; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HINSTANCE hinstMSHTML = NULL; #ifdef UNICODE // Initialize the C runtime locale to the system locale. setlocale(LC_ALL, ""); #endif hinstMSHTML = LoadLibrary(TEXT("MSHTML.DLL")); if(hinstMSHTML) { SHOWHTMLDIALOGFN *pfnShowHTMLDialog = NULL; pfnShowHTMLDialog = (SHOWHTMLDIALOGFN*)GetProcAddress(hinstMSHTML, "ShowHTMLDialog"); if(pfnShowHTMLDialog) { IMoniker *pmk = NULL; BSTR bstrHtmFilePath = NULL; bstrHtmFilePath = GetHtmFileFromCommandLine(hInstance, lpCmdLine); CreateURLMoniker(NULL, bstrHtmFilePath, &pmk); SysFreeString(bstrHtmFilePath); if(pmk) { if(bFileFromCmdLine) (*pfnShowHTMLDialog)(NULL, pmk, NULL, A2B("help: no"), NULL); else (*pfnShowHTMLDialog)(NULL, pmk, NULL, A2B("dialogWidth: 36.5em; dialogHeight: 25.5em; help: no"), NULL); pmk->Release(); } } FreeLibrary(hinstMSHTML); } return 0; } BSTR GetHtmFileFromCommandLine(HINSTANCE hInst, LPSTR lpCmdLine) { CHAR szTemp [MAX_PATH*2] = "\0"; if (*lpCmdLine == '\"') { lstrcpynA(szTemp, lpCmdLine + 1, lstrlenA(lpCmdLine) - 1); } else { lstrcpyA(szTemp, lpCmdLine); } if (GetFileAttributesA(szTemp) != 0xFFFFFFFF) { bFileFromCmdLine = TRUE; return A2B(szTemp); } lstrcpyA(szTemp, "res://"); GetModuleFileNameA(hInst, szTemp + lstrlenA(szTemp), ARRAYSIZE(szTemp) - lstrlenA(szTemp)); lstrcatA(szTemp, "/Default.htm"); return A2B(szTemp); } LPWSTR A2W(LPSTR psz, BYTE bType) { int i; LPWSTR pwsz; if (!psz) return(NULL); // compute the length of the required BSTR if ((i = MultiByteToWideChar(CP_ACP, 0, psz, -1, NULL, 0)) <= 0) return NULL; switch (bType) { case STR_BSTR: // SysAllocStringLen adds 1 pwsz = (LPWSTR)SysAllocStringLen(NULL, (i - 1)); break; case STR_OLESTR: pwsz = (LPWSTR)CoTaskMemAlloc(i * sizeof(WCHAR)); break; default: return(NULL); } if (!pwsz) return(NULL); MultiByteToWideChar(CP_ACP, 0, psz, -1, pwsz, i); pwsz[i - 1] = 0; return(pwsz); }