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; |
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/13473973.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 中间件集群的协议和算法的类语言描述