pb中使用winapi生成全球唯一标示码(GUID,UUID)

1、定义结构及外部函数

global type uuid from structure
 ulong  data1
 uint  data2
 uint  data3
 character  data4[8]
end type

Function ulong UuidCreate(ref uuid lpUUID) LIBRARY "rpcrt4"
Function ulong UuidToString (ref uuid lpUUID, ref long lpUUIDString)  LIBRARY "rpcrt4" Alias for "UuidToStringA"
Function ulong RpcStringFree(long lpUUIDString) LIBRARY "rpcrt4"  Alias for "RpcStringFreeA"

2、函数主体

CONSTANT Long  RPC_S_OK = 0
CONSTANT Long  RPC_S_UUID_LOCAL_ONLY = 1824

Long ll_rtn
uuid u
ll_rtn = uuidcreate(u)  //Create a new UUID
IF ll_rtn = RPC_S_OK OR ll_rtn = RPC_S_UUID_LOCAL_ONLY THEN
     Long ll_pointer
     String ls_uuid
     ll_rtn = UuidToString(u,ll_pointer)
     ls_uuid = Upper(String (ll_pointer,"Address")) //Convert it to a string

     RpcStringFree(ll_pointer)//Remove the string from the memory
     RETURN ls_uuid
ELSE
     RETURN ""
END IF

注:发布时候可能需要rpcrt4.dll

附:另外一种生成guid的方法

oleObject PBObject
string ls_GUID
long ll_result

PBObject = CREATE oleObject

ll_result = PBObject.ConnectToNewObject &
   ("PowerBuilder.Application")
IF ll_result < 0 THEN
 messagebox("","连接失败:与PowerBuilder.Application连接出错!")
 Destroy PBObject
   return ""
ELSE
   ll_result = PBObject.GenerateGUID(REF ls_GUID)
END IF
Destroy PBObject

return Mid(ls_GUID,2,len(ls_GUID) - 2)

第二种方法在程序发布时候需要在客户端进行配置:

pbapl80.dll
pbaen80.tlb
rpcrt4.dll


修改注册表如下

Windows Registry Editor Version 5.00


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PBAPPL.REG
;
; Registration information for PowerBuilder.Application.8
;
; All rights reserved.  No portion of this material may be copied in any way
; without prior written consent from Powersoft Corporation.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Version independent ProgID entries

[HKEY_CLASSES_ROOT/PowerBuilder.Application]
@="PowerBuilder Automation"

[HKEY_CLASSES_ROOT/PowerBuilder.Application/CLSID]
@="{88880001-8888-1000-8000-080009AC61A9}"

[HKEY_CLASSES_ROOT/PowerBuilder.Application/CurVer]
@="PowerBuilder.Application.8"

[HKEY_CLASSES_ROOT/PowerBuilder.Application/NotInsertable]
@=""

; Version specific ProgID entries
[HKEY_CLASSES_ROOT/PowerBuilder.Application.8]
@="PowerBuilder 8.0 Automation"

[HKEY_CLASSES_ROOT/PowerBuilder.Application.8/CLSID]
@="{88880001-8888-1000-8000-080009AC61A9}"

[HKEY_CLASSES_ROOT/PowerBuilder.Application.8/NotInsertable]
@=""

; CLSID entries
[HKEY_CLASSES_ROOT/CLSID/{88880001-8888-1000-8000-080009AC61A9}]
@="PowerBuilder Automation"

[HKEY_CLASSES_ROOT/CLSID/{88880001-8888-1000-8000-080009AC61A9}/InProcServer32]
@="d://Program Files//Sybase//Shared//PowerBuilder//pbvm80.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT/CLSID/{88880001-8888-1000-8000-080009AC61A9}/NotInsertable]
@=""

[HKEY_CLASSES_ROOT/CLSID/{88880001-8888-1000-8000-080009AC61A9}/ProgID]
@="PowerBuilder.Application.8"

[HKEY_CLASSES_ROOT/CLSID/{88880001-8888-1000-8000-080009AC61A9}/Programmable]
@=""

[HKEY_CLASSES_ROOT/CLSID/{88880001-8888-1000-8000-080009AC61A9}/TypeLib]
@="{88880002-8888-1000-8000-080009AC61A9}"

[HKEY_CLASSES_ROOT/CLSID/{88880001-8888-1000-8000-080009AC61A9}/VersionIndependentProgID]
@="PowerBuilder.Application"


; Type library registration entries
[HKEY_CLASSES_ROOT/TypeLib/{88880002-8888-1000-8000-080009AC61A9}]

[HKEY_CLASSES_ROOT/TypeLib/{88880002-8888-1000-8000-080009AC61A9}/1.0]
@="PowerBuilder Automation Type Library"

[HKEY_CLASSES_ROOT/TypeLib/{88880002-8888-1000-8000-080009AC61A9}/1.0/0]

[HKEY_CLASSES_ROOT/TypeLib/{88880002-8888-1000-8000-080009AC61A9}/1.0/0/Win32]
@="d://Program Files//Sybase//Shared//PowerBuilder//PBAEN80.TLB"

[HKEY_CLASSES_ROOT/TypeLib/{88880002-8888-1000-8000-080009AC61A9}/1.0/9]

[HKEY_CLASSES_ROOT/TypeLib/{88880002-8888-1000-8000-080009AC61A9}/1.0/9/Win32]
@="d://Program Files//Sybase//Shared//PowerBuilder//PBAEN80.TLB"

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 首先,需要导入ctypes库来调用Windows API。然后,使用ctypes.windll.user32.SetWinEventHook函数设置事件钩子。参数包括事件类型、回调函数、进程句柄、线程句柄、窗口类型、窗口句柄范围等。回调函数将在相应事件发生时被调用,并可以处理相应的事件。最后,使用ctypes.windll.user32.UnhookWinEvent来取消钩子。 示例代: ```python import ctypes def callback(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime): # your code here pass user32 = ctypes.windll.user32 # set the hook hook = user32.SetWinEventHook(event_type, event_type, 0, callback, 0, 0, win32con.WINEVENT_OUTOFCONTEXT) # do something # remove the hook user32.UnhookWinEvent(hook) ``` 其 event_type 是你需要监听的事件类型,win32con 是一个常量模块。 注意: 请确保在程序结束时取消钩子,否则将会造成内存泄露。 ### 回答2: 在Python使用winapi SetWinEventHook可以通过以下步骤: 1. 首先,确保你已经安装了pywin32库。pywin32是一个Python对Windows操作系统API的封装,可以在Python调用Windows相关的功能。 2. 导入pywin32库: ``` python import win32api import win32con import win32gui import win32console ``` 3. 创建一个回调函数,用于处理事件的响应: ``` python def winEventProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime): # 处理事件的逻辑代 print("WinEventProc called") ``` 4. 创建WinEventHook: ``` python # 设定要监听的事件类型 EVENT_MIN = 0x00000001 EVENT_MAX = 0x7FFFFFFF EVENT_OBJECT_DESTROY = 0x8001 WINEVENT_OUTOFCONTEXT = 0x0000 # 创建WinEventHook win32gui.SetWinEventHook(EVENT_OBJECT_DESTROY, EVENT_OBJECT_DESTROY, 0, winEventProc, 0, 0, WINEVENT_OUTOFCONTEXT) ``` 上述代,EVENT_OBJECT_DESTROY指定了要监听的事件类型,winEventProc是事件发生时会被调用的回调函数。 5. 运行程序: ``` python def main(): win32gui.PumpMessages() if __name__ == "__main__": main() ``` PumpMessages函数会运行一个消息循环,监听Windows消息和事件,当有事件发生时,会调用winEventProc回调函数进行处理。 这就是使用Pythonwinapi SetWinEventHook的基本步骤。你可以根据自己的需求修改回调函数的逻辑代来实现具体的功能。 ### 回答3: 在 Python 使用 winapi 的 SetWinEventHook 函数,可以通过以下步骤实现: 1. 首先,我们需要导入所需的库。使用`ctypes`库可以访问和调用动态链接库(DLL)的函数。因此,我们需要导入`ctypes`库。 ```python import ctypes ``` 2. 然后,我们需要定义所需的常量和数据结构。在使用`SetWinEventHook`函数之前,我们需要先定义一些常量和数据结构。 ```python user32 = ctypes.windll.user32 # 定义常量 EVENT_MIN = 0x00000001 EVENT_MAX = 0x7FFFFFFF EVENT_SYSTEM_FOREGROUND = 0x0003 # 定义数据结构 WinEventProcType = ctypes.WINFUNCTYPE(None, ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD, ctypes.wintypes.HWND, ctypes.wintypes.LONG, ctypes.wintypes.LONG, ctypes.wintypes.DWORD, ctypes.wintypes.DWORD) # 定义回调函数 def callback(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime): # 在此处编写你的回调函数逻辑 print("Windows事件发生") ``` 3. 接下来,我们可以在需要使用`SetWinEventHook`函数的地方调用它,并传入适当的参数。 ```python # 设置回调函数类型 WinEventProc = WinEventProcType(callback) # 设置事件钩子 hook = user32.SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, 0, WinEventProc, 0, 0, 0) ``` 4. 最后,我们可以使用`SetWinEventHook`函数捕获 Windows 事件,并在回调函数执行逻辑。 ```python # 消息循环,等待事件发生 while True: user32.GetMessageA(ctypes.byref(ctypes.wintypes.MSG()), 0, 0, 0) ``` 以上就是在 Python 使用 winapi 的 SetWinEventHook 函数的基本步骤。你可以根据自己的需求,在回调函数编写其他逻辑来处理捕获的事件。需要注意的是,在使用完事件钩子后,确保调用`user32.UnhookWinEvent(hook)`来释放钩子,防止资源泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值