[Mono-list] PInvoke works with ms runtime but not mono BUG??

John Sohn jsohn@columbus.rr.com
15 Oct 2002 20:07:04 -0400

I've encountered this same problem and opened the issue in Bugzilla at:
http://bugzilla.ximian.com/show_bug.cgi?id=29548. It is currently marked
as fixed but I still encountered the problem the last time I checked
around a month ago. I have not had a chance to try it with the latest
versions of Mono in CVS though so I did not feel it was appropriate to
re-open the item.


I am trying to run a simple windows message pump class under Windows XP
using Mono.

When running the following class using mono class1.exe, the app fails to
create the hwnd.

Yet running the same class using ms runtime runs perfectly.

Doesnt matter if i compile with mcs or ms compiler - gives same result.

Could it be that the mono jit/mint are not keeping the WNDPROC address
fixed?? Not sure - its beyond me.

Can anyone help?

If i can get this to work properly then WOW!

using System;

using System.Runtime.InteropServices;

class Class1


static void Main(string[] args)




wc.lpfnWndProc = new WNDPROC(MyWndProc);

wc.hbrBackground = 6;

wc.lpszClassName = "NativeFormClass";

if (RegisterClass(wc)==0) 


Console.WriteLine("Failed to create window class");




int hwnd = CreateWindowEx(0, "NativeFormClass", "NativeForm",0x10cf0000,

-2147483648, -2147483648, -2147483648, -2147483648,

0, 0,0, 0);

if (hwnd==0) 


Console.WriteLine("Failed to create HWND");




MSG msgvalue;

while (GetMessage(out msgvalue, 0,0,0)) 


TranslateMessage(ref msgvalue);

DispatchMessage(ref msgvalue);






[DllImport("user32", EntryPoint="GetMessageA", CharSet = CharSet.Ansi)]

static extern bool GetMessage(out MSG msgvalue, int hwnd, int minFilter,
int maxFilter);

[DllImport("user32", EntryPoint="DispatchMessageA", CharSet =

static extern int DispatchMessage(ref MSG msgvalue);


static extern bool TranslateMessage(ref MSG msgValue);

[DllImport("user32", EntryPoint="RegisterClassA", CharSet =

static extern int RegisterClass(WNDCLASS wc);

static int MyWndProc (int hWnd, int msgvalue, int wParam, int lParam) 


int retval = 0;



case 2:




retval = DefWindowProc(hWnd, msgvalue, wParam, lParam);



return retval;



public struct MSG 


public int hwnd;

public int message;

public int wParam;

public int lParam;

public int itime;

public int pt_x;

public int pt_y;


[DllImport("user32", EntryPoint="PostQuitMessage")]

static extern void PostQuitMessage(int nExitCode);

[DllImport("user32", EntryPoint="DefWindowProcA", CharSet =

static extern int DefWindowProc(int hWnd, int msg, int wParam, int

[DllImport("user32", EntryPoint="CreateWindowExA", CharSet
=CharSet.Ansi)]//, CharSet=CharSet.Unicode)]

static extern int CreateWindowEx(int dwExStyle, string lpszClassName,
string lpszWindowName,

int style, int x, int y, int width, int height, int hWndParent, int

int hInst, int pvParam);


public class WNDCLASS 


public int style;

public WNDPROC lpfnWndProc;

public int cbClsExtra;

public int cbWndExtra;

public int hInstance;

public int hIcon;

public int hCursor;

public int hbrBackground;

public string lpszMenuName;

public string lpszClassName;


public delegate int WNDPROC( int hWnd, int msgvalue, int wParam, int


Surf the Web without missing calls! Get MSN Broadband. Click Here 
_______________________________________________ Mono-list maillist -
Mono-list@ximian.com http://lists.ximian.com/mailman/listinfo/mono-list