Win32 API 日本語リファレンス
ホームNetworking.WindowsWebServices › WS_CHANNEL_ENCODER

WS_CHANNEL_ENCODER

構造体
サイズx64: 56 バイト / x86: 28 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
createContextvoid*8/4+0+0WS_CREATE_ENCODER_CALLBACK に渡されるコンテキストです。
createEncoderCallbackWS_CREATE_ENCODER_CALLBACK8/4+8+4エンコーダーのインスタンスを作成する WS_CREATE_ENCODER_CALLBACK コールバックです。
encoderGetContentTypeCallbackWS_ENCODER_GET_CONTENT_TYPE_CALLBACK8/4+16+8メッセージがエンコードされる際に呼び出される WS_ENCODER_GET_CONTENT_TYPE_CALLBACK コールバックです。
encoderStartCallbackWS_ENCODER_START_CALLBACK8/4+24+12メッセージのエンコードを開始するために呼び出される WS_ENCODER_START_CALLBACK コールバックです。
encoderEncodeCallbackWS_ENCODER_ENCODE_CALLBACK8/4+32+16メッセージをエンコードするために呼び出される WS_ENCODER_ENCODE_CALLBACK コールバックです。
encoderEndCallbackWS_ENCODER_END_CALLBACK8/4+40+20メッセージのエンコードの終了時に呼び出される WS_ENCODER_END_CALLBACK コールバックです。
freeEncoderCallbackWS_FREE_ENCODER_CALLBACK8/4+48+24エンコーダーのインスタンスを解放する WS_FREE_ENCODER_CALLBACK コールバックです。

公式ドキュメント

送信されるメッセージのコンテンツタイプとエンコードされたバイト列を変換できる 一連のコールバックを指定するために使用する構造体です。

解説(Remarks)

WS_CHANNEL では、メッセージのエンコードされたバイト列を送信する前に、 圧縮や変更などの変換を行いたい場合があります。WS_CHANNEL_ENCODER は、 こうした変更を割り込んで実行するために必要なフックを提供します。

チャネルを作成する際には、WS_CHANNEL_PROPERTY_ENCODER に 適切な関数を設定してください。

エンコーダーのコールバックの文法は次のとおりです。


encodercalls := create encoderloop* free
encoderloop  := getcontenttype
             |  getcontenttype encodestart
             |  getcontenttype encodestart (encode*)
             |  getcontenttype encodestart (encode*) encodeend

チャネルまたはエンコーダーがメッセージの書き込み中にエラーに遭遇した場合、エンコーダーは メッセージの完全なエンコードシーケンスを認識できないことがあります。エンコーダーは、 呼び出されたコールバックに応じて適切な状態へ遷移できるようにしておく必要があります。

WS_TCP_CHANNEL_BINDINGWS_CHANNEL_TYPE_SESSION と共に使用する場合、コンテンツタイプは チャネルに対して固定されます。この場合、WS_ENCODER_GET_CONTENT_TYPE_CALLBACK は すべてのメッセージのコンテンツタイプとしてまったく同じ値を返さなければなりません。

チャネルがエンコーダーインスタンスの使用を終えると、 WS_FREE_ENCODER_CALLBACK を通じてそれを解放します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// WS_CHANNEL_ENCODER  (x64 56 / x86 28 バイト)
typedef struct WS_CHANNEL_ENCODER {
    void* createContext;
    WS_CREATE_ENCODER_CALLBACK createEncoderCallback;
    WS_ENCODER_GET_CONTENT_TYPE_CALLBACK encoderGetContentTypeCallback;
    WS_ENCODER_START_CALLBACK encoderStartCallback;
    WS_ENCODER_ENCODE_CALLBACK encoderEncodeCallback;
    WS_ENCODER_END_CALLBACK encoderEndCallback;
    WS_FREE_ENCODER_CALLBACK freeEncoderCallback;
} WS_CHANNEL_ENCODER;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WS_CHANNEL_ENCODER
{
    public IntPtr createContext;
    public IntPtr createEncoderCallback;
    public IntPtr encoderGetContentTypeCallback;
    public IntPtr encoderStartCallback;
    public IntPtr encoderEncodeCallback;
    public IntPtr encoderEndCallback;
    public IntPtr freeEncoderCallback;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WS_CHANNEL_ENCODER
    Public createContext As IntPtr
    Public createEncoderCallback As IntPtr
    Public encoderGetContentTypeCallback As IntPtr
    Public encoderStartCallback As IntPtr
    Public encoderEncodeCallback As IntPtr
    Public encoderEndCallback As IntPtr
    Public freeEncoderCallback As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class WS_CHANNEL_ENCODER(ctypes.Structure):
    _fields_ = [
        ("createContext", ctypes.c_void_p),
        ("createEncoderCallback", ctypes.c_void_p),
        ("encoderGetContentTypeCallback", ctypes.c_void_p),
        ("encoderStartCallback", ctypes.c_void_p),
        ("encoderEncodeCallback", ctypes.c_void_p),
        ("encoderEndCallback", ctypes.c_void_p),
        ("freeEncoderCallback", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct WS_CHANNEL_ENCODER {
    pub createContext: *mut core::ffi::c_void,
    pub createEncoderCallback: *mut core::ffi::c_void,
    pub encoderGetContentTypeCallback: *mut core::ffi::c_void,
    pub encoderStartCallback: *mut core::ffi::c_void,
    pub encoderEncodeCallback: *mut core::ffi::c_void,
    pub encoderEndCallback: *mut core::ffi::c_void,
    pub freeEncoderCallback: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type WS_CHANNEL_ENCODER struct {
	createContext uintptr
	createEncoderCallback uintptr
	encoderGetContentTypeCallback uintptr
	encoderStartCallback uintptr
	encoderEncodeCallback uintptr
	encoderEndCallback uintptr
	freeEncoderCallback uintptr
}
type
  WS_CHANNEL_ENCODER = record
    createContext: Pointer;
    createEncoderCallback: Pointer;
    encoderGetContentTypeCallback: Pointer;
    encoderStartCallback: Pointer;
    encoderEncodeCallback: Pointer;
    encoderEndCallback: Pointer;
    freeEncoderCallback: Pointer;
  end;
const WS_CHANNEL_ENCODER = extern struct {
    createContext: ?*anyopaque,
    createEncoderCallback: ?*anyopaque,
    encoderGetContentTypeCallback: ?*anyopaque,
    encoderStartCallback: ?*anyopaque,
    encoderEncodeCallback: ?*anyopaque,
    encoderEndCallback: ?*anyopaque,
    freeEncoderCallback: ?*anyopaque,
};
type
  WS_CHANNEL_ENCODER {.bycopy.} = object
    createContext: pointer
    createEncoderCallback: pointer
    encoderGetContentTypeCallback: pointer
    encoderStartCallback: pointer
    encoderEncodeCallback: pointer
    encoderEndCallback: pointer
    freeEncoderCallback: pointer
struct WS_CHANNEL_ENCODER
{
    void* createContext;
    void* createEncoderCallback;
    void* encoderGetContentTypeCallback;
    void* encoderStartCallback;
    void* encoderEncodeCallback;
    void* encoderEndCallback;
    void* freeEncoderCallback;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WS_CHANNEL_ENCODER サイズ: 28 バイト(x86)
dim st, 7    ; 4byte整数×7(構造体サイズ 28 / 4 切り上げ)
; createContext : void* (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; createEncoderCallback : WS_CREATE_ENCODER_CALLBACK (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; encoderGetContentTypeCallback : WS_ENCODER_GET_CONTENT_TYPE_CALLBACK (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; encoderStartCallback : WS_ENCODER_START_CALLBACK (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; encoderEncodeCallback : WS_ENCODER_ENCODE_CALLBACK (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; encoderEndCallback : WS_ENCODER_END_CALLBACK (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; freeEncoderCallback : WS_FREE_ENCODER_CALLBACK (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WS_CHANNEL_ENCODER サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; createContext : void* (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; createEncoderCallback : WS_CREATE_ENCODER_CALLBACK (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; encoderGetContentTypeCallback : WS_ENCODER_GET_CONTENT_TYPE_CALLBACK (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; encoderStartCallback : WS_ENCODER_START_CALLBACK (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; encoderEncodeCallback : WS_ENCODER_ENCODE_CALLBACK (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; encoderEndCallback : WS_ENCODER_END_CALLBACK (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; freeEncoderCallback : WS_FREE_ENCODER_CALLBACK (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WS_CHANNEL_ENCODER
    #field intptr createContext
    #field intptr createEncoderCallback
    #field intptr encoderGetContentTypeCallback
    #field intptr encoderStartCallback
    #field intptr encoderEncodeCallback
    #field intptr encoderEndCallback
    #field intptr freeEncoderCallback
#endstruct

stdim st, WS_CHANNEL_ENCODER        ; NSTRUCT 変数を確保