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)