public void Convert(ref Win16.CREATESTRUCT cs16, out Win32.CREATESTRUCT cs32) { if (cs16.lpCreateParams != 0 && !WindowClass.IsRegistered(_machine.ReadString(cs16.lpszClassName))) { throw new NotImplementedException("CREATESTRUCT.lpCreateParams not supported"); } // Convert it cs32.lpCreateParams = BitUtils.DWordToIntPtr(cs16.lpCreateParams); cs32.hInstance = IntPtr.Zero; cs32.x = (short)(cs16.cx == Win16.CW_USEDEFAULT ? Win16.CW_USEDEFAULT : cs16.x); cs32.y = (short)(cs16.cx == Win16.CW_USEDEFAULT ? Win16.CW_USEDEFAULT : cs16.y); cs32.cx = (short)(cs16.cx == Win16.CW_USEDEFAULT ? Win16.CW_USEDEFAULT : cs16.cx); cs32.cy = (short)(cs16.cx == Win16.CW_USEDEFAULT ? Win16.CW_USEDEFAULT : cs16.cy); cs32.dwExStyle = cs16.dwExStyle; cs32.style = cs16.style; cs32.lpszClassName = GetString(cs16.lpszClassName); cs32.lpszName = GetString(cs16.lpszName); if ((cs16.style & Win16.WS_CHILD) != 0) { cs32.hMenu = (IntPtr)cs16.hMenu; } else { cs32.hMenu = HMENU.Map.To32(cs16.hMenu); } cs32.hWndParent = HWND.Map.To32(cs16.hWndParent); }
public override uint Call32from16(Machine machine, bool hook, bool dlgproc, ref Win16.MSG msg16, ref Win32.MSG msg32, Func <IntPtr> callback) { // Get info var info = GetInfo(machine, msg32.hWnd); // Make sure no funny business going on // (ie: the same CREATESTRUCT is passed out from 16-bit code as was passed in) System.Diagnostics.Debug.Assert(info.Struct32 != IntPtr.Zero); System.Diagnostics.Debug.Assert(info.Struct16 != 0); System.Diagnostics.Debug.Assert(info.Struct16 == msg16.lParam); // Convert Win16.CREATESTRUCT cs16 = machine.ReadStruct <Win16.CREATESTRUCT>(msg16.lParam); Win32.CREATESTRUCT cs32; info.Convert(ref cs16, out cs32); Marshal.StructureToPtr(cs32, info.Struct32, false); // Call msg32.wParam = IntPtr.Zero; msg32.lParam = info.Struct32; IntPtr retv = callback(); // Convert back cs32 = Marshal.PtrToStructure <Win32.CREATESTRUCT>(info.Struct32); info.Convert(ref cs32, out cs16); machine.WriteStruct(info.Struct16, ref cs16); // Return value depends on WM_CREATE/WM_NCCREATE if (_nc) { return(retv != IntPtr.Zero ? 1U : 0U); } else { return(retv.ToInt64() < 0 ? unchecked ((uint)-1) : 0U); } }