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"
21 #include "mono/io-layer/wapi.h"
28 gpointer FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter,
29 const char *classw, const char *window);
31 gpointer HeapAlloc (gpointer unused1, gint32 unused2, gint32 nbytes);
32 gpointer HeapCreate (gint32 flags, gint32 initial_size, gint32 max_size);
33 gboolean HeapSetInformation (gpointer handle, gpointer heap_info_class,
34 gpointer heap_info, gint32 head_info_length);
36 gboolean HeapQueryInformation (gpointer handle, gpointer heap_info_class,
37 gpointer heap_info, gint32 head_info_length, gint32 *ret_length);
39 gpointer HeapAlloc (gpointer handle, gint32 flags, gint32 nbytes);
40 gpointer HeapReAlloc (gpointer handle, gint32 flags, gpointer mem, gint32 nbytes);
41 gint32 HeapSize (gpointer handle, gint32 flags, gpointer mem);
42 gboolean HeapFree (gpointer handle, gint32 flags, gpointer mem);
43 gboolean HeapValidate (gpointer handle, gpointer mem);
44 gboolean HeapDestroy (gpointer handle);
45 gpointer GetProcessHeap (void);
47 static FnPtr functions [] = {
48 { "FindWindowExW", NULL }, /* user32 */
50 #define NFUNCTIONS (sizeof (functions)/sizeof (FnPtr))
52 static int swf_registered;
55 compare_names (const void *key, const void *p)
57 FnPtr *ptr = (FnPtr *) p;
58 return strcmp (key, ptr->fname);
62 get_function (const char *name)
66 ptr = bsearch (name, functions, NFUNCTIONS, sizeof (FnPtr),
70 g_warning ("Function '%s' not not found.", name);
78 supportw_register_delegate (const char *function_name, void *fnptr)
82 g_return_val_if_fail (function_name && fnptr, FALSE);
84 ptr = bsearch (function_name, functions, NFUNCTIONS, sizeof (FnPtr),
88 g_warning ("Function '%s' not supported.", function_name);
96 #define M_ATTRS (METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC)
98 register_assembly (const char *name, int *registered)
100 /* we can't use mono or wapi funcions in a support lib */
102 MonoAssembly *assembly;
103 MonoImageOpenStatus status;
112 assembly = mono_assembly_load_with_partial_name (name, &status);
113 if (assembly == NULL) {
114 g_warning ("Cannot load assembly '%s'.", name);
118 image = mono_assembly_get_image (assembly);
119 klass = mono_class_from_name (image, name, "LibSupport");
121 g_warning ("Cannot load class %s.LibSupport", name);
122 mono_assembly_close (assembly);
126 method = mono_class_get_method_from_name_flags (klass, "Register", 0, M_ATTRS);
128 g_warning ("Cannot load method Register from klass %s.LibSupport", name);
129 mono_assembly_close (assembly);
134 mono_runtime_invoke (method, NULL, NULL, &exc);
136 mono_assembly_close (assembly);
137 mono_print_unhandled_exception (exc);
141 mono_assembly_close (assembly);
153 register_assembly ("System.Windows.Forms", &swf_registered);
154 for (i = 0; i < NFUNCTIONS; i++) {
155 FnPtr *ptr = &functions [i];
156 if (ptr->fnptr == NULL)
157 g_warning ("%s wasn't registered.", ptr->fname);
162 FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter, const char *classw, const char *window)
164 typedef gpointer (*func_type) (gpointer hwndParent, gpointer hwndChildAfter,
165 const char *classw, const char *window);
166 static func_type func;
168 g_return_val_if_fail (register_assembly ("System.Windows.Forms", &swf_registered), NULL);
170 func = (func_type) get_function ("FindWindowExW");
172 return func (hwndParent, hwndChildAfter, classw, window);