PctGL SERIES  
http://pctgl.cnblogs.com


  经常写一些代码,虽然完整的程序没写过几个,但却经常写小函数。。。(总是没耐心。。)

  函数也没少写了,但总是随着某个未完工程一起消失(下了好几次决心远离编程的。。。)

  以后~~~ 不管咋地,先把觉得比较不错的小技巧和一些觉得比较经典的函数存到这里

                                                         不断更新ing....




禁止 / 恢复 窗体移动

Des:
设置一个顶级窗口是否可以由用户拖动菜单栏来移动窗口
subclass 麻烦了~~

Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert  As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, Optional ByVal wFlags As Long = 0&) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long

Function SetWindowMoveAble(ByVal hWnd As Long, Optional ByVal MoveAble As Boolean =True) As Boolean

'function: SetWindowMoveAble
'  params:
'          hWnd: 一个顶级窗口句柄
'          MoveAble: 是否可移动
'  result: 与参数 Moveable 的设置一样,否则即为失败

Dim mhandle As Long
If MoveAble Then _
  GetSystemMenu hWnd, 1&: _
  DrawMenuBar hWnd _
Else _
  mhandle = GetSystemMenu(hWnd, 0&): _
  SetWindowMoveAble = DeleteMenu(mhandle, &HF010&)

End Function






获取安全数组信息
 
Des:
获取安全数组的信息,包括安全数组结构内的所有数据
本来用结构做的话,更方便,但会增加代码量,而且用起来也会麻烦些,所以就用了N多变量了
有兴趣的朋友可以再改改

Private Function GetSafeArrayInfo(AnyArray As Variant, Optional sDimension As Integer, Optional LowerBound As Long, Optional UpperBound As Long, Optional Elements As Long, Optional Flags As Integer, Optional cbElements As Long, Optional cLocks As Long, Optional AddressOfData As Long) As Long
'**************************************************************
'*
'*  数组头地址 = GetSafeArrayInfo(数组 ,[维数],[下标],[上标],[元素个数],[属性],[元素长度],[锁定计数],[首元素地址])
'*
'*  result:  成功返回数组头地址;  返回 0 代表这是一个未被初始化过的数组
'*
'*  note:    除第1个参数外,均为输出型参数,要获取数组的什么信息,传入相应的变量,执行后,变量的值即为相应的数组数据
'*
'*           要获取多维数组的非第1维的上/下标,应按照下面的方法调用
'*
'*           GetSafeArrayInfo (数组, 指定一个维数,[下标],[上标]
'*
'**************************************************************

    Dim ArrayHeaderAddress  As Long
    Dim DimensionCount As Integer     '维数计次

    CopyMemory ArrayHeaderAddress, ByVal VarPtr(AnyArray) + 8, 4
    CopyMemory ArrayHeaderAddress, ByVal ArrayHeaderAddress, 4              '获取数组头地址
   
    If ArrayHeaderAddress < 1 Then Exit Function

    CopyMemory DimensionCount, ByVal ArrayHeaderAddress, 2                  '获取数组维数

    If sDimension > DimensionCount Then Exit Function                       '若指定的维数大于实际维数则退出

    CopyMemory LowerBound, ByVal (ArrayHeaderAddress + 16 + (DimensionCount - sDimension) * 8) + 4, 4 '获取下标
    CopyMemory Elements , ByVal (ArrayHeaderAddress + 16 + (DimensionCount - sDimension) * 8), 4

                                                   '获取指定维数下的元素个数
    UpperBound = Elements + LowerBound - 1                                '获取指定维数下的上标
   
    CopyMemory Flags, ByVal ArrayHeaderAddress + 2, 2                       '获取数组属性
    CopyMemory cbElements, ByVal ArrayHeaderAddress + 4, 2                  '获取数组单个元素长度
    CopyMemory cLocks, ByVal ArrayHeaderAddress + 8, 2                      '获取数组锁定计数
    CopyMemory AddressOfData, ByVal ArrayHeaderAddress + 12, 4              '获取数组首元素地址
   
    GetSafeArrayInfo = ArrayHeaderAddress
 
End Function
 
 



  一些经过整理的 Native APi 调用范例

Des:
NT 核心 Ring3 顶级函数,系统内核函数一般都由 Ntdll.dll 实现调用转发,调用他的函数效率更高些

  LdrLoadDll  模块加载相关的

  NtOpenProcess  进程操作相关的

  NtCreateEvent  事件相关

  ZwAllocateVirtualMemory  申请内存操作相关

  其他,见代码: https://files.cnblogs.com/pctgl/Native.rar
posted on 2009-08-06 16:58  PctGL  阅读(728)  评论(0编辑  收藏  举报