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
GetProcessHeap (void);
33 static FnPtr functions
[] = {
34 { "FindWindowExW", NULL
}, /* user32 */
36 #define NFUNCTIONS (sizeof (functions)/sizeof (FnPtr))
38 static int swf_registered
;
41 compare_names (const void *key
, const void *p
)
43 FnPtr
*ptr
= (FnPtr
*) p
;
44 return strcmp (key
, ptr
->fname
);
48 get_function (const char *name
)
52 ptr
= bsearch (name
, functions
, NFUNCTIONS
, sizeof (FnPtr
),
56 g_warning ("Function '%s' not not found.", name
);
64 supportw_register_delegate (const char *function_name
, void *fnptr
)
68 g_return_val_if_fail (function_name
&& fnptr
, FALSE
);
70 ptr
= bsearch (function_name
, functions
, NFUNCTIONS
, sizeof (FnPtr
),
74 g_warning ("Function '%s' not supported.", function_name
);
82 #define M_ATTRS (METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC)
84 register_assembly (const char *name
, int *registered
)
86 /* we can't use mono or wapi funcions in a support lib */
88 MonoAssembly
*assembly
;
89 MonoImageOpenStatus status
;
98 assembly
= mono_assembly_load_with_partial_name (name
, &status
);
99 if (assembly
== NULL
) {
100 g_warning ("Cannot load assembly '%s'.", name
);
104 image
= mono_assembly_get_image (assembly
);
105 klass
= mono_class_from_name (image
, name
, "LibSupport");
107 g_warning ("Cannot load class %s.LibSupport", name
);
108 mono_assembly_close (assembly
);
112 method
= mono_class_get_method_from_name_flags (klass
, "Register", 0, M_ATTRS
);
114 g_warning ("Cannot load method Register from klass %s.LibSupport", name
);
115 mono_assembly_close (assembly
);
120 mono_runtime_invoke (method
, NULL
, NULL
, &exc
);
122 mono_assembly_close (assembly
);
123 mono_print_unhandled_exception (exc
);
127 mono_assembly_close (assembly
);
139 register_assembly ("System.Windows.Forms", &swf_registered
);
140 for (i
= 0; i
< NFUNCTIONS
; i
++) {
141 FnPtr
*ptr
= &functions
[i
];
142 if (ptr
->fnptr
== NULL
)
143 g_warning ("%s wasn't registered.", ptr
->fname
);
148 FindWindowExW (gpointer hwndParent
, gpointer hwndChildAfter
, const char *classw
, const char *window
)
150 typedef gpointer (*func_type
) (gpointer hwndParent
, gpointer hwndChildAfter
,
151 const char *classw
, const char *window
);
152 static func_type func
;
154 g_return_val_if_fail (register_assembly ("System.Windows.Forms", &swf_registered
), NULL
);
156 func
= (func_type
) get_function ("FindWindowExW");
158 return func (hwndParent
, hwndChildAfter
, classw
, window
);
162 SetWindowPos (gpointer hwnd
, gpointer hwndInsertAfter
, int x
, int y
, int cx
, int cy
, uint flags
)
164 fprintf (stderr
, "SetWindowPos 0x%x 0x%x to [%d,%dx%d,%d] %d\n", hwnd
, hwndInsertAfter
, x
, y
, cx
, cy
, flags
);
169 SendMessageA (gpointer hwnd
, uint msg
, gpointer wparam
, gpointer lparam
)
171 fprintf (stderr
, "SendMessage (%d, 0x%x, 0x%x, 0x%x)\n", hwnd
, msg
, wparam
, lparam
);
176 GetWindowLongA (gpointer hwnd
, int a
)