mlang: Added IMultiLanguage3 interface stub implementation.
diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c
index 835a7b3..3ac88d1 100644
--- a/dlls/mlang/mlang.c
+++ b/dlls/mlang/mlang.c
@@ -822,7 +822,7 @@
 {
     const IMLangFontLinkVtbl *vtbl_IMLangFontLink;
     const IMultiLanguageVtbl *vtbl_IMultiLanguage;
-    const IMultiLanguage2Vtbl *vtbl_IMultiLanguage2;
+    const IMultiLanguage3Vtbl *vtbl_IMultiLanguage3;
     LONG ref;
     DWORD total_cp, total_scripts;
 } MLang_impl;
@@ -875,11 +875,19 @@
     if (IsEqualGUID(riid, &IID_IMultiLanguage2) )
     {
 	MLang_AddRef(This);
-	*ppvObject = &(This->vtbl_IMultiLanguage2);
+	*ppvObject = &(This->vtbl_IMultiLanguage3);
         TRACE("Returning IID_IMultiLanguage2 %p ref = %ld\n", This, This->ref);
 	return S_OK;
     }
 
+    if (IsEqualGUID(riid, &IID_IMultiLanguage3) )
+    {
+	MLang_AddRef(This);
+	*ppvObject = &(This->vtbl_IMultiLanguage3);
+        TRACE("Returning IID_IMultiLanguage3 %p ref = %ld\n", This, This->ref);
+	return S_OK;
+    }
+
     WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
     return E_NOINTERFACE;
 }
@@ -1828,31 +1836,31 @@
 /******************************************************************************/
 
 static HRESULT WINAPI fnIMultiLanguage2_QueryInterface(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     REFIID riid,
     void** ppvObject)
 {
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     return MLang_QueryInterface( This, riid, ppvObject );
 }
 
-static ULONG WINAPI fnIMultiLanguage2_AddRef( IMultiLanguage2* iface )
+static ULONG WINAPI fnIMultiLanguage2_AddRef( IMultiLanguage3* iface )
 {
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     return MLang_AddRef( This );
 }
 
-static ULONG WINAPI fnIMultiLanguage2_Release( IMultiLanguage2* iface )
+static ULONG WINAPI fnIMultiLanguage2_Release( IMultiLanguage3* iface )
 {
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     return MLang_Release( This );
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetNumberOfCodePageInfo(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     UINT* pcCodePage)
 {
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     TRACE("%p, %p\n", This, pcCodePage);
 
     if (!pcCodePage) return S_FALSE;
@@ -1900,14 +1908,14 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetCodePageInfo(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     UINT uiCodePage,
     LANGID LangId,
     PMIMECPINFO pCodePageInfo)
 {
     UINT i, n;
 
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     TRACE("%p, %u, %04x, %p\n", This, uiCodePage, LangId, pCodePageInfo);
 
     for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
@@ -1926,7 +1934,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetFamilyCodePage(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     UINT uiCodePage,
     UINT* puiFamilyCodePage)
 {
@@ -1934,25 +1942,25 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_EnumCodePages(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD grfFlags,
     LANGID LangId,
     IEnumCodePage** ppEnumCodePage)
 {
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     TRACE("%p %08lx %04x %p\n", This, grfFlags, LangId, ppEnumCodePage);
 
     return EnumCodePage_create( This, grfFlags, LangId, ppEnumCodePage );
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetCharsetInfo(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     BSTR Charset,
     PMIMECSETINFO pCharsetInfo)
 {
     UINT i, n;
 
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     TRACE("%p %s %p\n", This, debugstr_w(Charset), pCharsetInfo);
 
     if (!pCharsetInfo) return E_FAIL;
@@ -2000,7 +2008,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_IsConvertible(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD dwSrcEncoding,
     DWORD dwDstEncoding)
 {
@@ -2008,7 +2016,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_ConvertString(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD* pdwMode,
     DWORD dwSrcEncoding,
     DWORD dwDstEncoding,
@@ -2022,7 +2030,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringToUnicode(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD* pdwMode,
     DWORD dwEncoding,
     CHAR* pSrcStr,
@@ -2035,7 +2043,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringFromUnicode(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD* pdwMode,
     DWORD dwEncoding,
     WCHAR* pSrcStr,
@@ -2048,14 +2056,14 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringReset(
-    IMultiLanguage2* iface)
+    IMultiLanguage3* iface)
 {
     FIXME("\n");
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766FromLcid(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     LCID Locale,
     BSTR* pbstrRfc1766)
 {
@@ -2064,7 +2072,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetLcidFromRfc1766(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     LCID* pLocale,
     BSTR bstrRfc1766)
 {
@@ -2073,7 +2081,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_EnumRfc1766(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     LANGID LangId,
     IEnumRfc1766** ppEnumRfc1766)
 {
@@ -2084,7 +2092,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766Info(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     LCID Locale,
     LANGID LangId,
     PRFC1766INFO pRfc1766Info)
@@ -2094,7 +2102,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_CreateConvertCharset(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     UINT uiSrcCodePage,
     UINT uiDstCodePage,
     DWORD dwProperty,
@@ -2105,7 +2113,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringInIStream(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD* pdwMode,
     DWORD dwFlag,
     WCHAR* lpFallBack,
@@ -2122,7 +2130,7 @@
  * TODO: handle dwFlag and lpFallBack
 */
 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringToUnicodeEx(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD* pdwMode,
     DWORD dwEncoding,
     CHAR* pSrcStr,
@@ -2156,7 +2164,7 @@
  * TODO: handle dwFlag and lpFallBack
 */
 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringFromUnicodeEx(
-    IMultiLanguage2* This,
+    IMultiLanguage3* This,
     DWORD* pdwMode,
     DWORD dwEncoding,
     WCHAR* pSrcStr,
@@ -2172,7 +2180,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_DetectCodepageInIStream(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD dwFlag,
     DWORD dwPrefWinCodePage,
     IStream* pstmIn,
@@ -2184,7 +2192,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_DetectInputCodepage(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD dwFlag,
     DWORD dwPrefWinCodePage,
     CHAR* pSrcStr,
@@ -2197,7 +2205,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_ValidateCodePage(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     UINT uiCodePage,
     HWND hwnd)
 {
@@ -2206,7 +2214,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetCodePageDescription(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     UINT uiCodePage,
     LCID lcid,
     LPWSTR lpWideCharStr,
@@ -2217,7 +2225,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_IsCodePageInstallable(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     UINT uiCodePage)
 {
     FIXME("%u\n", uiCodePage);
@@ -2225,7 +2233,7 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_SetMimeDBSource(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     MIMECONTF dwSource)
 {
     FIXME("0x%08x\n", dwSource);
@@ -2233,10 +2241,10 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetNumberOfScripts(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     UINT* pnScripts)
 {
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     TRACE("%p %p\n", This, pnScripts);
 
     if (!pnScripts) return S_FALSE;
@@ -2246,30 +2254,65 @@
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_EnumScripts(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     DWORD dwFlags,
     LANGID LangId,
     IEnumScript** ppEnumScript)
 {
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     TRACE("%p %08lx %04x %p\n", This, dwFlags, LangId, ppEnumScript);
 
     return EnumScript_create( This, dwFlags, LangId, ppEnumScript );
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_ValidateCodePageEx(
-    IMultiLanguage2* iface,
+    IMultiLanguage3* iface,
     UINT uiCodePage,
     HWND hwnd,
     DWORD dwfIODControl)
 {
-    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
     FIXME("%p %u %p %08lx: stub!\n", This, uiCodePage, hwnd, dwfIODControl);
 
     return S_FALSE;
 }
 
-static const IMultiLanguage2Vtbl IMultiLanguage2_vtbl =
+static HRESULT WINAPI fnIMultiLanguage3_DetectOutboundCodePage(
+    IMultiLanguage3 *iface,
+    DWORD dwFlags,
+    LPCWSTR lpWideCharStr,
+    UINT cchWideChar,
+    UINT *puiPreferredCodePages,
+    UINT nPreferredCodePages,
+    UINT *puiDetectedCodePages,
+    UINT *pnDetectedCodePages,
+    WCHAR *lpSpecialChar)
+{
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
+    FIXME("(%p)->(%08lx %s %u %p %u %p %p %p)\n", This, dwFlags, debugstr_w(lpWideCharStr),
+          cchWideChar, puiPreferredCodePages, nPreferredCodePages, puiDetectedCodePages,
+          pnDetectedCodePages, lpSpecialChar);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fnIMultiLanguage3_DetectOutboundCodePageInIStream(
+    IMultiLanguage3 *iface,
+    DWORD dwFlags,
+    IStream *pStrIn,
+    UINT *puiPreferredCodePages,
+    UINT nPreferredCodePages,
+    UINT *puiDetectedCodePages,
+    UINT *pnDetectedCodePages,
+    WCHAR *lpSpecialChar)
+{
+    ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface);
+    FIXME("(%p)->(%08lx %p %p %u %p %p %p)\n", This, dwFlags, pStrIn,
+          puiPreferredCodePages, nPreferredCodePages, puiDetectedCodePages,
+          pnDetectedCodePages, lpSpecialChar);
+    return E_NOTIMPL;
+}
+
+static const IMultiLanguage3Vtbl IMultiLanguage3_vtbl =
 {
     fnIMultiLanguage2_QueryInterface,
     fnIMultiLanguage2_AddRef,
@@ -2301,6 +2344,8 @@
     fnIMultiLanguage2_GetNumberOfScripts,
     fnIMultiLanguage2_EnumScripts,
     fnIMultiLanguage2_ValidateCodePageEx,
+    fnIMultiLanguage3_DetectOutboundCodePage,
+    fnIMultiLanguage3_DetectOutboundCodePageInIStream
 };
 
 static HRESULT MultiLanguage_create(IUnknown *pUnkOuter, LPVOID *ppObj)
@@ -2316,7 +2361,7 @@
     mlang = HeapAlloc( GetProcessHeap(), 0, sizeof (MLang_impl) );
     mlang->vtbl_IMLangFontLink = &IMLangFontLink_vtbl;
     mlang->vtbl_IMultiLanguage = &IMultiLanguage_vtbl;
-    mlang->vtbl_IMultiLanguage2 = &IMultiLanguage2_vtbl;
+    mlang->vtbl_IMultiLanguage3 = &IMultiLanguage3_vtbl;
 
     mlang->total_cp = 0;
     for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)