supportw.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /*
  2. * Helper routines for some of the common methods that people P/Invoke
  3. * on their applications.
  4. *
  5. * Authors:
  6. * Gonzalo Paniagua ([email protected])
  7. * Miguel de Icaza ([email protected])
  8. *
  9. * (C) 2005 Novell, Inc.
  10. *
  11. */
  12. #include <glib.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <unistd.h>
  16. #include "supportw.h"
  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. typedef struct {
  23. const char *fname;
  24. void *fnptr;
  25. } FnPtr;
  26. gpointer FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter,
  27. const char *classw, const char *window);
  28. gpointer GetProcessHeap (void);
  29. static FnPtr functions [] = {
  30. { "FindWindowExW", NULL }, /* user32 */
  31. };
  32. #define NFUNCTIONS (sizeof (functions)/sizeof (FnPtr))
  33. static int swf_registered;
  34. static int
  35. compare_names (const void *key, const void *p)
  36. {
  37. FnPtr *ptr = (FnPtr *) p;
  38. return strcmp (key, ptr->fname);
  39. }
  40. static gpointer
  41. get_function (const char *name)
  42. {
  43. FnPtr *ptr;
  44. ptr = bsearch (name, functions, NFUNCTIONS, sizeof (FnPtr),
  45. compare_names);
  46. if (ptr == NULL) {
  47. g_warning ("Function '%s' not not found.", name);
  48. return NULL;
  49. }
  50. return ptr->fnptr;
  51. }
  52. gboolean
  53. supportw_register_delegate (const char *function_name, void *fnptr)
  54. {
  55. FnPtr *ptr;
  56. g_return_val_if_fail (function_name && fnptr, FALSE);
  57. ptr = bsearch (function_name, functions, NFUNCTIONS, sizeof (FnPtr),
  58. compare_names);
  59. if (ptr == NULL) {
  60. g_warning ("Function '%s' not supported.", function_name);
  61. return FALSE;
  62. }
  63. ptr->fnptr = fnptr;
  64. return TRUE;
  65. }
  66. #define M_ATTRS (METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC)
  67. static gboolean
  68. register_assembly (const char *name, int *registered)
  69. {
  70. /* we can't use mono or wapi funcions in a support lib */
  71. #if 0
  72. MonoAssembly *assembly;
  73. MonoImageOpenStatus status;
  74. MonoImage *image;
  75. MonoClass *klass;
  76. MonoMethod *method;
  77. MonoObject *exc;
  78. if (*registered)
  79. return TRUE;
  80. assembly = mono_assembly_load_with_partial_name (name, &status);
  81. if (assembly == NULL) {
  82. g_warning ("Cannot load assembly '%s'.", name);
  83. return FALSE;
  84. }
  85. image = mono_assembly_get_image (assembly);
  86. klass = mono_class_from_name (image, name, "LibSupport");
  87. if (klass == NULL) {
  88. g_warning ("Cannot load class %s.LibSupport", name);
  89. mono_assembly_close (assembly);
  90. return FALSE;
  91. }
  92. method = mono_class_get_method_from_name_flags (klass, "Register", 0, M_ATTRS);
  93. if (klass == NULL) {
  94. g_warning ("Cannot load method Register from klass %s.LibSupport", name);
  95. mono_assembly_close (assembly);
  96. return FALSE;
  97. }
  98. exc = NULL;
  99. mono_runtime_invoke (method, NULL, NULL, &exc);
  100. if (exc != NULL) {
  101. mono_assembly_close (assembly);
  102. mono_print_unhandled_exception (exc);
  103. return FALSE;
  104. }
  105. *registered = 1;
  106. mono_assembly_close (assembly);
  107. return TRUE;
  108. #else
  109. return FALSE;
  110. #endif
  111. }
  112. void
  113. supportw_test_all ()
  114. {
  115. int i;
  116. register_assembly ("System.Windows.Forms", &swf_registered);
  117. for (i = 0; i < NFUNCTIONS; i++) {
  118. FnPtr *ptr = &functions [i];
  119. if (ptr->fnptr == NULL)
  120. g_warning ("%s wasn't registered.", ptr->fname);
  121. }
  122. }
  123. gpointer
  124. FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter, const char *classw, const char *window)
  125. {
  126. typedef gpointer (*func_type) (gpointer hwndParent, gpointer hwndChildAfter,
  127. const char *classw, const char *window);
  128. static func_type func;
  129. g_return_val_if_fail (register_assembly ("System.Windows.Forms", &swf_registered), NULL);
  130. if (func == NULL)
  131. func = (func_type) get_function ("FindWindowExW");
  132. return func (hwndParent, hwndChildAfter, classw, window);
  133. }
  134. int
  135. SetWindowPos (gpointer hwnd, gpointer hwndInsertAfter, int x, int y, int cx, int cy, uint flags)
  136. {
  137. fprintf (stderr, "SetWindowPos 0x%x 0x%x to [%d,%dx%d,%d] %d\n", hwnd, hwndInsertAfter, x, y, cx, cy, flags);
  138. return 1;
  139. }
  140. int
  141. SendMessageA (gpointer hwnd, uint msg, gpointer wparam, gpointer lparam)
  142. {
  143. fprintf (stderr, "SendMessage (%d, 0x%x, 0x%x, 0x%x)\n", hwnd, msg, wparam, lparam);
  144. return 0;
  145. }
  146. int
  147. GetWindowLongA (gpointer hwnd, int a)
  148. {
  149. return 0;
  150. }