mormot对windows websocket的封装

mormot对windows websocket的封装

windows 2012\8 以上版本开始提供websocket.dll动态库给外部程序调用。mormot也调用它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure WebSocketApiInitialize;
var
  api: TWebSocketAPIs;
  P: PPointer;
begin
  if WebSocketAPI.LibraryHandle <> 0 then
    exit; // already loaded
  WebSocketAPI.WebSocketEnabled := false;
  WebSocketAPI.LibraryHandle := SafeLoadLibrary(WEBSOCKET_DLL); //加载 websocket.dll
  if WebSocketAPI.LibraryHandle = 0 then
    exit;
  P := @@WebSocketAPI.AbortHandle;
  for api := low(api) to high(api) do
  begin
    P^ := GetProcAddress(WebSocketAPI.LibraryHandle, WebSocketNames[api]);
    if P^ = nil then
    begin
      FreeLibrary(WebSocketAPI.LibraryHandle);
      WebSocketAPI.LibraryHandle := 0;
      exit;
    end;
    inc(P);
  end;
  WebSocketAPI.WebSocketEnabled := true;
end;

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/// direct late-binding access to the WebSocket Protocol Component API functions
TWebSocketAPI = packed record
  /// acces to the loaded library handle
  LibraryHandle: THandle;
  /// depends on Windows version
  WebSocketEnabled: Boolean;
  /// aborts a WebSocket session handle created by WebSocketCreateClientHandle
  // or WebSocketCreateServerHandle
  AbortHandle: procedure(hWebSocket: WEB_SOCKET_HANDLE); stdcall;
  /// begins the client-side handshake
  BeginClientHandshake: function(hWebSocket: WEB_SOCKET_HANDLE;
    pszSubprotocols: PAnsiChar; ulSubprotocolCount: ULONG; pszExtensions:
    PAnsiChar; ulExtensionCount: ULONG; const pInitialHeaders:
    PWEB_SOCKET_HTTP_HEADER; ulInitialHeaderCount: ULONG;
    out pAdditionalHeaders: PWEB_SOCKET_HTTP_HEADER;
    out pulAdditionalHeaderCount: ULONG): HRESULT; stdcall;
  /// begins the server-side handshake
  BeginServerHandshake: function(hWebSocket: WEB_SOCKET_HANDLE;
    pszSubprotocolSelected: PAnsiChar; pszExtensionSelected: PAnsiChar;
    ulExtensionSelectedCount: ULONG; const pRequestHeaders:
    PWEB_SOCKET_HTTP_HEADER; ulRequestHeaderCount: ULONG; out pResponseHeaders:
    PWEB_SOCKET_HTTP_HEADER; out pulResponseHeaderCount: ULONG): HRESULT; stdcall;
  /// completes an action started by WebSocketGetAction
  CompleteAction: function(hWebSocket: WEB_SOCKET_HANDLE;
    pvActionContext: Pointer; ulBytesTransferred: ULONG): HRESULT; stdcall;
  /// creates a client-side WebSocket session handle
  CreateClientHandle: function(const pProperties: PWEB_SOCKET_PROPERTY;
    ulPropertyCount: ULONG; out phWebSocket: WEB_SOCKET_HANDLE): HRESULT; stdcall;
  /// creates a server-side WebSocket session handle
  CreateServerHandle: function(const pProperties: PWEB_SOCKET_PROPERTY;
    ulPropertyCount: ULONG; out phWebSocket: WEB_SOCKET_HANDLE): HRESULT; stdcall;
  /// deletes a WebSocket session handle created by WebSocketCreateClientHandle
  // or WebSocketCreateServerHandle
  DeleteHandle: procedure(hWebSocket: WEB_SOCKET_HANDLE); stdcall;
  /// completes the client-side handshake
  EndClientHandshake: function(hWebSocket: WEB_SOCKET_HANDLE; const
    pResponseHeaders: PWEB_SOCKET_HTTP_HEADER; ulReponseHeaderCount: ULONG;
    var pulSelectedExtensions: ULONG; var pulSelectedExtensionCount: ULONG;
    var pulSelectedSubprotocol: ULONG): HRESULT; stdcall;
  /// completes the server-side handshake
  EndServerHandshake: function(hWebSocket: WEB_SOCKET_HANDLE): HRESULT; stdcall;
  /// returns an action from a call to WebSocketSend, WebSocketReceive or WebSocketCompleteAction
  GetAction: function(hWebSocket: WEB_SOCKET_HANDLE; eActionQueue:
    WEB_SOCKET_ACTION_QUEUE; pDataBuffers: Pointer {WEB_SOCKET_BUFFER_DATA};
    var pulDataBufferCount: ULONG; var pAction: WEB_SOCKET_ACTION;
    var pBufferType: WEB_SOCKET_BUFFER_TYPE; var pvApplicationContext: Pointer;
    var pvActionContext: Pointer): HRESULT; stdcall;
  /// gets a single WebSocket property
  GetGlobalProperty: function(eType: WEB_SOCKET_PROPERTY_TYPE;
    pvValue: Pointer; var ulSize: ULONG): HRESULT; stdcall;
  /// adds a receive operation to the protocol component operation queue
  Receive: function(hWebSocket: WEB_SOCKET_HANDLE; pBuffer: Pointer;
    pvContext: Pointer): HRESULT; stdcall;
  /// adds a send operation to the protocol component operation queue
  Send: function(hWebSocket: WEB_SOCKET_HANDLE; BufferType:
    WEB_SOCKET_BUFFER_TYPE; pBuffer, Context: Pointer): HRESULT; stdcall;
end;

  

posted @   delphi中间件  阅读(856)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2017-08-11 怎样设计REST中间件---中间件JSON对数据库数据的组织
2016-08-11 为方便二层升三层新增的远程方法QuerySql6()
2014-08-11 中间件集群的协议和算法的类语言描述
点击右上角即可分享
微信分享提示