lineGetDevConfigA
関数シグネチャ
// TAPI32.dll (ANSI / -A)
#include <windows.h>
INT lineGetDevConfigA(
DWORD dwDeviceID,
VARSTRING* lpDeviceConfig,
LPCSTR lpszDeviceClass
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| dwDeviceID | DWORD | in | 構成の対象となる回線デバイスの識別子。 |
| lpDeviceConfig | VARSTRING* | inout | デバイス構成構造体が返される、型 VARSTRING のメモリ位置へのポインター。要求が正常に完了すると、この位置にデバイス構成が格納されます。 VARSTRING 構造体の dwStringFormat メンバーには STRINGFORMAT_BINARY が設定されます。 lineGetDevConfig を呼び出す前に、アプリケーションはこの構造体の dwTotalSize メンバーを設定し、TAPI が情報を返すために利用できるメモリ量を示す必要があります。 注意 構造体内のサイズ パラメーターが正しくない場合、データが上書きされる可能性があります。構造体のサイズの設定について詳しくは、
メモリの割り当てに関するトピックを参照してください。
|
| lpszDeviceClass | LPCSTR | in | 構成を取得する対象デバイスのデバイス クラスを指定する、null で終わる文字列へのポインター。有効なデバイス クラス文字列は、 lineGetID 関数に指定するものと同じです。 |
戻り値の型: INT
公式ドキュメント
lineGetDevConfig 関数は、"opaque" (不透明) なデータ構造体オブジェクトを返します。その内容は、回線 (サービス プロバイダー) とデバイス クラスに固有です。(lineGetDevConfigA)
戻り値
関数が成功した場合は 0 を、エラーが発生した場合は負のエラー番号を返します。返される可能性のある値は次のとおりです。
LINEERR_BADDEVICEID、LINEERR_NODRIVER、LINEERR_INVALDEVICECLASS、LINEERR_OPERATIONUNAVAIL、LINEERR_INVALPOINTER、LINEERR_RESOURCEUNAVAIL、LINEERR_STRUCTURETOOSMALL、LINEERR_OPERATIONFAILED、LINEERR_NOMEM、LINEERR_UNINITIALIZED、LINEERR_NODEVICE。
解説(Remarks)
通話の状態はデバイスに固有です。
lineGetDevConfig 関数を使用すると、特定の回線デバイスに関連付けられたメディア ストリーム デバイスの構成を指定するデータ構造体を TAPI から取得できます。たとえば、この構造体の内容には、回線に関連付けられた "datamodem" メディア デバイスのデータ レート、文字形式、変調方式、エラー制御プロトコルの設定を指定できます。
通常、アプリケーションは lineGetID を呼び出して回線に関連付けられたメディア ストリーム デバイスを特定し、続いて lineConfigDialog を呼び出して、ユーザーがデバイス構成を設定できるようにします。その後 lineGetDevConfig を呼び出し、構成情報を特定の通話先に関連付けて電話帳 (またはその他のデータベース) に保存できます。後でユーザーが同じ通話先に再度発信したい場合は、 lineSetDevConfig を使用して、ユーザーが選択した構成設定を復元できます。 lineSetDevConfig、 lineConfigDialog、 lineGetDevConfig の各関数をこの順序で使用すると、ユーザーが設定を表示して更新できるようになります。
構造体に含まれるデータの正確な形式は、回線およびメディア ストリーム API (デバイス クラス) に固有であり、文書化されておらず、未定義です。この関数が返す構造体は、アプリケーションが直接アクセスしたり操作したりすることはできません。そのままの状態で保存し、後で lineSetDevConfig で設定を復元するために使用することだけが可能です。また、この構造体は、同じデバイス クラスであっても、必ずしも他のデバイスに渡せるとは限りません (渡せる場合もありますが、保証されません)。
tapi.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして lineGetDevConfig を定義します。エンコードに依存しないこのエイリアスを、エンコードに依存するコードと混在させて使用すると、不一致が生じてコンパイル エラーまたは実行時エラーの原因となることがあります。詳しくは、関数プロトタイプの規則を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// TAPI32.dll (ANSI / -A)
#include <windows.h>
INT lineGetDevConfigA(
DWORD dwDeviceID,
VARSTRING* lpDeviceConfig,
LPCSTR lpszDeviceClass
);[DllImport("TAPI32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern int lineGetDevConfigA(
uint dwDeviceID, // DWORD
IntPtr lpDeviceConfig, // VARSTRING* in/out
[MarshalAs(UnmanagedType.LPStr)] string lpszDeviceClass // LPCSTR
);<DllImport("TAPI32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function lineGetDevConfigA(
dwDeviceID As UInteger, ' DWORD
lpDeviceConfig As IntPtr, ' VARSTRING* in/out
<MarshalAs(UnmanagedType.LPStr)> lpszDeviceClass As String ' LPCSTR
) As Integer
End Function' dwDeviceID : DWORD
' lpDeviceConfig : VARSTRING* in/out
' lpszDeviceClass : LPCSTR
Declare PtrSafe Function lineGetDevConfigA Lib "tapi32" ( _
ByVal dwDeviceID As Long, _
ByVal lpDeviceConfig As LongPtr, _
ByVal lpszDeviceClass As String) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
lineGetDevConfigA = ctypes.windll.tapi32.lineGetDevConfigA
lineGetDevConfigA.restype = ctypes.c_int
lineGetDevConfigA.argtypes = [
wintypes.DWORD, # dwDeviceID : DWORD
ctypes.c_void_p, # lpDeviceConfig : VARSTRING* in/out
wintypes.LPCSTR, # lpszDeviceClass : LPCSTR
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('TAPI32.dll')
lineGetDevConfigA = Fiddle::Function.new(
lib['lineGetDevConfigA'],
[
-Fiddle::TYPE_INT, # dwDeviceID : DWORD
Fiddle::TYPE_VOIDP, # lpDeviceConfig : VARSTRING* in/out
Fiddle::TYPE_VOIDP, # lpszDeviceClass : LPCSTR
],
Fiddle::TYPE_INT)#[link(name = "tapi32")]
extern "system" {
fn lineGetDevConfigA(
dwDeviceID: u32, // DWORD
lpDeviceConfig: *mut VARSTRING, // VARSTRING* in/out
lpszDeviceClass: *const u8 // LPCSTR
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("TAPI32.dll", CharSet = CharSet.Ansi)]
public static extern int lineGetDevConfigA(uint dwDeviceID, IntPtr lpDeviceConfig, [MarshalAs(UnmanagedType.LPStr)] string lpszDeviceClass);
"@
$api = Add-Type -MemberDefinition $sig -Name 'TAPI32_lineGetDevConfigA' -Namespace Win32 -PassThru
# $api::lineGetDevConfigA(dwDeviceID, lpDeviceConfig, lpszDeviceClass)#uselib "TAPI32.dll"
#func global lineGetDevConfigA "lineGetDevConfigA" sptr, sptr, sptr
; lineGetDevConfigA dwDeviceID, varptr(lpDeviceConfig), lpszDeviceClass ; 戻り値は stat
; dwDeviceID : DWORD -> "sptr"
; lpDeviceConfig : VARSTRING* in/out -> "sptr"
; lpszDeviceClass : LPCSTR -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "TAPI32.dll" #cfunc global lineGetDevConfigA "lineGetDevConfigA" int, var, str ; res = lineGetDevConfigA(dwDeviceID, lpDeviceConfig, lpszDeviceClass) ; dwDeviceID : DWORD -> "int" ; lpDeviceConfig : VARSTRING* in/out -> "var" ; lpszDeviceClass : LPCSTR -> "str" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "TAPI32.dll" #cfunc global lineGetDevConfigA "lineGetDevConfigA" int, sptr, str ; res = lineGetDevConfigA(dwDeviceID, varptr(lpDeviceConfig), lpszDeviceClass) ; dwDeviceID : DWORD -> "int" ; lpDeviceConfig : VARSTRING* in/out -> "sptr" ; lpszDeviceClass : LPCSTR -> "str" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; INT lineGetDevConfigA(DWORD dwDeviceID, VARSTRING* lpDeviceConfig, LPCSTR lpszDeviceClass) #uselib "TAPI32.dll" #cfunc global lineGetDevConfigA "lineGetDevConfigA" int, var, str ; res = lineGetDevConfigA(dwDeviceID, lpDeviceConfig, lpszDeviceClass) ; dwDeviceID : DWORD -> "int" ; lpDeviceConfig : VARSTRING* in/out -> "var" ; lpszDeviceClass : LPCSTR -> "str" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; INT lineGetDevConfigA(DWORD dwDeviceID, VARSTRING* lpDeviceConfig, LPCSTR lpszDeviceClass) #uselib "TAPI32.dll" #cfunc global lineGetDevConfigA "lineGetDevConfigA" int, intptr, str ; res = lineGetDevConfigA(dwDeviceID, varptr(lpDeviceConfig), lpszDeviceClass) ; dwDeviceID : DWORD -> "int" ; lpDeviceConfig : VARSTRING* in/out -> "intptr" ; lpszDeviceClass : LPCSTR -> "str" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
tapi32 = windows.NewLazySystemDLL("TAPI32.dll")
proclineGetDevConfigA = tapi32.NewProc("lineGetDevConfigA")
)
// dwDeviceID (DWORD), lpDeviceConfig (VARSTRING* in/out), lpszDeviceClass (LPCSTR)
r1, _, err := proclineGetDevConfigA.Call(
uintptr(dwDeviceID),
uintptr(lpDeviceConfig),
uintptr(unsafe.Pointer(windows.BytePtrFromString(lpszDeviceClass))),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // INTfunction lineGetDevConfigA(
dwDeviceID: DWORD; // DWORD
lpDeviceConfig: Pointer; // VARSTRING* in/out
lpszDeviceClass: PAnsiChar // LPCSTR
): Integer; stdcall;
external 'TAPI32.dll' name 'lineGetDevConfigA';result := DllCall("TAPI32\lineGetDevConfigA"
, "UInt", dwDeviceID ; DWORD
, "Ptr", lpDeviceConfig ; VARSTRING* in/out
, "AStr", lpszDeviceClass ; LPCSTR
, "Int") ; return: INT●lineGetDevConfigA(dwDeviceID, lpDeviceConfig, lpszDeviceClass) = DLL("TAPI32.dll", "int lineGetDevConfigA(dword, void*, char*)")
# 呼び出し: lineGetDevConfigA(dwDeviceID, lpDeviceConfig, lpszDeviceClass)
# dwDeviceID : DWORD -> "dword"
# lpDeviceConfig : VARSTRING* in/out -> "void*"
# lpszDeviceClass : LPCSTR -> "char*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "tapi32" fn lineGetDevConfigA(
dwDeviceID: u32, // DWORD
lpDeviceConfig: [*c]VARSTRING, // VARSTRING* in/out
lpszDeviceClass: [*c]const u8 // LPCSTR
) callconv(std.os.windows.WINAPI) i32;proc lineGetDevConfigA(
dwDeviceID: uint32, # DWORD
lpDeviceConfig: ptr VARSTRING, # VARSTRING* in/out
lpszDeviceClass: cstring # LPCSTR
): int32 {.importc: "lineGetDevConfigA", stdcall, dynlib: "TAPI32.dll".}pragma(lib, "tapi32");
extern(Windows)
int lineGetDevConfigA(
uint dwDeviceID, // DWORD
VARSTRING* lpDeviceConfig, // VARSTRING* in/out
const(char)* lpszDeviceClass // LPCSTR
);ccall((:lineGetDevConfigA, "TAPI32.dll"), stdcall, Int32,
(UInt32, Ptr{VARSTRING}, Cstring),
dwDeviceID, lpDeviceConfig, lpszDeviceClass)
# dwDeviceID : DWORD -> UInt32
# lpDeviceConfig : VARSTRING* in/out -> Ptr{VARSTRING}
# lpszDeviceClass : LPCSTR -> Cstring
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t lineGetDevConfigA(
uint32_t dwDeviceID,
void* lpDeviceConfig,
const char* lpszDeviceClass);
]]
local tapi32 = ffi.load("tapi32")
-- tapi32.lineGetDevConfigA(dwDeviceID, lpDeviceConfig, lpszDeviceClass)
-- dwDeviceID : DWORD
-- lpDeviceConfig : VARSTRING* in/out
-- lpszDeviceClass : LPCSTR
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('TAPI32.dll');
const lineGetDevConfigA = lib.func('__stdcall', 'lineGetDevConfigA', 'int32_t', ['uint32_t', 'void *', 'str']);
// lineGetDevConfigA(dwDeviceID, lpDeviceConfig, lpszDeviceClass)
// dwDeviceID : DWORD -> 'uint32_t'
// lpDeviceConfig : VARSTRING* in/out -> 'void *'
// lpszDeviceClass : LPCSTR -> 'str'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("TAPI32.dll", {
lineGetDevConfigA: { parameters: ["u32", "pointer", "buffer"], result: "i32" },
});
// lib.symbols.lineGetDevConfigA(dwDeviceID, lpDeviceConfig, lpszDeviceClass)
// dwDeviceID : DWORD -> "u32"
// lpDeviceConfig : VARSTRING* in/out -> "pointer"
// lpszDeviceClass : LPCSTR -> "buffer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t lineGetDevConfigA(
uint32_t dwDeviceID,
void* lpDeviceConfig,
const char* lpszDeviceClass);
C, "TAPI32.dll");
// $ffi->lineGetDevConfigA(dwDeviceID, lpDeviceConfig, lpszDeviceClass);
// dwDeviceID : DWORD
// lpDeviceConfig : VARSTRING* in/out
// lpszDeviceClass : LPCSTR
// 構造体/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 Tapi32 extends StdCallLibrary {
Tapi32 INSTANCE = Native.load("tapi32", Tapi32.class, W32APIOptions.ASCII_OPTIONS);
int lineGetDevConfigA(
int dwDeviceID, // DWORD
Pointer lpDeviceConfig, // VARSTRING* in/out
String lpszDeviceClass // LPCSTR
);
}@[Link("tapi32")]
lib LibTAPI32
fun lineGetDevConfigA = lineGetDevConfigA(
dwDeviceID : UInt32, # DWORD
lpDeviceConfig : VARSTRING*, # VARSTRING* in/out
lpszDeviceClass : UInt8* # LPCSTR
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef lineGetDevConfigANative = Int32 Function(Uint32, Pointer<Void>, Pointer<Utf8>);
typedef lineGetDevConfigADart = int Function(int, Pointer<Void>, Pointer<Utf8>);
final lineGetDevConfigA = DynamicLibrary.open('TAPI32.dll')
.lookupFunction<lineGetDevConfigANative, lineGetDevConfigADart>('lineGetDevConfigA');
// dwDeviceID : DWORD -> Uint32
// lpDeviceConfig : VARSTRING* in/out -> Pointer<Void>
// lpszDeviceClass : LPCSTR -> Pointer<Utf8>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function lineGetDevConfigA(
dwDeviceID: DWORD; // DWORD
lpDeviceConfig: Pointer; // VARSTRING* in/out
lpszDeviceClass: PAnsiChar // LPCSTR
): Integer; stdcall;
external 'TAPI32.dll' name 'lineGetDevConfigA';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "lineGetDevConfigA"
c_lineGetDevConfigA :: Word32 -> Ptr () -> CString -> IO Int32
-- dwDeviceID : DWORD -> Word32
-- lpDeviceConfig : VARSTRING* in/out -> Ptr ()
-- lpszDeviceClass : LPCSTR -> CString
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let linegetdevconfiga =
foreign "lineGetDevConfigA"
(uint32_t @-> (ptr void) @-> string @-> returning int32_t)
(* dwDeviceID : DWORD -> uint32_t *)
(* lpDeviceConfig : VARSTRING* in/out -> (ptr void) *)
(* lpszDeviceClass : LPCSTR -> string *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library tapi32 (t "TAPI32.dll"))
(cffi:use-foreign-library tapi32)
(cffi:defcfun ("lineGetDevConfigA" line-get-dev-config-a :convention :stdcall) :int32
(dw-device-id :uint32) ; DWORD
(lp-device-config :pointer) ; VARSTRING* in/out
(lpsz-device-class :string)) ; LPCSTR
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $lineGetDevConfigA = Win32::API::More->new('TAPI32',
'int lineGetDevConfigA(DWORD dwDeviceID, LPVOID lpDeviceConfig, LPCSTR lpszDeviceClass)');
# my $ret = $lineGetDevConfigA->Call($dwDeviceID, $lpDeviceConfig, $lpszDeviceClass);
# dwDeviceID : DWORD -> DWORD
# lpDeviceConfig : VARSTRING* in/out -> LPVOID
# lpszDeviceClass : LPCSTR -> LPCSTR
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f lineGetDevConfigW (Unicode版) — 回線デバイスのメディア構成情報を取得する(Unicode版)。
- f lineConfigDialogA — 回線デバイスの構成用ダイアログを表示する(ANSI版)。
- f lineGetIDA — 回線等に関連するデバイス識別子を取得する(ANSI版)。
- f lineSetDevConfigA — 回線デバイスの構成情報をANSI文字列で設定する。