From 452c42b4855e2f6338fa9b8746377ff9fe9ee706 Mon Sep 17 00:00:00 2001
From: Qian Hong <qhong@codeweavers.com>
Date: Wed, 23 Apr 2014 04:16:53 +0800
Subject: [PATCH] atl: Implement AtlAxDialogBox[A,W]

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=32749
---
 dlls/atl/atl_ax.c | 60 +++++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 50 insertions(+), 10 deletions(-)

diff --git a/dlls/atl/atl_ax.c b/dlls/atl/atl_ax.c
index 8121278..92fcb84 100644
--- a/dlls/atl/atl_ax.c
+++ b/dlls/atl/atl_ax.c
@@ -28,6 +28,7 @@
 #include "winerror.h"
 #include "winuser.h"
 #include "wine/debug.h"
+#include "wine/heap.h"
 #include "objbase.h"
 #include "objidl.h"
 #include "ole2.h"
@@ -1407,25 +1408,64 @@ HRESULT WINAPI AtlAxGetControl(HWND hWnd, IUnknown **pUnk)
 }
 
 /***********************************************************************
- *           AtlAxDialogBoxW              [atl100.35]
+ *           AtlAxDialogBoxA              [atl100.@]
  *
  */
-INT_PTR WINAPI AtlAxDialogBoxW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc,
-        LPARAM dwInitParam)
+INT_PTR WINAPI AtlAxDialogBoxA(HINSTANCE hInst, LPCSTR name, HWND owner, DLGPROC dlgProc, LPARAM param)
 {
-    FIXME("(%p %s %p %p %lx)\n", hInstance, debugstr_w(lpTemplateName), hWndParent, lpDialogProc, dwInitParam);
-    return 0;
+    INT_PTR res = 0;
+    int length;
+    WCHAR *nameW;
+
+    if (IS_INTRESOURCE(name))
+        return AtlAxDialogBoxW( hInst, (LPCWSTR) name, owner, dlgProc, param );
+
+    length = MultiByteToWideChar( CP_ACP, 0, name, -1, NULL, 0 );
+    nameW = heap_alloc( length * sizeof(WCHAR) );
+    if (nameW)
+    {
+        MultiByteToWideChar( CP_ACP, 0, name, -1, nameW, length );
+        res = AtlAxDialogBoxW( hInst, nameW, owner, dlgProc, param );
+        heap_free( nameW );
+    }
+    return res;
 }
 
 /***********************************************************************
- *           AtlAxDialogBoxA              [atl100.36]
+ *           AtlAxDialogBoxW              [atl100.@]
  *
  */
-INT_PTR WINAPI AtlAxDialogBoxA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc,
-        LPARAM dwInitParam)
+INT_PTR WINAPI AtlAxDialogBoxW(HINSTANCE hInst, LPCWSTR name, HWND owner, DLGPROC dlgProc, LPARAM param)
 {
-    FIXME("(%p %s %p %p %lx)\n", hInstance, debugstr_a(lpTemplateName), hWndParent, lpDialogProc, dwInitParam);
-    return 0;
+    HRSRC hrsrc;
+    HGLOBAL hgl;
+    LPCDLGTEMPLATEW ptr;
+    LPDLGTEMPLATEW newptr;
+    INT_PTR res;
+
+    TRACE("(%p %s %p %p %lx)\n", hInst, debugstr_w(name), owner, dlgProc, param);
+
+    hrsrc = FindResourceW( hInst, name, (LPWSTR)RT_DIALOG );
+    if ( !hrsrc )
+        return 0;
+    hgl = LoadResource (hInst, hrsrc);
+    if ( !hgl )
+        return 0;
+    ptr = LockResource ( hgl );
+    if (!ptr)
+    {
+        FreeResource( hgl );
+        return 0;
+    }
+    newptr = AX_ConvertDialogTemplate( ptr );
+    if ( newptr )
+    {
+        res = DialogBoxIndirectParamW( hInst, newptr, owner, dlgProc, param );
+        heap_free( newptr );
+    } else
+        res = 0;
+    FreeResource ( hrsrc );
+    return res;
 }
 
 /***********************************************************************
-- 
1.9.1

