ホーム › Devices.Communication › SetCommState
SetCommState
関数通信デバイスの制御設定をDCB構造体に従って設定する。
シグネチャ
// KERNEL32.dll
#include <windows.h>
BOOL SetCommState(
HANDLE hFile,
DCB* lpDCB
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| hFile | HANDLE | in | 通信デバイスへのハンドル。このハンドルは CreateFile 関数が返します。 |
| lpDCB | DCB* | in | 指定した通信デバイスの構成情報を格納した DCB 構造体へのポインター。 |
戻り値の型: BOOL
公式ドキュメント
デバイス制御ブロック (DCB 構造体) に指定された内容に従って、通信デバイスを構成します。この関数はすべてのハードウェア設定と制御設定を再初期化しますが、出力キューや入力キューを空にすることはありません。
戻り値
関数が成功した場合、戻り値は 0 以外の値です。
関数が失敗した場合、戻り値は 0 です。拡張エラー情報を取得するには、 GetLastError を呼び出します。
解説(Remarks)
SetCommState 関数は、 DCB 構造体を使用して目的の構成を指定します。現在の構成は GetCommState 関数が返します。
DCB 構造体の一部のメンバーだけを設定する場合は、 GetCommState の呼び出しによって値が設定された DCB 構造体を変更してください。これにより、 DCB 構造体の他のメンバーに適切な値が設定されます。
SetCommState 関数は、 DCB 構造体の XonChar メンバーが XoffChar メンバーと等しい場合には失敗します。
SetCommState を使用して 8250 を構成する場合、 DCB 構造体の ByteSize メンバーと StopBits メンバーの値には次の制限が適用されます。
データビット数は 5 ~ 8 ビットでなければなりません。
例
例については、 通信リソースの構成 を参照してください。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// KERNEL32.dll
#include <windows.h>
BOOL SetCommState(
HANDLE hFile,
DCB* lpDCB
);[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool SetCommState(
IntPtr hFile, // HANDLE
IntPtr lpDCB // DCB*
);<DllImport("KERNEL32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function SetCommState(
hFile As IntPtr, ' HANDLE
lpDCB As IntPtr ' DCB*
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function' hFile : HANDLE
' lpDCB : DCB*
Declare PtrSafe Function SetCommState Lib "kernel32" ( _
ByVal hFile As LongPtr, _
ByVal lpDCB As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
SetCommState = ctypes.windll.kernel32.SetCommState
SetCommState.restype = wintypes.BOOL
SetCommState.argtypes = [
wintypes.HANDLE, # hFile : HANDLE
ctypes.c_void_p, # lpDCB : DCB*
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('KERNEL32.dll')
SetCommState = Fiddle::Function.new(
lib['SetCommState'],
[
Fiddle::TYPE_VOIDP, # hFile : HANDLE
Fiddle::TYPE_VOIDP, # lpDCB : DCB*
],
Fiddle::TYPE_INT)#[link(name = "kernel32")]
extern "system" {
fn SetCommState(
hFile: *mut core::ffi::c_void, // HANDLE
lpDCB: *mut DCB // DCB*
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true)]
public static extern bool SetCommState(IntPtr hFile, IntPtr lpDCB);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_SetCommState' -Namespace Win32 -PassThru
# $api::SetCommState(hFile, lpDCB)#uselib "KERNEL32.dll"
#func global SetCommState "SetCommState" sptr, sptr
; SetCommState hFile, varptr(lpDCB) ; 戻り値は stat
; hFile : HANDLE -> "sptr"
; lpDCB : DCB* -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。出力引数:
#uselib "KERNEL32.dll" #cfunc global SetCommState "SetCommState" sptr, var ; res = SetCommState(hFile, lpDCB) ; hFile : HANDLE -> "sptr" ; lpDCB : DCB* -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "KERNEL32.dll" #cfunc global SetCommState "SetCommState" sptr, sptr ; res = SetCommState(hFile, varptr(lpDCB)) ; hFile : HANDLE -> "sptr" ; lpDCB : DCB* -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
出力引数:
; BOOL SetCommState(HANDLE hFile, DCB* lpDCB) #uselib "KERNEL32.dll" #cfunc global SetCommState "SetCommState" intptr, var ; res = SetCommState(hFile, lpDCB) ; hFile : HANDLE -> "intptr" ; lpDCB : DCB* -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; BOOL SetCommState(HANDLE hFile, DCB* lpDCB) #uselib "KERNEL32.dll" #cfunc global SetCommState "SetCommState" intptr, intptr ; res = SetCommState(hFile, varptr(lpDCB)) ; hFile : HANDLE -> "intptr" ; lpDCB : DCB* -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
procSetCommState = kernel32.NewProc("SetCommState")
)
// hFile (HANDLE), lpDCB (DCB*)
r1, _, err := procSetCommState.Call(
uintptr(hFile),
uintptr(lpDCB),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // BOOLfunction SetCommState(
hFile: THandle; // HANDLE
lpDCB: Pointer // DCB*
): BOOL; stdcall;
external 'KERNEL32.dll' name 'SetCommState';result := DllCall("KERNEL32\SetCommState"
, "Ptr", hFile ; HANDLE
, "Ptr", lpDCB ; DCB*
, "Int") ; return: BOOL●SetCommState(hFile, lpDCB) = DLL("KERNEL32.dll", "bool SetCommState(void*, void*)")
# 呼び出し: SetCommState(hFile, lpDCB)
# hFile : HANDLE -> "void*"
# lpDCB : DCB* -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "kernel32" fn SetCommState(
hFile: ?*anyopaque, // HANDLE
lpDCB: [*c]DCB // DCB*
) callconv(std.os.windows.WINAPI) i32;proc SetCommState(
hFile: pointer, # HANDLE
lpDCB: ptr DCB # DCB*
): int32 {.importc: "SetCommState", stdcall, dynlib: "KERNEL32.dll".}pragma(lib, "kernel32");
extern(Windows)
int SetCommState(
void* hFile, // HANDLE
DCB* lpDCB // DCB*
);ccall((:SetCommState, "KERNEL32.dll"), stdcall, Int32,
(Ptr{Cvoid}, Ptr{DCB}),
hFile, lpDCB)
# hFile : HANDLE -> Ptr{Cvoid}
# lpDCB : DCB* -> Ptr{DCB}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t SetCommState(
void* hFile,
void* lpDCB);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.SetCommState(hFile, lpDCB)
-- hFile : HANDLE
-- lpDCB : DCB*
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const SetCommState = lib.func('__stdcall', 'SetCommState', 'int32_t', ['void *', 'void *']);
// SetCommState(hFile, lpDCB)
// hFile : HANDLE -> 'void *'
// lpDCB : DCB* -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("KERNEL32.dll", {
SetCommState: { parameters: ["pointer", "pointer"], result: "i32" },
});
// lib.symbols.SetCommState(hFile, lpDCB)
// hFile : HANDLE -> "pointer"
// lpDCB : DCB* -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t SetCommState(
void* hFile,
void* lpDCB);
C, "KERNEL32.dll");
// $ffi->SetCommState(hFile, lpDCB);
// hFile : HANDLE
// lpDCB : DCB*
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Kernel32 extends StdCallLibrary {
Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
boolean SetCommState(
Pointer hFile, // HANDLE
Pointer lpDCB // DCB*
);
}@[Link("kernel32")]
lib LibKERNEL32
fun SetCommState = SetCommState(
hFile : Void*, # HANDLE
lpDCB : DCB* # DCB*
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef SetCommStateNative = Int32 Function(Pointer<Void>, Pointer<Void>);
typedef SetCommStateDart = int Function(Pointer<Void>, Pointer<Void>);
final SetCommState = DynamicLibrary.open('KERNEL32.dll')
.lookupFunction<SetCommStateNative, SetCommStateDart>('SetCommState');
// hFile : HANDLE -> Pointer<Void>
// lpDCB : DCB* -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function SetCommState(
hFile: THandle; // HANDLE
lpDCB: Pointer // DCB*
): BOOL; stdcall;
external 'KERNEL32.dll' name 'SetCommState';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "SetCommState"
c_SetCommState :: Ptr () -> Ptr () -> IO CInt
-- hFile : HANDLE -> Ptr ()
-- lpDCB : DCB* -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let setcommstate =
foreign "SetCommState"
((ptr void) @-> (ptr void) @-> returning int32_t)
(* hFile : HANDLE -> (ptr void) *)
(* lpDCB : DCB* -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)
(cffi:defcfun ("SetCommState" set-comm-state :convention :stdcall) :int32
(h-file :pointer) ; HANDLE
(lp-dcb :pointer)) ; DCB*
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $SetCommState = Win32::API::More->new('KERNEL32',
'BOOL SetCommState(HANDLE hFile, LPVOID lpDCB)');
# my $ret = $SetCommState->Call($hFile, $lpDCB);
# hFile : HANDLE -> HANDLE
# lpDCB : DCB* -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
公式の関連項目
- f BuildCommDCBW — Unicode定義文字列を解析してDCB構造体を構築する。
- f CreateFileW — ファイルやデバイスを作成または開いてハンドルを返す。
- f GetCommState — 通信デバイスの現在の制御設定をDCB構造体に取得する。
使用する型