CreateGadget
Posted: Fri Sep 02, 2011 6:39 pm
				
				Please tell me how to compile this code in PureBasic 4.51 x64 (Windows)?
In the x86 version is compiled without errors, but when compiling in x64 appears this error:

			In the x86 version is compiled without errors, but when compiling in x64 appears this error:

Code: Select all
Structure PB_Gadget_VT
  GadgetType.i
  SizeOf.i
  GadgetCallback.i
  FreeGadget.i
  GetGadgetState.i
  SetGadgetState.i
  GetGadgetText.i
  SetGadgetText.i
  AddGadgetItem2.i
  AddGadgetItem3.i
  RemoveGadgetItem.i
  ClearGadgetItemList.i
  ResizeGadget.i
  CountGadgetItems.i
  GetGadgetItemState.i
  SetGadgetItemState.i
  GetGadgetItemText.i
  SetGadgetItemText.i
  OpenGadgetList2.i
  GadgetX.i
  GadgetY.i
  GadgetWidth.i
  GadgetHeight.i
  HideGadget.i
  AddGadgetColumn.i
  RemoveGadgetColumn.i
  GetGadgetAttribute.i
  SetGadgetAttribute.i
  GetGadgetItemAttribute2.i
  SetGadgetItemAttribute2.i
  SetGadgetColor.i
  GetGadgetColor.i
  SetGadgetItemColor2.i
  GetGadgetItemColor2.i
  SetGadgetItemData.i
  GetGadgetItemData.i
EndStructure
CompilerIf Defined(PB_Gadget, #PB_Structure) = #False
Structure PB_Gadget
  Gadget.i
  *VT.PB_GadgetVT
  UserData.i
  OldCallback.i
  Daten.l[4]
EndStructure
CompilerEndIf
  ;GetGadgetParent
;
;                  Rueckgabe : Parent Handle
;
!EXTRN _PB_Object_GetOrAllocateID@8
!EXTRN _PB_Gadget_RegisterGadget@16
!EXTRN _PB_Gadget_RegisterGadget_UNICODE@16
!EXTRN _PB_Gadget_Objects
!EXTRN _PB_Object_GetThreadMemory@4
!EXTRN _PB_Gadget_Globals
Procedure GetGadgetParent()
  !MOV   Eax,[_PB_Gadget_Globals]
  !push  eax
  !call  _PB_Object_GetThreadMemory@4
  !MOV   Eax,[Eax]
  ProcedureReturn
EndProcedure
Structure Gadget_Info
  OldCallback.i
  DestroyProc.i
  PBID.i
EndStructure
Procedure RegGadget_Callback(hwnd, msg, wparam, lparam)
  Protected *Gadget_Info.Gadget_Info = GetProp_(hwnd, "GadgetInfo")
  Protected OldProc = *Gadget_Info\OldCallback
  
  If msg = #WM_NCDESTROY
    If *Gadget_Info
      If *Gadget_Info\DestroyProc
        CallFunctionFast(*Gadget_Info\DestroyProc, *Gadget_Info\pbid)
      EndIf
    EndIf
    RemoveProp_(hwnd, "GadgetInfo")
    FreeMemory(*Gadget_Info)
  EndIf
  
  ProcedureReturn CallWindowProc_(OldProc, hwnd, msg, wparam, lparam)
EndProcedure
Procedure RegisterGadget(hwnd.i, ID.i, DestroyProc.i , *vttemp.PB_Gadget_VT)
  Protected *Gadget_Info.Gadget_Info
  Protected OldCallback.l
  Protected *vt.PB_Gadget_VT
  Shared RegisterGadget_temphwnd, RegisterGadget_tempid
  
  If ((hwnd = 0) Or (id < #PB_Any))
    ProcedureReturn 0
  EndIf
  
  *vt = AllocateMemory(SizeOf(PB_Gadget_VT))
  If *vttemp <> 0
    CopyMemory(*vttemp,*vt,SizeOf(PB_Gadget_VT))
  EndIf
  
  RegisterGadget_temphwnd = hwnd
  RegisterGadget_tempid   = Id
  
  !MOV   esi,dword[v_RegisterGadget_tempid]
  !MOV   edi,[v_RegisterGadget_temphwnd]
  !PUSH  dword[v_RegisterGadget_tempid]
  !PUSH  dword [_PB_Gadget_Objects]   
  !CALL  _PB_Object_GetOrAllocateID@8 
  
  !PUSH  dword[p.p_vt]      ; vt 
  !PUSH  edi                ; hwnd 
  !PUSH  eax                ; *gadget
  !PUSH  esi                ; ID
  
  
  CompilerIf #PB_Compiler_Unicode
    !CALL  _PB_Gadget_RegisterGadget_UNICODE@16
  CompilerElse
    !CALL  _PB_Gadget_RegisterGadget@16
  CompilerEndIf
  
  !mov   [p.v_hwnd],eax
  
  If DestroyProc
    
    *Gadget_Info = AllocateMemory(SizeOf(Gadget_Info))
    
    If id = #PB_Any
      *Gadget_Info\PBID = hwnd
    Else
      *Gadget_Info\PBID = ID
    EndIf   
    
    *Gadget_Info\DestroyProc = DestroyProc
    *Gadget_Info\OldCallback = SetWindowLong_(GadgetID(*Gadget_Info\PBID), #GWL_WNDPROC, @RegGadget_Callback())
    
    SetProp_(GadgetID(*Gadget_Info\PBID), "GadgetInfo", *Gadget_Info)
    
  EndIf
  
  ProcedureReturn hwnd
EndProcedure
Procedure Create_Gadget(Id.i, ClassName.s, Text.s, Style.i, X.l, Y.l, CX.l, CY.l, ExStyle.i=0, DestroyProc.i=0, *vt.PB_Gadget_VT=0)
  Protected hwnd.i
  Protected Parent.i    = GetGadgetParent()
  Protected hInstance.i = GetModuleHandle_(0)
  
  hwnd = CreateWindowEx_(ExStyle, ClassName, Text, Style, X, Y, CX, CY, Parent, 0, hInstance, 0)
  SendMessage_(hWnd, #WM_SETFONT, GetGadgetFont(#PB_Default), 1);
  If hwnd = #False : ProcedureReturn #False : EndIf
  
  ProcedureReturn RegisterGadget(hwnd, ID, DestroyProc, *vt)
EndProcedure