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

DRMGetMetaData

関数
発行ライセンスのコンテンツメタデータを取得する。
DLLmsdrm.dll呼出規約winapi

シグネチャ

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

HRESULT DRMGetMetaData(
    DWORD hIssuanceLicense,
    DWORD* puContentIdLength,
    LPWSTR wszContentId,   // optional
    DWORD* puContentIdTypeLength,
    LPWSTR wszContentIdType,   // optional
    DWORD* puSKUIdLength,
    LPWSTR wszSKUId,   // optional
    DWORD* puSKUIdTypeLength,
    LPWSTR wszSKUIdType,   // optional
    DWORD* puContentTypeLength,
    LPWSTR wszContentType,   // optional
    DWORD* puContentNameLength,
    LPWSTR wszContentName   // optional
);

パラメーター

名前型方向説明
hIssuanceLicenseDWORDinメタデータの取得元となる発行ライセンスのハンドル。
puContentIdLengthDWORD*inout

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

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

wszContentIdLPWSTRoutoptional

コンテンツを識別する GUID を受け取る、null 終端の Unicode 文字列へのポインター。このバッファーのサイズは puContentIdLength パラメーターで指定します。

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

puContentIdTypeLengthDWORD*inout

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

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

wszContentIdTypeLPWSTRoutoptional

コンテンツの識別に使用される GUID の種類を受け取る、null 終端の Unicode 文字列へのポインター。このバッファーのサイズは puContentIdTypeLength パラメーターで指定します。

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

puSKUIdLengthDWORD*inout

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

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

wszSKUIdLPWSTRoutoptional

コンテンツの SKU を識別する GUID を受け取る、null 終端の Unicode 文字列へのポインター。このバッファーのサイズは puSKUIdLength パラメーターで指定します。

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

puSKUIdTypeLengthDWORD*inout

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

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

wszSKUIdTypeLPWSTRoutoptional

コンテンツの識別に使用される SKU ID の種類を受け取る、null 終端の Unicode 文字列へのポインター。このバッファーのサイズは puSKUIdTypeLength パラメーターで指定します。

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

puContentTypeLengthDWORD*inout

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

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

wszContentTypeLPWSTRoutoptional

コンテンツの Multipurpose Internet Mail Extensions (MIME) タイプを受け取る、null 終端の Unicode 文字列へのポインター。このバッファーのサイズは puContentTypeLength パラメーターで指定します。

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

puContentNameLengthDWORD*inout

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

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

wszContentNameLPWSTRoutoptional

コンテンツの名前を受け取る、null 終端の Unicode 文字列へのポインター。このバッファーのサイズは puContentNameLength パラメーターで指定します。

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

戻り値の型: HRESULT

公式ドキュメント

発行ライセンスからメタデータを取得します。

戻り値

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

関数が失敗した場合は、エラーを示す HRESULT 値を返します。返される可能性がある値には、次の一覧のものが含まれますが、これらに限定されません。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

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

各言語での呼び出し定義

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

HRESULT DRMGetMetaData(
    DWORD hIssuanceLicense,
    DWORD* puContentIdLength,
    LPWSTR wszContentId,   // optional
    DWORD* puContentIdTypeLength,
    LPWSTR wszContentIdType,   // optional
    DWORD* puSKUIdLength,
    LPWSTR wszSKUId,   // optional
    DWORD* puSKUIdTypeLength,
    LPWSTR wszSKUIdType,   // optional
    DWORD* puContentTypeLength,
    LPWSTR wszContentType,   // optional
    DWORD* puContentNameLength,
    LPWSTR wszContentName   // optional
);
[DllImport("msdrm.dll", ExactSpelling = true)]
static extern int DRMGetMetaData(
    uint hIssuanceLicense,   // DWORD
    ref uint puContentIdLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszContentId,   // LPWSTR optional, out
    ref uint puContentIdTypeLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszContentIdType,   // LPWSTR optional, out
    ref uint puSKUIdLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszSKUId,   // LPWSTR optional, out
    ref uint puSKUIdTypeLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszSKUIdType,   // LPWSTR optional, out
    ref uint puContentTypeLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszContentType,   // LPWSTR optional, out
    ref uint puContentNameLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszContentName   // LPWSTR optional, out
);
<DllImport("msdrm.dll", ExactSpelling:=True)>
Public Shared Function DRMGetMetaData(
    hIssuanceLicense As UInteger,   ' DWORD
    ByRef puContentIdLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszContentId As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef puContentIdTypeLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszContentIdType As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef puSKUIdLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszSKUId As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef puSKUIdTypeLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszSKUIdType As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef puContentTypeLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszContentType As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef puContentNameLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszContentName As System.Text.StringBuilder   ' LPWSTR optional, out
) As Integer
End Function
' hIssuanceLicense : DWORD
' puContentIdLength : DWORD* in/out
' wszContentId : LPWSTR optional, out
' puContentIdTypeLength : DWORD* in/out
' wszContentIdType : LPWSTR optional, out
' puSKUIdLength : DWORD* in/out
' wszSKUId : LPWSTR optional, out
' puSKUIdTypeLength : DWORD* in/out
' wszSKUIdType : LPWSTR optional, out
' puContentTypeLength : DWORD* in/out
' wszContentType : LPWSTR optional, out
' puContentNameLength : DWORD* in/out
' wszContentName : LPWSTR optional, out
Declare PtrSafe Function DRMGetMetaData Lib "msdrm" ( _
    ByVal hIssuanceLicense As Long, _
    ByRef puContentIdLength As Long, _
    ByVal wszContentId As LongPtr, _
    ByRef puContentIdTypeLength As Long, _
    ByVal wszContentIdType As LongPtr, _
    ByRef puSKUIdLength As Long, _
    ByVal wszSKUId As LongPtr, _
    ByRef puSKUIdTypeLength As Long, _
    ByVal wszSKUIdType As LongPtr, _
    ByRef puContentTypeLength As Long, _
    ByVal wszContentType As LongPtr, _
    ByRef puContentNameLength As Long, _
    ByVal wszContentName As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

DRMGetMetaData = ctypes.windll.msdrm.DRMGetMetaData
DRMGetMetaData.restype = ctypes.c_int
DRMGetMetaData.argtypes = [
    wintypes.DWORD,  # hIssuanceLicense : DWORD
    ctypes.POINTER(wintypes.DWORD),  # puContentIdLength : DWORD* in/out
    wintypes.LPWSTR,  # wszContentId : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # puContentIdTypeLength : DWORD* in/out
    wintypes.LPWSTR,  # wszContentIdType : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # puSKUIdLength : DWORD* in/out
    wintypes.LPWSTR,  # wszSKUId : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # puSKUIdTypeLength : DWORD* in/out
    wintypes.LPWSTR,  # wszSKUIdType : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # puContentTypeLength : DWORD* in/out
    wintypes.LPWSTR,  # wszContentType : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # puContentNameLength : DWORD* in/out
    wintypes.LPWSTR,  # wszContentName : LPWSTR optional, out
]
require 'fiddle'
require 'fiddle/import'

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

var (
	msdrm = windows.NewLazySystemDLL("msdrm.dll")
	procDRMGetMetaData = msdrm.NewProc("DRMGetMetaData")
)

// hIssuanceLicense (DWORD), puContentIdLength (DWORD* in/out), wszContentId (LPWSTR optional, out), puContentIdTypeLength (DWORD* in/out), wszContentIdType (LPWSTR optional, out), puSKUIdLength (DWORD* in/out), wszSKUId (LPWSTR optional, out), puSKUIdTypeLength (DWORD* in/out), wszSKUIdType (LPWSTR optional, out), puContentTypeLength (DWORD* in/out), wszContentType (LPWSTR optional, out), puContentNameLength (DWORD* in/out), wszContentName (LPWSTR optional, out)
r1, _, err := procDRMGetMetaData.Call(
	uintptr(hIssuanceLicense),
	uintptr(puContentIdLength),
	uintptr(wszContentId),
	uintptr(puContentIdTypeLength),
	uintptr(wszContentIdType),
	uintptr(puSKUIdLength),
	uintptr(wszSKUId),
	uintptr(puSKUIdTypeLength),
	uintptr(wszSKUIdType),
	uintptr(puContentTypeLength),
	uintptr(wszContentType),
	uintptr(puContentNameLength),
	uintptr(wszContentName),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function DRMGetMetaData(
  hIssuanceLicense: DWORD;   // DWORD
  puContentIdLength: Pointer;   // DWORD* in/out
  wszContentId: PWideChar;   // LPWSTR optional, out
  puContentIdTypeLength: Pointer;   // DWORD* in/out
  wszContentIdType: PWideChar;   // LPWSTR optional, out
  puSKUIdLength: Pointer;   // DWORD* in/out
  wszSKUId: PWideChar;   // LPWSTR optional, out
  puSKUIdTypeLength: Pointer;   // DWORD* in/out
  wszSKUIdType: PWideChar;   // LPWSTR optional, out
  puContentTypeLength: Pointer;   // DWORD* in/out
  wszContentType: PWideChar;   // LPWSTR optional, out
  puContentNameLength: Pointer;   // DWORD* in/out
  wszContentName: PWideChar   // LPWSTR optional, out
): Integer; stdcall;
  external 'msdrm.dll' name 'DRMGetMetaData';
result := DllCall("msdrm\DRMGetMetaData"
    , "UInt", hIssuanceLicense   ; DWORD
    , "Ptr", puContentIdLength   ; DWORD* in/out
    , "Ptr", wszContentId   ; LPWSTR optional, out
    , "Ptr", puContentIdTypeLength   ; DWORD* in/out
    , "Ptr", wszContentIdType   ; LPWSTR optional, out
    , "Ptr", puSKUIdLength   ; DWORD* in/out
    , "Ptr", wszSKUId   ; LPWSTR optional, out
    , "Ptr", puSKUIdTypeLength   ; DWORD* in/out
    , "Ptr", wszSKUIdType   ; LPWSTR optional, out
    , "Ptr", puContentTypeLength   ; DWORD* in/out
    , "Ptr", wszContentType   ; LPWSTR optional, out
    , "Ptr", puContentNameLength   ; DWORD* in/out
    , "Ptr", wszContentName   ; LPWSTR optional, out
    , "Int")   ; return: HRESULT
●DRMGetMetaData(hIssuanceLicense, puContentIdLength, wszContentId, puContentIdTypeLength, wszContentIdType, puSKUIdLength, wszSKUId, puSKUIdTypeLength, wszSKUIdType, puContentTypeLength, wszContentType, puContentNameLength, wszContentName) = DLL("msdrm.dll", "int DRMGetMetaData(dword, void*, char*, void*, char*, void*, char*, void*, char*, void*, char*, void*, char*)")
# 呼び出し: DRMGetMetaData(hIssuanceLicense, puContentIdLength, wszContentId, puContentIdTypeLength, wszContentIdType, puSKUIdLength, wszSKUId, puSKUIdTypeLength, wszSKUIdType, puContentTypeLength, wszContentType, puContentNameLength, wszContentName)
# hIssuanceLicense : DWORD -> "dword"
# puContentIdLength : DWORD* in/out -> "void*"
# wszContentId : LPWSTR optional, out -> "char*"
# puContentIdTypeLength : DWORD* in/out -> "void*"
# wszContentIdType : LPWSTR optional, out -> "char*"
# puSKUIdLength : DWORD* in/out -> "void*"
# wszSKUId : LPWSTR optional, out -> "char*"
# puSKUIdTypeLength : DWORD* in/out -> "void*"
# wszSKUIdType : LPWSTR optional, out -> "char*"
# puContentTypeLength : DWORD* in/out -> "void*"
# wszContentType : LPWSTR optional, out -> "char*"
# puContentNameLength : DWORD* in/out -> "void*"
# wszContentName : LPWSTR optional, out -> "char*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef DRMGetMetaDataNative = Int32 Function(Uint32, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>);
typedef DRMGetMetaDataDart = int Function(int, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>);
final DRMGetMetaData = DynamicLibrary.open('msdrm.dll')
    .lookupFunction<DRMGetMetaDataNative, DRMGetMetaDataDart>('DRMGetMetaData');
// hIssuanceLicense : DWORD -> Uint32
// puContentIdLength : DWORD* in/out -> Pointer<Uint32>
// wszContentId : LPWSTR optional, out -> Pointer<Utf16>
// puContentIdTypeLength : DWORD* in/out -> Pointer<Uint32>
// wszContentIdType : LPWSTR optional, out -> Pointer<Utf16>
// puSKUIdLength : DWORD* in/out -> Pointer<Uint32>
// wszSKUId : LPWSTR optional, out -> Pointer<Utf16>
// puSKUIdTypeLength : DWORD* in/out -> Pointer<Uint32>
// wszSKUIdType : LPWSTR optional, out -> Pointer<Utf16>
// puContentTypeLength : DWORD* in/out -> Pointer<Uint32>
// wszContentType : LPWSTR optional, out -> Pointer<Utf16>
// puContentNameLength : DWORD* in/out -> Pointer<Uint32>
// wszContentName : LPWSTR optional, out -> Pointer<Utf16>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function DRMGetMetaData(
  hIssuanceLicense: DWORD;   // DWORD
  puContentIdLength: Pointer;   // DWORD* in/out
  wszContentId: PWideChar;   // LPWSTR optional, out
  puContentIdTypeLength: Pointer;   // DWORD* in/out
  wszContentIdType: PWideChar;   // LPWSTR optional, out
  puSKUIdLength: Pointer;   // DWORD* in/out
  wszSKUId: PWideChar;   // LPWSTR optional, out
  puSKUIdTypeLength: Pointer;   // DWORD* in/out
  wszSKUIdType: PWideChar;   // LPWSTR optional, out
  puContentTypeLength: Pointer;   // DWORD* in/out
  wszContentType: PWideChar;   // LPWSTR optional, out
  puContentNameLength: Pointer;   // DWORD* in/out
  wszContentName: PWideChar   // LPWSTR optional, out
): Integer; stdcall;
  external 'msdrm.dll' name 'DRMGetMetaData';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "DRMGetMetaData"
  c_DRMGetMetaData :: Word32 -> Ptr Word32 -> CWString -> Ptr Word32 -> CWString -> Ptr Word32 -> CWString -> Ptr Word32 -> CWString -> Ptr Word32 -> CWString -> Ptr Word32 -> CWString -> IO Int32
-- hIssuanceLicense : DWORD -> Word32
-- puContentIdLength : DWORD* in/out -> Ptr Word32
-- wszContentId : LPWSTR optional, out -> CWString
-- puContentIdTypeLength : DWORD* in/out -> Ptr Word32
-- wszContentIdType : LPWSTR optional, out -> CWString
-- puSKUIdLength : DWORD* in/out -> Ptr Word32
-- wszSKUId : LPWSTR optional, out -> CWString
-- puSKUIdTypeLength : DWORD* in/out -> Ptr Word32
-- wszSKUIdType : LPWSTR optional, out -> CWString
-- puContentTypeLength : DWORD* in/out -> Ptr Word32
-- wszContentType : LPWSTR optional, out -> CWString
-- puContentNameLength : DWORD* in/out -> Ptr Word32
-- wszContentName : LPWSTR optional, out -> CWString
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let drmgetmetadata =
  foreign "DRMGetMetaData"
    (uint32_t @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> returning int32_t)
(* hIssuanceLicense : DWORD -> uint32_t *)
(* puContentIdLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszContentId : LPWSTR optional, out -> (ptr uint16_t) *)
(* puContentIdTypeLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszContentIdType : LPWSTR optional, out -> (ptr uint16_t) *)
(* puSKUIdLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszSKUId : LPWSTR optional, out -> (ptr uint16_t) *)
(* puSKUIdTypeLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszSKUIdType : LPWSTR optional, out -> (ptr uint16_t) *)
(* puContentTypeLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszContentType : LPWSTR optional, out -> (ptr uint16_t) *)
(* puContentNameLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszContentName : LPWSTR optional, out -> (ptr uint16_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library msdrm (t "msdrm.dll"))
(cffi:use-foreign-library msdrm)

(cffi:defcfun ("DRMGetMetaData" drmget-meta-data :convention :stdcall) :int32
  (h-issuance-license :uint32)   ; DWORD
  (pu-content-id-length :pointer)   ; DWORD* in/out
  (wsz-content-id :pointer)   ; LPWSTR optional, out
  (pu-content-id-type-length :pointer)   ; DWORD* in/out
  (wsz-content-id-type :pointer)   ; LPWSTR optional, out
  (pu-skuid-length :pointer)   ; DWORD* in/out
  (wsz-skuid :pointer)   ; LPWSTR optional, out
  (pu-skuid-type-length :pointer)   ; DWORD* in/out
  (wsz-skuid-type :pointer)   ; LPWSTR optional, out
  (pu-content-type-length :pointer)   ; DWORD* in/out
  (wsz-content-type :pointer)   ; LPWSTR optional, out
  (pu-content-name-length :pointer)   ; DWORD* in/out
  (wsz-content-name :pointer))   ; LPWSTR optional, out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $DRMGetMetaData = Win32::API::More->new('msdrm',
    'int DRMGetMetaData(DWORD hIssuanceLicense, LPVOID puContentIdLength, LPWSTR wszContentId, LPVOID puContentIdTypeLength, LPWSTR wszContentIdType, LPVOID puSKUIdLength, LPWSTR wszSKUId, LPVOID puSKUIdTypeLength, LPWSTR wszSKUIdType, LPVOID puContentTypeLength, LPWSTR wszContentType, LPVOID puContentNameLength, LPWSTR wszContentName)');
# my $ret = $DRMGetMetaData->Call($hIssuanceLicense, $puContentIdLength, $wszContentId, $puContentIdTypeLength, $wszContentIdType, $puSKUIdLength, $wszSKUId, $puSKUIdTypeLength, $wszSKUIdType, $puContentTypeLength, $wszContentType, $puContentNameLength, $wszContentName);
# hIssuanceLicense : DWORD -> DWORD
# puContentIdLength : DWORD* in/out -> LPVOID
# wszContentId : LPWSTR optional, out -> LPWSTR
# puContentIdTypeLength : DWORD* in/out -> LPVOID
# wszContentIdType : LPWSTR optional, out -> LPWSTR
# puSKUIdLength : DWORD* in/out -> LPVOID
# wszSKUId : LPWSTR optional, out -> LPWSTR
# puSKUIdTypeLength : DWORD* in/out -> LPVOID
# wszSKUIdType : LPWSTR optional, out -> LPWSTR
# puContentTypeLength : DWORD* in/out -> LPVOID
# wszContentType : LPWSTR optional, out -> LPWSTR
# puContentNameLength : DWORD* in/out -> LPVOID
# wszContentName : LPWSTR optional, out -> LPWSTR
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目