Win32 API 日本語リファレンス
ホーム › NetworkManagement.Rras › MgmAddGroupMembershipEntry

MgmAddGroupMembershipEntry

関数
マルチキャストグループメンバーシップエントリを追加する。
DLLrtm.dll呼出規約winapi対応OSwindowsserver2000

シグネチャ

// rtm.dll
#include <windows.h>

DWORD MgmAddGroupMembershipEntry(
    HANDLE hProtocol,
    DWORD dwSourceAddr,
    DWORD dwSourceMask,
    DWORD dwGroupAddr,
    DWORD dwGroupMask,
    DWORD dwIfIndex,
    DWORD dwIfNextHopIPAddr,
    DWORD dwFlags
);

パラメーター

名前型方向説明
hProtocolHANDLEin以前の MgmRegisterMProtocol の呼び出しで取得したプロトコルのハンドル。
dwSourceAddrDWORDin

マルチキャストデータを受信する送信元アドレスを指定します。すべての送信元からデータを受信する場合 (グループに対するワイルドカード受信者) はゼロを指定します。それ以外の場合は、送信元または送信元ネットワークの IP アドレスを指定します。

送信元アドレスの範囲を指定するには、dwSourceAddr で送信元ネットワークを指定し、dwSourceMask でサブネットマスクを指定します。

dwSourceMaskDWORDin

dwSourceAddr に対応するサブネットマスクを指定します。dwSourceAddr パラメーターと dwSourceMask パラメーターは、マルチキャストデータを受信する送信元の範囲を定義するために組み合わせて使用されます。

dwSourceAddr にゼロを指定した場合 (ワイルドカード受信者) は、このパラメーターにもゼロを指定します。

dwGroupAddrDWORDin

データを受信するマルチキャストグループを指定します。すべてのグループを受信する場合 (ワイルドカード受信者) はゼロを指定します。それ以外の場合は、グループの IP アドレスを指定します。

グループアドレスの範囲を指定するには、dwGroupAddr でグループアドレスを指定し、dwGroupMask でサブネットマスクを指定します。

dwGroupMaskDWORDin

dwGroupAddr に対応するサブネットマスクを指定します。dwGroupAddr パラメーターと dwGroupMask パラメーターは、マルチキャストグループの範囲を定義するために組み合わせて使用されます。

dwGroupAddr にゼロを指定した場合 (ワイルドカード受信者) は、このパラメーターにもゼロを指定します。

dwIfIndexDWORDinグループメンバーシップを追加するインターフェイスを指定します。指定したグループのマルチキャストデータは、このインターフェイスから転送されます。
dwIfNextHopIPAddrDWORDin

dwIfIndex で指定したインデックスに対応するネクストホップのアドレスを指定します。dwIfIndex パラメーターと dwIfNextHopIPAddr パラメーターは、ポイントツーマルチポイントインターフェイス上のネクストホップを一意に識別します。ポイントツーマルチポイントインターフェイスとは、1 つのインターフェイスが複数のネットワークに接続する接続形態です。ポイントツーマルチポイントインターフェイスの例としては、非ブロードキャストマルチアクセス (NBMA) インターフェイスや、すべてのダイヤルアップクライアントが接続する内部インターフェイスがあります。

dwIfIndex の値だけで識別されるブロードキャストインターフェイス (イーサネットインターフェイスなど) やポイントツーポイントインターフェイスの場合は、ゼロを指定します。

dwFlagsDWORDin

グループメンバーシップの追加時に実行する追加の処理を指定します。有効な値は次のとおりです。

値 意味
MGM_JOIN_STATE_FLAG
指定した送信元とグループに対するグループメンバーシップを追加します。指定した送信元とグループに対応する転送エントリを、このグループメンバーシップの変更が反映されるように更新します。
MGM_FORWARD_STATE
指定した送信元とグループに対応する転送エントリの送信インターフェイスの一覧に、指定したインターフェイスを追加します。

戻り値の型: DWORD

公式ドキュメント

MgmAddGroupMembershipEntry 関数は、指定したインターフェイス上に指定したグループの新しい受信者が存在することをマルチキャストグループマネージャーに通知します。

戻り値

関数が成功した場合、戻り値は NO_ERROR です。

関数が失敗した場合、戻り値は次のエラーコードのいずれかです。

値 意味
ERROR_CAN_NOT_COMPLETE
この関数の呼び出しを完了できませんでした。
ERROR_INVALID_PARAMETER
プロトコルのハンドルが無効です。
ERROR_NOT_ENOUGH_MEMORY
この操作を完了するためのメモリーが不足しています。

解説(Remarks)

このバージョンの MGM API は、ワイルドカードの送信元または特定の送信元のみをサポートしており、送信元の範囲指定はサポートしていません。同じ制限がグループにも適用され、グループの範囲指定は許可されません。

この関数が呼び出されると、マルチキャストグループマネージャーは PMGM_JOIN_ALERT_CALLBACK コールバックを呼び出して、指定されたグループの新しい受信者が存在することを他のルーティングプロトコルに通知する場合があります。

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

各言語での呼び出し定義

// rtm.dll
#include <windows.h>

DWORD MgmAddGroupMembershipEntry(
    HANDLE hProtocol,
    DWORD dwSourceAddr,
    DWORD dwSourceMask,
    DWORD dwGroupAddr,
    DWORD dwGroupMask,
    DWORD dwIfIndex,
    DWORD dwIfNextHopIPAddr,
    DWORD dwFlags
);
[DllImport("rtm.dll", ExactSpelling = true)]
static extern uint MgmAddGroupMembershipEntry(
    IntPtr hProtocol,   // HANDLE
    uint dwSourceAddr,   // DWORD
    uint dwSourceMask,   // DWORD
    uint dwGroupAddr,   // DWORD
    uint dwGroupMask,   // DWORD
    uint dwIfIndex,   // DWORD
    uint dwIfNextHopIPAddr,   // DWORD
    uint dwFlags   // DWORD
);
<DllImport("rtm.dll", ExactSpelling:=True)>
Public Shared Function MgmAddGroupMembershipEntry(
    hProtocol As IntPtr,   ' HANDLE
    dwSourceAddr As UInteger,   ' DWORD
    dwSourceMask As UInteger,   ' DWORD
    dwGroupAddr As UInteger,   ' DWORD
    dwGroupMask As UInteger,   ' DWORD
    dwIfIndex As UInteger,   ' DWORD
    dwIfNextHopIPAddr As UInteger,   ' DWORD
    dwFlags As UInteger   ' DWORD
) As UInteger
End Function
' hProtocol : HANDLE
' dwSourceAddr : DWORD
' dwSourceMask : DWORD
' dwGroupAddr : DWORD
' dwGroupMask : DWORD
' dwIfIndex : DWORD
' dwIfNextHopIPAddr : DWORD
' dwFlags : DWORD
Declare PtrSafe Function MgmAddGroupMembershipEntry Lib "rtm" ( _
    ByVal hProtocol As LongPtr, _
    ByVal dwSourceAddr As Long, _
    ByVal dwSourceMask As Long, _
    ByVal dwGroupAddr As Long, _
    ByVal dwGroupMask As Long, _
    ByVal dwIfIndex As Long, _
    ByVal dwIfNextHopIPAddr As Long, _
    ByVal dwFlags As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

MgmAddGroupMembershipEntry = ctypes.windll.rtm.MgmAddGroupMembershipEntry
MgmAddGroupMembershipEntry.restype = wintypes.DWORD
MgmAddGroupMembershipEntry.argtypes = [
    wintypes.HANDLE,  # hProtocol : HANDLE
    wintypes.DWORD,  # dwSourceAddr : DWORD
    wintypes.DWORD,  # dwSourceMask : DWORD
    wintypes.DWORD,  # dwGroupAddr : DWORD
    wintypes.DWORD,  # dwGroupMask : DWORD
    wintypes.DWORD,  # dwIfIndex : DWORD
    wintypes.DWORD,  # dwIfNextHopIPAddr : DWORD
    wintypes.DWORD,  # dwFlags : DWORD
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('rtm.dll')
MgmAddGroupMembershipEntry = Fiddle::Function.new(
  lib['MgmAddGroupMembershipEntry'],
  [
    Fiddle::TYPE_VOIDP,  # hProtocol : HANDLE
    -Fiddle::TYPE_INT,  # dwSourceAddr : DWORD
    -Fiddle::TYPE_INT,  # dwSourceMask : DWORD
    -Fiddle::TYPE_INT,  # dwGroupAddr : DWORD
    -Fiddle::TYPE_INT,  # dwGroupMask : DWORD
    -Fiddle::TYPE_INT,  # dwIfIndex : DWORD
    -Fiddle::TYPE_INT,  # dwIfNextHopIPAddr : DWORD
    -Fiddle::TYPE_INT,  # dwFlags : DWORD
  ],
  -Fiddle::TYPE_INT)
#[link(name = "rtm")]
extern "system" {
    fn MgmAddGroupMembershipEntry(
        hProtocol: *mut core::ffi::c_void,  // HANDLE
        dwSourceAddr: u32,  // DWORD
        dwSourceMask: u32,  // DWORD
        dwGroupAddr: u32,  // DWORD
        dwGroupMask: u32,  // DWORD
        dwIfIndex: u32,  // DWORD
        dwIfNextHopIPAddr: u32,  // DWORD
        dwFlags: u32  // DWORD
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("rtm.dll")]
public static extern uint MgmAddGroupMembershipEntry(IntPtr hProtocol, uint dwSourceAddr, uint dwSourceMask, uint dwGroupAddr, uint dwGroupMask, uint dwIfIndex, uint dwIfNextHopIPAddr, uint dwFlags);
"@
$api = Add-Type -MemberDefinition $sig -Name 'rtm_MgmAddGroupMembershipEntry' -Namespace Win32 -PassThru
# $api::MgmAddGroupMembershipEntry(hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags)
#uselib "rtm.dll"
#func global MgmAddGroupMembershipEntry "MgmAddGroupMembershipEntry" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; MgmAddGroupMembershipEntry hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags   ; 戻り値は stat
; hProtocol : HANDLE -> "sptr"
; dwSourceAddr : DWORD -> "sptr"
; dwSourceMask : DWORD -> "sptr"
; dwGroupAddr : DWORD -> "sptr"
; dwGroupMask : DWORD -> "sptr"
; dwIfIndex : DWORD -> "sptr"
; dwIfNextHopIPAddr : DWORD -> "sptr"
; dwFlags : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "rtm.dll"
#cfunc global MgmAddGroupMembershipEntry "MgmAddGroupMembershipEntry" sptr, int, int, int, int, int, int, int
; res = MgmAddGroupMembershipEntry(hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags)
; hProtocol : HANDLE -> "sptr"
; dwSourceAddr : DWORD -> "int"
; dwSourceMask : DWORD -> "int"
; dwGroupAddr : DWORD -> "int"
; dwGroupMask : DWORD -> "int"
; dwIfIndex : DWORD -> "int"
; dwIfNextHopIPAddr : DWORD -> "int"
; dwFlags : DWORD -> "int"
; DWORD MgmAddGroupMembershipEntry(HANDLE hProtocol, DWORD dwSourceAddr, DWORD dwSourceMask, DWORD dwGroupAddr, DWORD dwGroupMask, DWORD dwIfIndex, DWORD dwIfNextHopIPAddr, DWORD dwFlags)
#uselib "rtm.dll"
#cfunc global MgmAddGroupMembershipEntry "MgmAddGroupMembershipEntry" intptr, int, int, int, int, int, int, int
; res = MgmAddGroupMembershipEntry(hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags)
; hProtocol : HANDLE -> "intptr"
; dwSourceAddr : DWORD -> "int"
; dwSourceMask : DWORD -> "int"
; dwGroupAddr : DWORD -> "int"
; dwGroupMask : DWORD -> "int"
; dwIfIndex : DWORD -> "int"
; dwIfNextHopIPAddr : DWORD -> "int"
; dwFlags : DWORD -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	rtm = windows.NewLazySystemDLL("rtm.dll")
	procMgmAddGroupMembershipEntry = rtm.NewProc("MgmAddGroupMembershipEntry")
)

// hProtocol (HANDLE), dwSourceAddr (DWORD), dwSourceMask (DWORD), dwGroupAddr (DWORD), dwGroupMask (DWORD), dwIfIndex (DWORD), dwIfNextHopIPAddr (DWORD), dwFlags (DWORD)
r1, _, err := procMgmAddGroupMembershipEntry.Call(
	uintptr(hProtocol),
	uintptr(dwSourceAddr),
	uintptr(dwSourceMask),
	uintptr(dwGroupAddr),
	uintptr(dwGroupMask),
	uintptr(dwIfIndex),
	uintptr(dwIfNextHopIPAddr),
	uintptr(dwFlags),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function MgmAddGroupMembershipEntry(
  hProtocol: THandle;   // HANDLE
  dwSourceAddr: DWORD;   // DWORD
  dwSourceMask: DWORD;   // DWORD
  dwGroupAddr: DWORD;   // DWORD
  dwGroupMask: DWORD;   // DWORD
  dwIfIndex: DWORD;   // DWORD
  dwIfNextHopIPAddr: DWORD;   // DWORD
  dwFlags: DWORD   // DWORD
): DWORD; stdcall;
  external 'rtm.dll' name 'MgmAddGroupMembershipEntry';
result := DllCall("rtm\MgmAddGroupMembershipEntry"
    , "Ptr", hProtocol   ; HANDLE
    , "UInt", dwSourceAddr   ; DWORD
    , "UInt", dwSourceMask   ; DWORD
    , "UInt", dwGroupAddr   ; DWORD
    , "UInt", dwGroupMask   ; DWORD
    , "UInt", dwIfIndex   ; DWORD
    , "UInt", dwIfNextHopIPAddr   ; DWORD
    , "UInt", dwFlags   ; DWORD
    , "UInt")   ; return: DWORD
●MgmAddGroupMembershipEntry(hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags) = DLL("rtm.dll", "dword MgmAddGroupMembershipEntry(void*, dword, dword, dword, dword, dword, dword, dword)")
# 呼び出し: MgmAddGroupMembershipEntry(hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags)
# hProtocol : HANDLE -> "void*"
# dwSourceAddr : DWORD -> "dword"
# dwSourceMask : DWORD -> "dword"
# dwGroupAddr : DWORD -> "dword"
# dwGroupMask : DWORD -> "dword"
# dwIfIndex : DWORD -> "dword"
# dwIfNextHopIPAddr : DWORD -> "dword"
# dwFlags : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "rtm" fn MgmAddGroupMembershipEntry(
    hProtocol: ?*anyopaque, // HANDLE
    dwSourceAddr: u32, // DWORD
    dwSourceMask: u32, // DWORD
    dwGroupAddr: u32, // DWORD
    dwGroupMask: u32, // DWORD
    dwIfIndex: u32, // DWORD
    dwIfNextHopIPAddr: u32, // DWORD
    dwFlags: u32 // DWORD
) callconv(std.os.windows.WINAPI) u32;
proc MgmAddGroupMembershipEntry(
    hProtocol: pointer,  # HANDLE
    dwSourceAddr: uint32,  # DWORD
    dwSourceMask: uint32,  # DWORD
    dwGroupAddr: uint32,  # DWORD
    dwGroupMask: uint32,  # DWORD
    dwIfIndex: uint32,  # DWORD
    dwIfNextHopIPAddr: uint32,  # DWORD
    dwFlags: uint32  # DWORD
): uint32 {.importc: "MgmAddGroupMembershipEntry", stdcall, dynlib: "rtm.dll".}
pragma(lib, "rtm");
extern(Windows)
uint MgmAddGroupMembershipEntry(
    void* hProtocol,   // HANDLE
    uint dwSourceAddr,   // DWORD
    uint dwSourceMask,   // DWORD
    uint dwGroupAddr,   // DWORD
    uint dwGroupMask,   // DWORD
    uint dwIfIndex,   // DWORD
    uint dwIfNextHopIPAddr,   // DWORD
    uint dwFlags   // DWORD
);
ccall((:MgmAddGroupMembershipEntry, "rtm.dll"), stdcall, UInt32,
      (Ptr{Cvoid}, UInt32, UInt32, UInt32, UInt32, UInt32, UInt32, UInt32),
      hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags)
# hProtocol : HANDLE -> Ptr{Cvoid}
# dwSourceAddr : DWORD -> UInt32
# dwSourceMask : DWORD -> UInt32
# dwGroupAddr : DWORD -> UInt32
# dwGroupMask : DWORD -> UInt32
# dwIfIndex : DWORD -> UInt32
# dwIfNextHopIPAddr : DWORD -> UInt32
# dwFlags : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t MgmAddGroupMembershipEntry(
    void* hProtocol,
    uint32_t dwSourceAddr,
    uint32_t dwSourceMask,
    uint32_t dwGroupAddr,
    uint32_t dwGroupMask,
    uint32_t dwIfIndex,
    uint32_t dwIfNextHopIPAddr,
    uint32_t dwFlags);
]]
local rtm = ffi.load("rtm")
-- rtm.MgmAddGroupMembershipEntry(hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags)
-- hProtocol : HANDLE
-- dwSourceAddr : DWORD
-- dwSourceMask : DWORD
-- dwGroupAddr : DWORD
-- dwGroupMask : DWORD
-- dwIfIndex : DWORD
-- dwIfNextHopIPAddr : DWORD
-- dwFlags : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('rtm.dll');
const MgmAddGroupMembershipEntry = lib.func('__stdcall', 'MgmAddGroupMembershipEntry', 'uint32_t', ['void *', 'uint32_t', 'uint32_t', 'uint32_t', 'uint32_t', 'uint32_t', 'uint32_t', 'uint32_t']);
// MgmAddGroupMembershipEntry(hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags)
// hProtocol : HANDLE -> 'void *'
// dwSourceAddr : DWORD -> 'uint32_t'
// dwSourceMask : DWORD -> 'uint32_t'
// dwGroupAddr : DWORD -> 'uint32_t'
// dwGroupMask : DWORD -> 'uint32_t'
// dwIfIndex : DWORD -> 'uint32_t'
// dwIfNextHopIPAddr : DWORD -> 'uint32_t'
// dwFlags : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("rtm.dll", {
  MgmAddGroupMembershipEntry: { parameters: ["pointer", "u32", "u32", "u32", "u32", "u32", "u32", "u32"], result: "u32" },
});
// lib.symbols.MgmAddGroupMembershipEntry(hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags)
// hProtocol : HANDLE -> "pointer"
// dwSourceAddr : DWORD -> "u32"
// dwSourceMask : DWORD -> "u32"
// dwGroupAddr : DWORD -> "u32"
// dwGroupMask : DWORD -> "u32"
// dwIfIndex : DWORD -> "u32"
// dwIfNextHopIPAddr : DWORD -> "u32"
// dwFlags : DWORD -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t MgmAddGroupMembershipEntry(
    void* hProtocol,
    uint32_t dwSourceAddr,
    uint32_t dwSourceMask,
    uint32_t dwGroupAddr,
    uint32_t dwGroupMask,
    uint32_t dwIfIndex,
    uint32_t dwIfNextHopIPAddr,
    uint32_t dwFlags);
C, "rtm.dll");
// $ffi->MgmAddGroupMembershipEntry(hProtocol, dwSourceAddr, dwSourceMask, dwGroupAddr, dwGroupMask, dwIfIndex, dwIfNextHopIPAddr, dwFlags);
// hProtocol : HANDLE
// dwSourceAddr : DWORD
// dwSourceMask : DWORD
// dwGroupAddr : DWORD
// dwGroupMask : DWORD
// dwIfIndex : DWORD
// dwIfNextHopIPAddr : DWORD
// dwFlags : DWORD
// 構造体/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 Rtm extends StdCallLibrary {
    Rtm INSTANCE = Native.load("rtm", Rtm.class);
    int MgmAddGroupMembershipEntry(
        Pointer hProtocol,   // HANDLE
        int dwSourceAddr,   // DWORD
        int dwSourceMask,   // DWORD
        int dwGroupAddr,   // DWORD
        int dwGroupMask,   // DWORD
        int dwIfIndex,   // DWORD
        int dwIfNextHopIPAddr,   // DWORD
        int dwFlags   // DWORD
    );
}
@[Link("rtm")]
lib Librtm
  fun MgmAddGroupMembershipEntry = MgmAddGroupMembershipEntry(
    hProtocol : Void*,   # HANDLE
    dwSourceAddr : UInt32,   # DWORD
    dwSourceMask : UInt32,   # DWORD
    dwGroupAddr : UInt32,   # DWORD
    dwGroupMask : UInt32,   # DWORD
    dwIfIndex : UInt32,   # DWORD
    dwIfNextHopIPAddr : UInt32,   # DWORD
    dwFlags : UInt32   # DWORD
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef MgmAddGroupMembershipEntryNative = Uint32 Function(Pointer<Void>, Uint32, Uint32, Uint32, Uint32, Uint32, Uint32, Uint32);
typedef MgmAddGroupMembershipEntryDart = int Function(Pointer<Void>, int, int, int, int, int, int, int);
final MgmAddGroupMembershipEntry = DynamicLibrary.open('rtm.dll')
    .lookupFunction<MgmAddGroupMembershipEntryNative, MgmAddGroupMembershipEntryDart>('MgmAddGroupMembershipEntry');
// hProtocol : HANDLE -> Pointer<Void>
// dwSourceAddr : DWORD -> Uint32
// dwSourceMask : DWORD -> Uint32
// dwGroupAddr : DWORD -> Uint32
// dwGroupMask : DWORD -> Uint32
// dwIfIndex : DWORD -> Uint32
// dwIfNextHopIPAddr : DWORD -> Uint32
// dwFlags : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function MgmAddGroupMembershipEntry(
  hProtocol: THandle;   // HANDLE
  dwSourceAddr: DWORD;   // DWORD
  dwSourceMask: DWORD;   // DWORD
  dwGroupAddr: DWORD;   // DWORD
  dwGroupMask: DWORD;   // DWORD
  dwIfIndex: DWORD;   // DWORD
  dwIfNextHopIPAddr: DWORD;   // DWORD
  dwFlags: DWORD   // DWORD
): DWORD; stdcall;
  external 'rtm.dll' name 'MgmAddGroupMembershipEntry';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "MgmAddGroupMembershipEntry"
  c_MgmAddGroupMembershipEntry :: Ptr () -> Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> IO Word32
-- hProtocol : HANDLE -> Ptr ()
-- dwSourceAddr : DWORD -> Word32
-- dwSourceMask : DWORD -> Word32
-- dwGroupAddr : DWORD -> Word32
-- dwGroupMask : DWORD -> Word32
-- dwIfIndex : DWORD -> Word32
-- dwIfNextHopIPAddr : DWORD -> Word32
-- dwFlags : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let mgmaddgroupmembershipentry =
  foreign "MgmAddGroupMembershipEntry"
    ((ptr void) @-> uint32_t @-> uint32_t @-> uint32_t @-> uint32_t @-> uint32_t @-> uint32_t @-> uint32_t @-> returning uint32_t)
(* hProtocol : HANDLE -> (ptr void) *)
(* dwSourceAddr : DWORD -> uint32_t *)
(* dwSourceMask : DWORD -> uint32_t *)
(* dwGroupAddr : DWORD -> uint32_t *)
(* dwGroupMask : DWORD -> uint32_t *)
(* dwIfIndex : DWORD -> uint32_t *)
(* dwIfNextHopIPAddr : DWORD -> uint32_t *)
(* dwFlags : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library rtm (t "rtm.dll"))
(cffi:use-foreign-library rtm)

(cffi:defcfun ("MgmAddGroupMembershipEntry" mgm-add-group-membership-entry :convention :stdcall) :uint32
  (h-protocol :pointer)   ; HANDLE
  (dw-source-addr :uint32)   ; DWORD
  (dw-source-mask :uint32)   ; DWORD
  (dw-group-addr :uint32)   ; DWORD
  (dw-group-mask :uint32)   ; DWORD
  (dw-if-index :uint32)   ; DWORD
  (dw-if-next-hop-ipaddr :uint32)   ; DWORD
  (dw-flags :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $MgmAddGroupMembershipEntry = Win32::API::More->new('rtm',
    'DWORD MgmAddGroupMembershipEntry(HANDLE hProtocol, DWORD dwSourceAddr, DWORD dwSourceMask, DWORD dwGroupAddr, DWORD dwGroupMask, DWORD dwIfIndex, DWORD dwIfNextHopIPAddr, DWORD dwFlags)');
# my $ret = $MgmAddGroupMembershipEntry->Call($hProtocol, $dwSourceAddr, $dwSourceMask, $dwGroupAddr, $dwGroupMask, $dwIfIndex, $dwIfNextHopIPAddr, $dwFlags);
# hProtocol : HANDLE -> HANDLE
# dwSourceAddr : DWORD -> DWORD
# dwSourceMask : DWORD -> DWORD
# dwGroupAddr : DWORD -> DWORD
# dwGroupMask : DWORD -> DWORD
# dwIfIndex : DWORD -> DWORD
# dwIfNextHopIPAddr : DWORD -> DWORD
# dwFlags : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目