"Julius Schwartzenberg" <[email protected]> wrote:

static const WCHAR editW[] = {'E','d','i','t',0};
+#ifdef _WIN64
+#define EDIT_EXTRA_VALUE sizeof(EDITSTATE *)
+#else
+#define EDIT_EXTRA_VALUE 6 /* This has to be 6 for 32-bit, otherwise 
Civilization II crashes, bug #2181  */
+#endif
const struct builtin_class_descr EDIT_builtin_class =
{
    editW,                /* name */
    CS_DBLCLKS | CS_PARENTDC,   /* style */
    EditWndProcA,         /* procA */
    EditWndProcW,         /* procW */
-    sizeof(EDITSTATE *),  /* extra */
+    EDIT_EXTRA_VALUE,     /* extra */
    IDC_IBEAM,            /* cursor */
    0                     /* brush */
};
+#undef EDIT_EXTRA_VALUE

It would be cleaner IMHO to have it the following way:

#ifdef _WIN64
#define EDIT_EXTRA_VALUE 0
#else
#define EDIT_EXTRA_VALUE 2
#endif

const struct builtin_class_descr EDIT_builtin_class =
{
   editW,                /* name */
   CS_DBLCLKS | CS_PARENTDC,   /* style */
   EditWndProcA,         /* procA */
   EditWndProcW,         /* procW */
   sizeof(EDITSTATE *) + EDIT_EXTRA_VALUE,  /* extra */
...

and completely omit the comment about the bug #, but explain that there are
applications (Civilization II is one of them) that depend on having 2 extra
bytes in the extra class storage.

+static void test_extra_value()
+{
+todo_wine {
+    WNDCLASSEX cls;
+    GetClassInfoEx(NULL,"Edit",&cls);
+    #ifdef _WIN64
+    ok(cls.cbWndExtra == 8, "expected 6, got %d\n", cls.cbWndExtra);
+    #else
+    ok(cls.cbWndExtra == 6, "expected 6, got %d\n", cls.cbWndExtra);
+    #endif
+}
+}

You should check the return value of GetClassInfoEx() and put todo_wine
only around the failing ok() call (otherwise it will fail under 64-bit).

--
Dmitry.


Reply via email to