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 "mono/utils/bsearch.h"
29 gpointer FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter,
30 const char *classw, const char *window);
32 gpointer GetProcessHeap (void);
34 static FnPtr functions [] = {
35 { "FindWindowExW", NULL }, /* user32 */
37 #define NFUNCTIONS (sizeof (functions)/sizeof (FnPtr))
39 static int swf_registered;
42 compare_names (const void *key, const void *p)
44 FnPtr *ptr = (FnPtr *) p;
45 return strcmp (key, ptr->fname);
49 get_function (const char *name)
53 ptr = mono_binary_search (name, functions, NFUNCTIONS, sizeof (FnPtr),
57 g_warning ("Function '%s' not not found.", name);
65 supportw_register_delegate (const char *function_name, void *fnptr)
69 g_return_val_if_fail (function_name && fnptr, FALSE);
71 ptr = mono_binary_search (function_name, functions, NFUNCTIONS, sizeof (FnPtr),
75 g_warning ("Function '%s' not supported.", function_name);
83 #define M_ATTRS (METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC)
85 register_assembly (const char *name, int *registered)
87 /* we can't use mono or wapi funcions in a support lib */
89 MonoAssembly *assembly;
90 MonoImageOpenStatus status;
99 assembly = mono_assembly_load_with_partial_name (name, &status);
100 if (assembly == NULL) {
101 g_warning ("Cannot load assembly '%s'.", name);
105 image = mono_assembly_get_image (assembly);
106 klass = mono_class_from_name (image, name, "LibSupport");
108 g_warning ("Cannot load class %s.LibSupport", name);
109 mono_assembly_close (assembly);
113 method = mono_class_get_method_from_name_flags (klass, "Register", 0, M_ATTRS);
115 g_warning ("Cannot load method Register from klass %s.LibSupport", name);
116 mono_assembly_close (assembly);
121 mono_runtime_invoke (method, NULL, NULL, &exc);
123 mono_assembly_close (assembly);
124 mono_print_unhandled_exception (exc);
128 mono_assembly_close (assembly);
140 register_assembly ("System.Windows.Forms", &swf_registered);
141 for (i = 0; i < NFUNCTIONS; i++) {
142 FnPtr *ptr = &functions [i];
143 if (ptr->fnptr == NULL)
144 g_warning ("%s wasn't registered.", ptr->fname);
149 FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter, const char *classw, const char *window)
151 typedef gpointer (*func_type) (gpointer hwndParent, gpointer hwndChildAfter,
152 const char *classw, const char *window);
153 static func_type func;
155 g_return_val_if_fail (register_assembly ("System.Windows.Forms", &swf_registered), NULL);
157 func = (func_type) get_function ("FindWindowExW");
159 return func (hwndParent, hwndChildAfter, classw, window);
163 SetWindowPos (gpointer hwnd, gpointer hwndInsertAfter, int x, int y, int cx, int cy, unsigned int flags)
165 fprintf (stderr, "SetWindowPos %p %p to [%d,%dx%d,%d] %d\n", hwnd, hwndInsertAfter, x, y, cx, cy, flags);
170 SendMessageA (gpointer hwnd, unsigned int msg, gpointer wparam, gpointer lparam)
172 fprintf (stderr, "SendMessage (%d, 0x%x, %p, %p)\n", (int) GPOINTER_TO_INT (hwnd), msg, wparam, lparam);
177 GetWindowLongA (gpointer hwnd, int a)