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"
22 #include <limits.h> /* for PAGESIZE */
32 gpointer FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter,
33 const char *classw, const char *window);
35 gpointer GetProcessHeap (void);
37 static FnPtr functions [] = {
38 { "FindWindowExW", NULL }, /* user32 */
40 #define NFUNCTIONS (sizeof (functions)/sizeof (FnPtr))
42 static int swf_registered;
45 compare_names (const void *key, const void *p)
47 FnPtr *ptr = (FnPtr *) p;
48 return strcmp (key, ptr->fname);
52 get_function (const char *name)
56 ptr = bsearch (name, functions, NFUNCTIONS, sizeof (FnPtr),
60 g_warning ("Function '%s' not not found.", name);
68 supportw_register_delegate (const char *function_name, void *fnptr)
72 g_return_val_if_fail (function_name && fnptr, FALSE);
74 ptr = bsearch (function_name, functions, NFUNCTIONS, sizeof (FnPtr),
78 g_warning ("Function '%s' not supported.", function_name);
86 #define M_ATTRS (METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC)
88 register_assembly (const char *name, int *registered)
90 /* we can't use mono or wapi funcions in a support lib */
92 MonoAssembly *assembly;
93 MonoImageOpenStatus status;
102 assembly = mono_assembly_load_with_partial_name (name, &status);
103 if (assembly == NULL) {
104 g_warning ("Cannot load assembly '%s'.", name);
108 image = mono_assembly_get_image (assembly);
109 klass = mono_class_from_name (image, name, "LibSupport");
111 g_warning ("Cannot load class %s.LibSupport", name);
112 mono_assembly_close (assembly);
116 method = mono_class_get_method_from_name_flags (klass, "Register", 0, M_ATTRS);
118 g_warning ("Cannot load method Register from klass %s.LibSupport", name);
119 mono_assembly_close (assembly);
124 mono_runtime_invoke (method, NULL, NULL, &exc);
126 mono_assembly_close (assembly);
127 mono_print_unhandled_exception (exc);
131 mono_assembly_close (assembly);
143 register_assembly ("System.Windows.Forms", &swf_registered);
144 for (i = 0; i < NFUNCTIONS; i++) {
145 FnPtr *ptr = &functions [i];
146 if (ptr->fnptr == NULL)
147 g_warning ("%s wasn't registered.", ptr->fname);
152 FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter, const char *classw, const char *window)
154 typedef gpointer (*func_type) (gpointer hwndParent, gpointer hwndChildAfter,
155 const char *classw, const char *window);
156 static func_type func;
158 g_return_val_if_fail (register_assembly ("System.Windows.Forms", &swf_registered), NULL);
160 func = (func_type) get_function ("FindWindowExW");
162 return func (hwndParent, hwndChildAfter, classw, window);