2 * Helper routines for some of the common methods that people P/Invoke
3 * on their applications.
6 * Gonzalo Paniagua (gonzalo@ximian.com)
7 * Miguel de Icaza (miguel@novell.com)
9 * (C) 2005 Novell, Inc.
17 #include "mono/metadata/assembly.h"
18 #include "mono/metadata/class.h"
19 #include "mono/metadata/object.h"
20 #include "mono/metadata/tabledefs.h"
27 gpointer
FindWindowExW (gpointer hwndParent
, gpointer hwndChildAfter
,
28 const char *classw
, const char *window
);
30 gpointer
GetProcessHeap (void);
32 static FnPtr functions
[] = {
33 { "FindWindowExW", NULL
}, /* user32 */
35 #define NFUNCTIONS (sizeof (functions)/sizeof (FnPtr))
37 static int swf_registered
;
40 compare_names (const void *key
, const void *p
)
42 FnPtr
*ptr
= (FnPtr
*) p
;
43 return strcmp (key
, ptr
->fname
);
47 get_function (const char *name
)
51 ptr
= bsearch (name
, functions
, NFUNCTIONS
, sizeof (FnPtr
),
55 g_warning ("Function '%s' not not found.", name
);
63 supportw_register_delegate (const char *function_name
, void *fnptr
)
67 g_return_val_if_fail (function_name
&& fnptr
, FALSE
);
69 ptr
= bsearch (function_name
, functions
, NFUNCTIONS
, sizeof (FnPtr
),
73 g_warning ("Function '%s' not supported.", function_name
);
81 #define M_ATTRS (METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC)
83 register_assembly (const char *name
, int *registered
)
85 /* we can't use mono or wapi funcions in a support lib */
87 MonoAssembly
*assembly
;
88 MonoImageOpenStatus status
;
97 assembly
= mono_assembly_load_with_partial_name (name
, &status
);
98 if (assembly
== NULL
) {
99 g_warning ("Cannot load assembly '%s'.", name
);
103 image
= mono_assembly_get_image (assembly
);
104 klass
= mono_class_from_name (image
, name
, "LibSupport");
106 g_warning ("Cannot load class %s.LibSupport", name
);
107 mono_assembly_close (assembly
);
111 method
= mono_class_get_method_from_name_flags (klass
, "Register", 0, M_ATTRS
);
113 g_warning ("Cannot load method Register from klass %s.LibSupport", name
);
114 mono_assembly_close (assembly
);
119 mono_runtime_invoke (method
, NULL
, NULL
, &exc
);
121 mono_assembly_close (assembly
);
122 mono_print_unhandled_exception (exc
);
126 mono_assembly_close (assembly
);
138 register_assembly ("System.Windows.Forms", &swf_registered
);
139 for (i
= 0; i
< NFUNCTIONS
; i
++) {
140 FnPtr
*ptr
= &functions
[i
];
141 if (ptr
->fnptr
== NULL
)
142 g_warning ("%s wasn't registered.", ptr
->fname
);
147 FindWindowExW (gpointer hwndParent
, gpointer hwndChildAfter
, const char *classw
, const char *window
)
149 typedef gpointer (*func_type
) (gpointer hwndParent
, gpointer hwndChildAfter
,
150 const char *classw
, const char *window
);
151 static func_type func
;
153 g_return_val_if_fail (register_assembly ("System.Windows.Forms", &swf_registered
), NULL
);
155 func
= (func_type
) get_function ("FindWindowExW");
157 return func (hwndParent
, hwndChildAfter
, classw
, window
);
161 SetWindowPos (gpointer hwnd
, gpointer hwndInsertAfter
, int x
, int y
, int cx
, int cy
, unsigned int flags
);
164 SetWindowPos (gpointer hwnd
, gpointer hwndInsertAfter
, int x
, int y
, int cx
, int cy
, unsigned int flags
)
166 fprintf (stderr
, "SetWindowPos %p %p to [%d,%dx%d,%d] %d\n", hwnd
, hwndInsertAfter
, x
, y
, cx
, cy
, flags
);
171 SendMessageA (gpointer hwnd
, unsigned int msg
, gpointer wparam
, gpointer lparam
);
174 SendMessageA (gpointer hwnd
, unsigned int msg
, gpointer wparam
, gpointer lparam
)
176 fprintf (stderr
, "SendMessage (%d, 0x%x, %p, %p)\n", (int) GPOINTER_TO_INT (hwnd
), msg
, wparam
, lparam
);
181 GetWindowLongA (gpointer hwnd
, int a
);
184 GetWindowLongA (gpointer hwnd
, int a
)