Win32 API 日本語リファレンス
ホーム › Data.RightsManagement › DRMGetIssuanceLicenseInfo

DRMGetIssuanceLicenseInfo

関数
発行ライセンスの各種情報を取得する。
DLLmsdrm.dll呼出規約winapi

シグネチャ

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

HRESULT DRMGetIssuanceLicenseInfo(
    DWORD hIssuanceLicense,
    SYSTEMTIME* pstTimeFrom,
    SYSTEMTIME* pstTimeUntil,
    DWORD uFlags,
    DWORD* puDistributionPointNameLength,
    LPWSTR wszDistributionPointName,   // optional
    DWORD* puDistributionPointURLLength,
    LPWSTR wszDistributionPointURL,   // optional
    DWORD* phOwner,
    BOOL* pfOfficial
);

パラメーター

名前型方向説明
hIssuanceLicenseDWORDin情報の取得元となる発行ライセンスのハンドル。
pstTimeFromSYSTEMTIME*inoutライセンスの有効期間の開始時刻を UTC 時刻で受け取る SYSTEMTIME 構造体へのポインター。この情報が不要な場合は、このパラメーターに NULL を設定します。
pstTimeUntilSYSTEMTIME*inoutライセンスの有効期間の終了時刻を UTC 時刻で受け取る SYSTEMTIME 構造体へのポインター。この情報が不要な場合は、このパラメーターに NULL を設定します。
uFlagsDWORDinこの配布ポイントが提供するサービスの種類 (発行やライセンス取得など) を指定する DRM_DISTRIBUTION_POINT_INFO 列挙型の値。指定できるフラグは 1 つだけです。
puDistributionPointNameLengthDWORD*inout

呼び出し時に wszDistributionPointName バッファーの長さ (文字数) を格納する UINT 値へのポインター。このサイズには終端の null 文字を含める必要があります。

関数から戻ると、この値には wszDistributionPointName バッファーにコピーされた文字数 (終端の null 文字を含む) が格納されます。

wszDistributionPointName 文字列が不要な場合は、このパラメーターに NULL を設定します。

wszDistributionPointNameLPWSTRoutoptional

エンドユーザーライセンスを配布できる Web サイトの名前を受け取る、null で終わる Unicode 文字列へのポインター。このバッファーのサイズは puDistributionPointNameLength パラメーターで指定します。

このバッファーに必要なサイズを確認するには、このパラメーターに NULL を渡します。関数は、終端の null 文字を含む文字数単位のサイズを puDistributionPointNameLength の値に格納します。

puDistributionPointURLLengthDWORD*inout

呼び出し時に wszDistributionPointURL バッファーの長さ (文字数) を格納する UINT 値へのポインター。このサイズには終端の null 文字を含める必要があります。

関数から戻ると、この値には wszDistributionPointURL バッファーにコピーされた文字数 (終端の null 文字を含む) が格納されます。

wszDistributionPointURL 文字列が不要な場合は、このパラメーターに NULL を設定します。

wszDistributionPointURLLPWSTRoutoptional

エンドユーザーライセンスを配布できる Web サイトの URL を受け取る、null で終わる Unicode 文字列へのポインター。このバッファーのサイズは puDistributionPointURLLength パラメーターで指定します。

このバッファーに必要なサイズを確認するには、このパラメーターに NULL を渡します。関数は、終端の null 文字を含む文字数単位のサイズを puDistributionPointURLLength の値に格納します。

phOwnerDWORD*inout発行ライセンスの所有者のハンドルを受け取る DRMPUBHANDLE 値へのポインター。この情報が不要な場合は、このパラメーターに NULL を設定します。ハンドルを閉じるには DRMClosePubHandle を呼び出します。
pfOfficialBOOL*inout発行ライセンスが公式テンプレートに基づいているかどうかを示す Boolean 値へのポインター。0 以外の値は、そのライセンスが公式テンプレートに基づいていることを示します。公式テンプレートは AD RMS サーバーによって作成および署名されます。非公式テンプレートは、クライアントが新規に作成するか、公式テンプレートを変更して作成します。この情報が不要な場合は、このパラメーターに NULL を設定します。詳細については、Creating a License From a Template を参照してください。

戻り値の型: HRESULT

公式ドキュメント

発行ライセンスからさまざまな情報を取得します。

戻り値

関数が成功した場合は、S_OK を返します。

関数が失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

出力パラメーターのメモリの割り当てと解放は、呼び出し元の関数が行います。これらの値を格納するために必要なバッファーサイズを確認するには、まず wszDistributionPointName と wszDistributionPointURL に NULL を指定してこの関数を呼び出し、長さパラメーター puDistributionPointNameLength および puDistributionPointURLLength から必要なサイズを取得します。

この関数の呼び出しによって作成されたライセンス所有者のハンドルを閉じるには、DRMClosePubHandle を呼び出します。

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

各言語での呼び出し定義

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

HRESULT DRMGetIssuanceLicenseInfo(
    DWORD hIssuanceLicense,
    SYSTEMTIME* pstTimeFrom,
    SYSTEMTIME* pstTimeUntil,
    DWORD uFlags,
    DWORD* puDistributionPointNameLength,
    LPWSTR wszDistributionPointName,   // optional
    DWORD* puDistributionPointURLLength,
    LPWSTR wszDistributionPointURL,   // optional
    DWORD* phOwner,
    BOOL* pfOfficial
);
[DllImport("msdrm.dll", ExactSpelling = true)]
static extern int DRMGetIssuanceLicenseInfo(
    uint hIssuanceLicense,   // DWORD
    IntPtr pstTimeFrom,   // SYSTEMTIME* in/out
    IntPtr pstTimeUntil,   // SYSTEMTIME* in/out
    uint uFlags,   // DWORD
    ref uint puDistributionPointNameLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszDistributionPointName,   // LPWSTR optional, out
    ref uint puDistributionPointURLLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszDistributionPointURL,   // LPWSTR optional, out
    ref uint phOwner,   // DWORD* in/out
    ref bool pfOfficial   // BOOL* in/out
);
<DllImport("msdrm.dll", ExactSpelling:=True)>
Public Shared Function DRMGetIssuanceLicenseInfo(
    hIssuanceLicense As UInteger,   ' DWORD
    pstTimeFrom As IntPtr,   ' SYSTEMTIME* in/out
    pstTimeUntil As IntPtr,   ' SYSTEMTIME* in/out
    uFlags As UInteger,   ' DWORD
    ByRef puDistributionPointNameLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszDistributionPointName As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef puDistributionPointURLLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszDistributionPointURL As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef phOwner As UInteger,   ' DWORD* in/out
    ByRef pfOfficial As Boolean   ' BOOL* in/out
) As Integer
End Function
' hIssuanceLicense : DWORD
' pstTimeFrom : SYSTEMTIME* in/out
' pstTimeUntil : SYSTEMTIME* in/out
' uFlags : DWORD
' puDistributionPointNameLength : DWORD* in/out
' wszDistributionPointName : LPWSTR optional, out
' puDistributionPointURLLength : DWORD* in/out
' wszDistributionPointURL : LPWSTR optional, out
' phOwner : DWORD* in/out
' pfOfficial : BOOL* in/out
Declare PtrSafe Function DRMGetIssuanceLicenseInfo Lib "msdrm" ( _
    ByVal hIssuanceLicense As Long, _
    ByVal pstTimeFrom As LongPtr, _
    ByVal pstTimeUntil As LongPtr, _
    ByVal uFlags As Long, _
    ByRef puDistributionPointNameLength As Long, _
    ByVal wszDistributionPointName As LongPtr, _
    ByRef puDistributionPointURLLength As Long, _
    ByVal wszDistributionPointURL As LongPtr, _
    ByRef phOwner As Long, _
    ByRef pfOfficial As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

DRMGetIssuanceLicenseInfo = ctypes.windll.msdrm.DRMGetIssuanceLicenseInfo
DRMGetIssuanceLicenseInfo.restype = ctypes.c_int
DRMGetIssuanceLicenseInfo.argtypes = [
    wintypes.DWORD,  # hIssuanceLicense : DWORD
    ctypes.c_void_p,  # pstTimeFrom : SYSTEMTIME* in/out
    ctypes.c_void_p,  # pstTimeUntil : SYSTEMTIME* in/out
    wintypes.DWORD,  # uFlags : DWORD
    ctypes.POINTER(wintypes.DWORD),  # puDistributionPointNameLength : DWORD* in/out
    wintypes.LPWSTR,  # wszDistributionPointName : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # puDistributionPointURLLength : DWORD* in/out
    wintypes.LPWSTR,  # wszDistributionPointURL : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # phOwner : DWORD* in/out
    ctypes.c_void_p,  # pfOfficial : BOOL* in/out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('msdrm.dll')
DRMGetIssuanceLicenseInfo = Fiddle::Function.new(
  lib['DRMGetIssuanceLicenseInfo'],
  [
    -Fiddle::TYPE_INT,  # hIssuanceLicense : DWORD
    Fiddle::TYPE_VOIDP,  # pstTimeFrom : SYSTEMTIME* in/out
    Fiddle::TYPE_VOIDP,  # pstTimeUntil : SYSTEMTIME* in/out
    -Fiddle::TYPE_INT,  # uFlags : DWORD
    Fiddle::TYPE_VOIDP,  # puDistributionPointNameLength : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # wszDistributionPointName : LPWSTR optional, out
    Fiddle::TYPE_VOIDP,  # puDistributionPointURLLength : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # wszDistributionPointURL : LPWSTR optional, out
    Fiddle::TYPE_VOIDP,  # phOwner : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pfOfficial : BOOL* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "msdrm")]
extern "system" {
    fn DRMGetIssuanceLicenseInfo(
        hIssuanceLicense: u32,  // DWORD
        pstTimeFrom: *mut SYSTEMTIME,  // SYSTEMTIME* in/out
        pstTimeUntil: *mut SYSTEMTIME,  // SYSTEMTIME* in/out
        uFlags: u32,  // DWORD
        puDistributionPointNameLength: *mut u32,  // DWORD* in/out
        wszDistributionPointName: *mut u16,  // LPWSTR optional, out
        puDistributionPointURLLength: *mut u32,  // DWORD* in/out
        wszDistributionPointURL: *mut u16,  // LPWSTR optional, out
        phOwner: *mut u32,  // DWORD* in/out
        pfOfficial: *mut i32  // BOOL* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("msdrm.dll")]
public static extern int DRMGetIssuanceLicenseInfo(uint hIssuanceLicense, IntPtr pstTimeFrom, IntPtr pstTimeUntil, uint uFlags, ref uint puDistributionPointNameLength, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszDistributionPointName, ref uint puDistributionPointURLLength, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszDistributionPointURL, ref uint phOwner, ref bool pfOfficial);
"@
$api = Add-Type -MemberDefinition $sig -Name 'msdrm_DRMGetIssuanceLicenseInfo' -Namespace Win32 -PassThru
# $api::DRMGetIssuanceLicenseInfo(hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial)
#uselib "msdrm.dll"
#func global DRMGetIssuanceLicenseInfo "DRMGetIssuanceLicenseInfo" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; DRMGetIssuanceLicenseInfo hIssuanceLicense, varptr(pstTimeFrom), varptr(pstTimeUntil), uFlags, varptr(puDistributionPointNameLength), varptr(wszDistributionPointName), varptr(puDistributionPointURLLength), varptr(wszDistributionPointURL), varptr(phOwner), varptr(pfOfficial)   ; 戻り値は stat
; hIssuanceLicense : DWORD -> "sptr"
; pstTimeFrom : SYSTEMTIME* in/out -> "sptr"
; pstTimeUntil : SYSTEMTIME* in/out -> "sptr"
; uFlags : DWORD -> "sptr"
; puDistributionPointNameLength : DWORD* in/out -> "sptr"
; wszDistributionPointName : LPWSTR optional, out -> "sptr"
; puDistributionPointURLLength : DWORD* in/out -> "sptr"
; wszDistributionPointURL : LPWSTR optional, out -> "sptr"
; phOwner : DWORD* in/out -> "sptr"
; pfOfficial : BOOL* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "msdrm.dll"
#cfunc global DRMGetIssuanceLicenseInfo "DRMGetIssuanceLicenseInfo" int, var, var, int, var, var, var, var, var, var
; res = DRMGetIssuanceLicenseInfo(hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial)
; hIssuanceLicense : DWORD -> "int"
; pstTimeFrom : SYSTEMTIME* in/out -> "var"
; pstTimeUntil : SYSTEMTIME* in/out -> "var"
; uFlags : DWORD -> "int"
; puDistributionPointNameLength : DWORD* in/out -> "var"
; wszDistributionPointName : LPWSTR optional, out -> "var"
; puDistributionPointURLLength : DWORD* in/out -> "var"
; wszDistributionPointURL : LPWSTR optional, out -> "var"
; phOwner : DWORD* in/out -> "var"
; pfOfficial : BOOL* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HRESULT DRMGetIssuanceLicenseInfo(DWORD hIssuanceLicense, SYSTEMTIME* pstTimeFrom, SYSTEMTIME* pstTimeUntil, DWORD uFlags, DWORD* puDistributionPointNameLength, LPWSTR wszDistributionPointName, DWORD* puDistributionPointURLLength, LPWSTR wszDistributionPointURL, DWORD* phOwner, BOOL* pfOfficial)
#uselib "msdrm.dll"
#cfunc global DRMGetIssuanceLicenseInfo "DRMGetIssuanceLicenseInfo" int, var, var, int, var, var, var, var, var, var
; res = DRMGetIssuanceLicenseInfo(hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial)
; hIssuanceLicense : DWORD -> "int"
; pstTimeFrom : SYSTEMTIME* in/out -> "var"
; pstTimeUntil : SYSTEMTIME* in/out -> "var"
; uFlags : DWORD -> "int"
; puDistributionPointNameLength : DWORD* in/out -> "var"
; wszDistributionPointName : LPWSTR optional, out -> "var"
; puDistributionPointURLLength : DWORD* in/out -> "var"
; wszDistributionPointURL : LPWSTR optional, out -> "var"
; phOwner : DWORD* in/out -> "var"
; pfOfficial : BOOL* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	msdrm = windows.NewLazySystemDLL("msdrm.dll")
	procDRMGetIssuanceLicenseInfo = msdrm.NewProc("DRMGetIssuanceLicenseInfo")
)

// hIssuanceLicense (DWORD), pstTimeFrom (SYSTEMTIME* in/out), pstTimeUntil (SYSTEMTIME* in/out), uFlags (DWORD), puDistributionPointNameLength (DWORD* in/out), wszDistributionPointName (LPWSTR optional, out), puDistributionPointURLLength (DWORD* in/out), wszDistributionPointURL (LPWSTR optional, out), phOwner (DWORD* in/out), pfOfficial (BOOL* in/out)
r1, _, err := procDRMGetIssuanceLicenseInfo.Call(
	uintptr(hIssuanceLicense),
	uintptr(pstTimeFrom),
	uintptr(pstTimeUntil),
	uintptr(uFlags),
	uintptr(puDistributionPointNameLength),
	uintptr(wszDistributionPointName),
	uintptr(puDistributionPointURLLength),
	uintptr(wszDistributionPointURL),
	uintptr(phOwner),
	uintptr(pfOfficial),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function DRMGetIssuanceLicenseInfo(
  hIssuanceLicense: DWORD;   // DWORD
  pstTimeFrom: Pointer;   // SYSTEMTIME* in/out
  pstTimeUntil: Pointer;   // SYSTEMTIME* in/out
  uFlags: DWORD;   // DWORD
  puDistributionPointNameLength: Pointer;   // DWORD* in/out
  wszDistributionPointName: PWideChar;   // LPWSTR optional, out
  puDistributionPointURLLength: Pointer;   // DWORD* in/out
  wszDistributionPointURL: PWideChar;   // LPWSTR optional, out
  phOwner: Pointer;   // DWORD* in/out
  pfOfficial: Pointer   // BOOL* in/out
): Integer; stdcall;
  external 'msdrm.dll' name 'DRMGetIssuanceLicenseInfo';
result := DllCall("msdrm\DRMGetIssuanceLicenseInfo"
    , "UInt", hIssuanceLicense   ; DWORD
    , "Ptr", pstTimeFrom   ; SYSTEMTIME* in/out
    , "Ptr", pstTimeUntil   ; SYSTEMTIME* in/out
    , "UInt", uFlags   ; DWORD
    , "Ptr", puDistributionPointNameLength   ; DWORD* in/out
    , "Ptr", wszDistributionPointName   ; LPWSTR optional, out
    , "Ptr", puDistributionPointURLLength   ; DWORD* in/out
    , "Ptr", wszDistributionPointURL   ; LPWSTR optional, out
    , "Ptr", phOwner   ; DWORD* in/out
    , "Ptr", pfOfficial   ; BOOL* in/out
    , "Int")   ; return: HRESULT
●DRMGetIssuanceLicenseInfo(hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial) = DLL("msdrm.dll", "int DRMGetIssuanceLicenseInfo(dword, void*, void*, dword, void*, char*, void*, char*, void*, void*)")
# 呼び出し: DRMGetIssuanceLicenseInfo(hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial)
# hIssuanceLicense : DWORD -> "dword"
# pstTimeFrom : SYSTEMTIME* in/out -> "void*"
# pstTimeUntil : SYSTEMTIME* in/out -> "void*"
# uFlags : DWORD -> "dword"
# puDistributionPointNameLength : DWORD* in/out -> "void*"
# wszDistributionPointName : LPWSTR optional, out -> "char*"
# puDistributionPointURLLength : DWORD* in/out -> "void*"
# wszDistributionPointURL : LPWSTR optional, out -> "char*"
# phOwner : DWORD* in/out -> "void*"
# pfOfficial : BOOL* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "msdrm" fn DRMGetIssuanceLicenseInfo(
    hIssuanceLicense: u32, // DWORD
    pstTimeFrom: [*c]SYSTEMTIME, // SYSTEMTIME* in/out
    pstTimeUntil: [*c]SYSTEMTIME, // SYSTEMTIME* in/out
    uFlags: u32, // DWORD
    puDistributionPointNameLength: [*c]u32, // DWORD* in/out
    wszDistributionPointName: [*c]u16, // LPWSTR optional, out
    puDistributionPointURLLength: [*c]u32, // DWORD* in/out
    wszDistributionPointURL: [*c]u16, // LPWSTR optional, out
    phOwner: [*c]u32, // DWORD* in/out
    pfOfficial: [*c]i32 // BOOL* in/out
) callconv(std.os.windows.WINAPI) i32;
proc DRMGetIssuanceLicenseInfo(
    hIssuanceLicense: uint32,  # DWORD
    pstTimeFrom: ptr SYSTEMTIME,  # SYSTEMTIME* in/out
    pstTimeUntil: ptr SYSTEMTIME,  # SYSTEMTIME* in/out
    uFlags: uint32,  # DWORD
    puDistributionPointNameLength: ptr uint32,  # DWORD* in/out
    wszDistributionPointName: ptr uint16,  # LPWSTR optional, out
    puDistributionPointURLLength: ptr uint32,  # DWORD* in/out
    wszDistributionPointURL: ptr uint16,  # LPWSTR optional, out
    phOwner: ptr uint32,  # DWORD* in/out
    pfOfficial: ptr int32  # BOOL* in/out
): int32 {.importc: "DRMGetIssuanceLicenseInfo", stdcall, dynlib: "msdrm.dll".}
pragma(lib, "msdrm");
extern(Windows)
int DRMGetIssuanceLicenseInfo(
    uint hIssuanceLicense,   // DWORD
    SYSTEMTIME* pstTimeFrom,   // SYSTEMTIME* in/out
    SYSTEMTIME* pstTimeUntil,   // SYSTEMTIME* in/out
    uint uFlags,   // DWORD
    uint* puDistributionPointNameLength,   // DWORD* in/out
    wchar* wszDistributionPointName,   // LPWSTR optional, out
    uint* puDistributionPointURLLength,   // DWORD* in/out
    wchar* wszDistributionPointURL,   // LPWSTR optional, out
    uint* phOwner,   // DWORD* in/out
    int* pfOfficial   // BOOL* in/out
);
ccall((:DRMGetIssuanceLicenseInfo, "msdrm.dll"), stdcall, Int32,
      (UInt32, Ptr{SYSTEMTIME}, Ptr{SYSTEMTIME}, UInt32, Ptr{UInt32}, Ptr{UInt16}, Ptr{UInt32}, Ptr{UInt16}, Ptr{UInt32}, Ptr{Int32}),
      hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial)
# hIssuanceLicense : DWORD -> UInt32
# pstTimeFrom : SYSTEMTIME* in/out -> Ptr{SYSTEMTIME}
# pstTimeUntil : SYSTEMTIME* in/out -> Ptr{SYSTEMTIME}
# uFlags : DWORD -> UInt32
# puDistributionPointNameLength : DWORD* in/out -> Ptr{UInt32}
# wszDistributionPointName : LPWSTR optional, out -> Ptr{UInt16}
# puDistributionPointURLLength : DWORD* in/out -> Ptr{UInt32}
# wszDistributionPointURL : LPWSTR optional, out -> Ptr{UInt16}
# phOwner : DWORD* in/out -> Ptr{UInt32}
# pfOfficial : BOOL* in/out -> Ptr{Int32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t DRMGetIssuanceLicenseInfo(
    uint32_t hIssuanceLicense,
    void* pstTimeFrom,
    void* pstTimeUntil,
    uint32_t uFlags,
    uint32_t* puDistributionPointNameLength,
    uint16_t* wszDistributionPointName,
    uint32_t* puDistributionPointURLLength,
    uint16_t* wszDistributionPointURL,
    uint32_t* phOwner,
    int32_t* pfOfficial);
]]
local msdrm = ffi.load("msdrm")
-- msdrm.DRMGetIssuanceLicenseInfo(hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial)
-- hIssuanceLicense : DWORD
-- pstTimeFrom : SYSTEMTIME* in/out
-- pstTimeUntil : SYSTEMTIME* in/out
-- uFlags : DWORD
-- puDistributionPointNameLength : DWORD* in/out
-- wszDistributionPointName : LPWSTR optional, out
-- puDistributionPointURLLength : DWORD* in/out
-- wszDistributionPointURL : LPWSTR optional, out
-- phOwner : DWORD* in/out
-- pfOfficial : BOOL* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('msdrm.dll');
const DRMGetIssuanceLicenseInfo = lib.func('__stdcall', 'DRMGetIssuanceLicenseInfo', 'int32_t', ['uint32_t', 'void *', 'void *', 'uint32_t', 'uint32_t *', 'uint16_t *', 'uint32_t *', 'uint16_t *', 'uint32_t *', 'int32_t *']);
// DRMGetIssuanceLicenseInfo(hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial)
// hIssuanceLicense : DWORD -> 'uint32_t'
// pstTimeFrom : SYSTEMTIME* in/out -> 'void *'
// pstTimeUntil : SYSTEMTIME* in/out -> 'void *'
// uFlags : DWORD -> 'uint32_t'
// puDistributionPointNameLength : DWORD* in/out -> 'uint32_t *'
// wszDistributionPointName : LPWSTR optional, out -> 'uint16_t *'
// puDistributionPointURLLength : DWORD* in/out -> 'uint32_t *'
// wszDistributionPointURL : LPWSTR optional, out -> 'uint16_t *'
// phOwner : DWORD* in/out -> 'uint32_t *'
// pfOfficial : BOOL* in/out -> 'int32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("msdrm.dll", {
  DRMGetIssuanceLicenseInfo: { parameters: ["u32", "pointer", "pointer", "u32", "pointer", "buffer", "pointer", "buffer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.DRMGetIssuanceLicenseInfo(hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial)
// hIssuanceLicense : DWORD -> "u32"
// pstTimeFrom : SYSTEMTIME* in/out -> "pointer"
// pstTimeUntil : SYSTEMTIME* in/out -> "pointer"
// uFlags : DWORD -> "u32"
// puDistributionPointNameLength : DWORD* in/out -> "pointer"
// wszDistributionPointName : LPWSTR optional, out -> "buffer"
// puDistributionPointURLLength : DWORD* in/out -> "pointer"
// wszDistributionPointURL : LPWSTR optional, out -> "buffer"
// phOwner : DWORD* in/out -> "pointer"
// pfOfficial : BOOL* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t DRMGetIssuanceLicenseInfo(
    uint32_t hIssuanceLicense,
    void* pstTimeFrom,
    void* pstTimeUntil,
    uint32_t uFlags,
    uint32_t* puDistributionPointNameLength,
    uint16_t* wszDistributionPointName,
    uint32_t* puDistributionPointURLLength,
    uint16_t* wszDistributionPointURL,
    uint32_t* phOwner,
    int32_t* pfOfficial);
C, "msdrm.dll");
// $ffi->DRMGetIssuanceLicenseInfo(hIssuanceLicense, pstTimeFrom, pstTimeUntil, uFlags, puDistributionPointNameLength, wszDistributionPointName, puDistributionPointURLLength, wszDistributionPointURL, phOwner, pfOfficial);
// hIssuanceLicense : DWORD
// pstTimeFrom : SYSTEMTIME* in/out
// pstTimeUntil : SYSTEMTIME* in/out
// uFlags : DWORD
// puDistributionPointNameLength : DWORD* in/out
// wszDistributionPointName : LPWSTR optional, out
// puDistributionPointURLLength : DWORD* in/out
// wszDistributionPointURL : LPWSTR optional, out
// phOwner : DWORD* in/out
// pfOfficial : BOOL* in/out
// 構造体/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 Msdrm extends StdCallLibrary {
    Msdrm INSTANCE = Native.load("msdrm", Msdrm.class);
    int DRMGetIssuanceLicenseInfo(
        int hIssuanceLicense,   // DWORD
        Pointer pstTimeFrom,   // SYSTEMTIME* in/out
        Pointer pstTimeUntil,   // SYSTEMTIME* in/out
        int uFlags,   // DWORD
        IntByReference puDistributionPointNameLength,   // DWORD* in/out
        char[] wszDistributionPointName,   // LPWSTR optional, out
        IntByReference puDistributionPointURLLength,   // DWORD* in/out
        char[] wszDistributionPointURL,   // LPWSTR optional, out
        IntByReference phOwner,   // DWORD* in/out
        IntByReference pfOfficial   // BOOL* in/out
    );
}
@[Link("msdrm")]
lib Libmsdrm
  fun DRMGetIssuanceLicenseInfo = DRMGetIssuanceLicenseInfo(
    hIssuanceLicense : UInt32,   # DWORD
    pstTimeFrom : SYSTEMTIME*,   # SYSTEMTIME* in/out
    pstTimeUntil : SYSTEMTIME*,   # SYSTEMTIME* in/out
    uFlags : UInt32,   # DWORD
    puDistributionPointNameLength : UInt32*,   # DWORD* in/out
    wszDistributionPointName : UInt16*,   # LPWSTR optional, out
    puDistributionPointURLLength : UInt32*,   # DWORD* in/out
    wszDistributionPointURL : UInt16*,   # LPWSTR optional, out
    phOwner : UInt32*,   # DWORD* in/out
    pfOfficial : Int32*   # BOOL* in/out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef DRMGetIssuanceLicenseInfoNative = Int32 Function(Uint32, Pointer<Void>, Pointer<Void>, Uint32, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Int32>);
typedef DRMGetIssuanceLicenseInfoDart = int Function(int, Pointer<Void>, Pointer<Void>, int, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Int32>);
final DRMGetIssuanceLicenseInfo = DynamicLibrary.open('msdrm.dll')
    .lookupFunction<DRMGetIssuanceLicenseInfoNative, DRMGetIssuanceLicenseInfoDart>('DRMGetIssuanceLicenseInfo');
// hIssuanceLicense : DWORD -> Uint32
// pstTimeFrom : SYSTEMTIME* in/out -> Pointer<Void>
// pstTimeUntil : SYSTEMTIME* in/out -> Pointer<Void>
// uFlags : DWORD -> Uint32
// puDistributionPointNameLength : DWORD* in/out -> Pointer<Uint32>
// wszDistributionPointName : LPWSTR optional, out -> Pointer<Utf16>
// puDistributionPointURLLength : DWORD* in/out -> Pointer<Uint32>
// wszDistributionPointURL : LPWSTR optional, out -> Pointer<Utf16>
// phOwner : DWORD* in/out -> Pointer<Uint32>
// pfOfficial : BOOL* in/out -> Pointer<Int32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function DRMGetIssuanceLicenseInfo(
  hIssuanceLicense: DWORD;   // DWORD
  pstTimeFrom: Pointer;   // SYSTEMTIME* in/out
  pstTimeUntil: Pointer;   // SYSTEMTIME* in/out
  uFlags: DWORD;   // DWORD
  puDistributionPointNameLength: Pointer;   // DWORD* in/out
  wszDistributionPointName: PWideChar;   // LPWSTR optional, out
  puDistributionPointURLLength: Pointer;   // DWORD* in/out
  wszDistributionPointURL: PWideChar;   // LPWSTR optional, out
  phOwner: Pointer;   // DWORD* in/out
  pfOfficial: Pointer   // BOOL* in/out
): Integer; stdcall;
  external 'msdrm.dll' name 'DRMGetIssuanceLicenseInfo';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "DRMGetIssuanceLicenseInfo"
  c_DRMGetIssuanceLicenseInfo :: Word32 -> Ptr () -> Ptr () -> Word32 -> Ptr Word32 -> CWString -> Ptr Word32 -> CWString -> Ptr Word32 -> Ptr CInt -> IO Int32
-- hIssuanceLicense : DWORD -> Word32
-- pstTimeFrom : SYSTEMTIME* in/out -> Ptr ()
-- pstTimeUntil : SYSTEMTIME* in/out -> Ptr ()
-- uFlags : DWORD -> Word32
-- puDistributionPointNameLength : DWORD* in/out -> Ptr Word32
-- wszDistributionPointName : LPWSTR optional, out -> CWString
-- puDistributionPointURLLength : DWORD* in/out -> Ptr Word32
-- wszDistributionPointURL : LPWSTR optional, out -> CWString
-- phOwner : DWORD* in/out -> Ptr Word32
-- pfOfficial : BOOL* in/out -> Ptr CInt
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let drmgetissuancelicenseinfo =
  foreign "DRMGetIssuanceLicenseInfo"
    (uint32_t @-> (ptr void) @-> (ptr void) @-> uint32_t @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> (ptr int32_t) @-> returning int32_t)
(* hIssuanceLicense : DWORD -> uint32_t *)
(* pstTimeFrom : SYSTEMTIME* in/out -> (ptr void) *)
(* pstTimeUntil : SYSTEMTIME* in/out -> (ptr void) *)
(* uFlags : DWORD -> uint32_t *)
(* puDistributionPointNameLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszDistributionPointName : LPWSTR optional, out -> (ptr uint16_t) *)
(* puDistributionPointURLLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszDistributionPointURL : LPWSTR optional, out -> (ptr uint16_t) *)
(* phOwner : DWORD* in/out -> (ptr uint32_t) *)
(* pfOfficial : BOOL* in/out -> (ptr int32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library msdrm (t "msdrm.dll"))
(cffi:use-foreign-library msdrm)

(cffi:defcfun ("DRMGetIssuanceLicenseInfo" drmget-issuance-license-info :convention :stdcall) :int32
  (h-issuance-license :uint32)   ; DWORD
  (pst-time-from :pointer)   ; SYSTEMTIME* in/out
  (pst-time-until :pointer)   ; SYSTEMTIME* in/out
  (u-flags :uint32)   ; DWORD
  (pu-distribution-point-name-length :pointer)   ; DWORD* in/out
  (wsz-distribution-point-name :pointer)   ; LPWSTR optional, out
  (pu-distribution-point-urllength :pointer)   ; DWORD* in/out
  (wsz-distribution-point-url :pointer)   ; LPWSTR optional, out
  (ph-owner :pointer)   ; DWORD* in/out
  (pf-official :pointer))   ; BOOL* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $DRMGetIssuanceLicenseInfo = Win32::API::More->new('msdrm',
    'int DRMGetIssuanceLicenseInfo(DWORD hIssuanceLicense, LPVOID pstTimeFrom, LPVOID pstTimeUntil, DWORD uFlags, LPVOID puDistributionPointNameLength, LPWSTR wszDistributionPointName, LPVOID puDistributionPointURLLength, LPWSTR wszDistributionPointURL, LPVOID phOwner, LPVOID pfOfficial)');
# my $ret = $DRMGetIssuanceLicenseInfo->Call($hIssuanceLicense, $pstTimeFrom, $pstTimeUntil, $uFlags, $puDistributionPointNameLength, $wszDistributionPointName, $puDistributionPointURLLength, $wszDistributionPointURL, $phOwner, $pfOfficial);
# hIssuanceLicense : DWORD -> DWORD
# pstTimeFrom : SYSTEMTIME* in/out -> LPVOID
# pstTimeUntil : SYSTEMTIME* in/out -> LPVOID
# uFlags : DWORD -> DWORD
# puDistributionPointNameLength : DWORD* in/out -> LPVOID
# wszDistributionPointName : LPWSTR optional, out -> LPWSTR
# puDistributionPointURLLength : DWORD* in/out -> LPVOID
# wszDistributionPointURL : LPWSTR optional, out -> LPWSTR
# phOwner : DWORD* in/out -> LPVOID
# pfOfficial : BOOL* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型