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

DRMSetMetaData

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

シグネチャ

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

HRESULT DRMSetMetaData(
    DWORD hIssuanceLicense,
    LPWSTR wszContentId,
    LPWSTR wszContentIdType,
    LPWSTR wszSKUId,   // optional
    LPWSTR wszSKUIdType,   // optional
    LPWSTR wszContentType,   // optional
    LPWSTR wszContentName   // optional
);

パラメーター

名前型方向説明
hIssuanceLicenseDWORDinメタデータを追加する対象の発行ライセンスのハンドル。
wszContentIdLPWSTRinコンテンツの項目を一意に識別する、null で終わる Unicode 文字列へのポインター。この文字列には、終端の null 文字に加えて最大 40 文字を格納できます。GUID の作成には CoCreateGUID を使用することをお勧めします。コンテンツ ID の詳細については、「解説」を参照してください。
wszContentIdTypeLPWSTRinwszContentId パラメーターが表す識別子の種類を指定する、null で終わる Unicode 文字列へのポインター。例としては "MSGUID"、"ISBN"、"CatalogNumber" のほか、適切と考えられる任意の値を指定できます。
wszSKUIdLPWSTRinoptional省略可能な識別子を格納する、null で終わる Unicode 文字列へのポインター。この文字列には、終端の null 文字に加えて最大 40 文字を格納できます。SKU ID は省略可能であり、必須のコンテンツ ID による識別に加えて、さらに細かくコンテンツを識別できるようにします。wszSKUIdType を指定する場合は、wszSKUId パラメーターも指定する必要があります。それ以外の場合は NULL を指定できます。
wszSKUIdTypeLPWSTRinoptionalwszSKUId パラメーターが表す識別子の種類を格納する、null で終わる Unicode 文字列へのポインター。wszSKUId を指定する場合は、wszSKUIdType パラメーターも指定する必要があります。それ以外の場合は NULL を指定できます。
wszContentTypeLPWSTRinoptionalコンテンツに関するアプリケーション定義の情報を格納する、null で終わる Unicode 文字列へのポインター。例としては "Financial Statement"、"Source Code"、"Office Document" のほか、適切と考えられる任意の値があります。このパラメーターは省略可能であり、NULL を指定できます。
wszContentNameLPWSTRinoptionalコンテンツの表示名を格納する、null で終わる Unicode 文字列へのポインター。このパラメーターは省略可能であり、NULL を指定できます。

戻り値の型: HRESULT

公式ドキュメント

発行ライセンスにアプリケーション固有のメタデータを追加します。

戻り値

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

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

解説(Remarks)

DRMSetMetaData 関数は通常、特定のコンテンツ項目に対するコンテンツ ID、名前、種類を発行ライセンスに設定するために、DRMCreateIssuanceLicense の後に呼び出します。また、この関数は DRMCreateBoundLicense または DRMEnumerateLicense の前に呼び出します。

コンテンツ ID は、発行アプリケーションによって作成され、発行ライセンスに設定されます。たとえば、アプリケーションは DRMCreateIssuanceLicense を呼び出して新しい発行ライセンスを作成できます。続いて CoCreateGUID を呼び出して一意の ID を作成し、DRMSetMetaData を呼び出してその ID をライセンスに関連付けます。AD RMS クライアントは、次の図に示すように、その ID を発行ライセンスの <WORK> ノードに配置します。詳細については、Creating an Issuance License を参照してください。

<WORK>
   <OBJECT type="Microsoft Office Document">
      <ID type="MSGUID">{AEADA9BD84F246BD92385A611D624A02}</ID>
      <NAME>Microsoft Office Document</NAME>
   </OBJECT>
    .
    .
    .
</WORK>

発行ライセンスが作成された後、消費側のアプリケーションはそれを使用してエンドユーザーライセンスを取得できます。詳細については、DRMAcquireLicense を参照してください。該当する <WORK> ノードとそれぞれのコンテンツ ID は、発行ライセンスからエンドユーザーライセンスにコピーされます。

エンドユーザーライセンスを取得すると、消費側のアプリケーションは内部的にコンテンツ ID を使用してそのライセンスにバインドします。詳細については、DRMCreateBoundLicense を参照してください。バインドでは、ライセンスチェーン、プリンシパル、環境が検証され、指定されたユーザーに適用されないすべての権利が削除されます。バインドされたライセンスは、保護されたコンテンツの復号化に使用できます。

最後に、コンテンツ ID はエンドユーザーライセンスの列挙に使用できます。詳細については、DRMEnumerateLicense および DRMCreateLicenseStorageSession を参照してください。コンテンツ ID は、ライセンスストア内のエンドユーザーライセンスを特定するために使用されます。

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

各言語での呼び出し定義

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

HRESULT DRMSetMetaData(
    DWORD hIssuanceLicense,
    LPWSTR wszContentId,
    LPWSTR wszContentIdType,
    LPWSTR wszSKUId,   // optional
    LPWSTR wszSKUIdType,   // optional
    LPWSTR wszContentType,   // optional
    LPWSTR wszContentName   // optional
);
[DllImport("msdrm.dll", ExactSpelling = true)]
static extern int DRMSetMetaData(
    uint hIssuanceLicense,   // DWORD
    [MarshalAs(UnmanagedType.LPWStr)] string wszContentId,   // LPWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string wszContentIdType,   // LPWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string wszSKUId,   // LPWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string wszSKUIdType,   // LPWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string wszContentType,   // LPWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string wszContentName   // LPWSTR optional
);
<DllImport("msdrm.dll", ExactSpelling:=True)>
Public Shared Function DRMSetMetaData(
    hIssuanceLicense As UInteger,   ' DWORD
    <MarshalAs(UnmanagedType.LPWStr)> wszContentId As String,   ' LPWSTR
    <MarshalAs(UnmanagedType.LPWStr)> wszContentIdType As String,   ' LPWSTR
    <MarshalAs(UnmanagedType.LPWStr)> wszSKUId As String,   ' LPWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> wszSKUIdType As String,   ' LPWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> wszContentType As String,   ' LPWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> wszContentName As String   ' LPWSTR optional
) As Integer
End Function
' hIssuanceLicense : DWORD
' wszContentId : LPWSTR
' wszContentIdType : LPWSTR
' wszSKUId : LPWSTR optional
' wszSKUIdType : LPWSTR optional
' wszContentType : LPWSTR optional
' wszContentName : LPWSTR optional
Declare PtrSafe Function DRMSetMetaData Lib "msdrm" ( _
    ByVal hIssuanceLicense As Long, _
    ByVal wszContentId As LongPtr, _
    ByVal wszContentIdType As LongPtr, _
    ByVal wszSKUId As LongPtr, _
    ByVal wszSKUIdType As LongPtr, _
    ByVal wszContentType As LongPtr, _
    ByVal wszContentName As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

DRMSetMetaData = ctypes.windll.msdrm.DRMSetMetaData
DRMSetMetaData.restype = ctypes.c_int
DRMSetMetaData.argtypes = [
    wintypes.DWORD,  # hIssuanceLicense : DWORD
    wintypes.LPCWSTR,  # wszContentId : LPWSTR
    wintypes.LPCWSTR,  # wszContentIdType : LPWSTR
    wintypes.LPCWSTR,  # wszSKUId : LPWSTR optional
    wintypes.LPCWSTR,  # wszSKUIdType : LPWSTR optional
    wintypes.LPCWSTR,  # wszContentType : LPWSTR optional
    wintypes.LPCWSTR,  # wszContentName : LPWSTR optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('msdrm.dll')
DRMSetMetaData = Fiddle::Function.new(
  lib['DRMSetMetaData'],
  [
    -Fiddle::TYPE_INT,  # hIssuanceLicense : DWORD
    Fiddle::TYPE_VOIDP,  # wszContentId : LPWSTR
    Fiddle::TYPE_VOIDP,  # wszContentIdType : LPWSTR
    Fiddle::TYPE_VOIDP,  # wszSKUId : LPWSTR optional
    Fiddle::TYPE_VOIDP,  # wszSKUIdType : LPWSTR optional
    Fiddle::TYPE_VOIDP,  # wszContentType : LPWSTR optional
    Fiddle::TYPE_VOIDP,  # wszContentName : LPWSTR optional
  ],
  Fiddle::TYPE_INT)
#[link(name = "msdrm")]
extern "system" {
    fn DRMSetMetaData(
        hIssuanceLicense: u32,  // DWORD
        wszContentId: *mut u16,  // LPWSTR
        wszContentIdType: *mut u16,  // LPWSTR
        wszSKUId: *mut u16,  // LPWSTR optional
        wszSKUIdType: *mut u16,  // LPWSTR optional
        wszContentType: *mut u16,  // LPWSTR optional
        wszContentName: *mut u16  // LPWSTR optional
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("msdrm.dll")]
public static extern int DRMSetMetaData(uint hIssuanceLicense, [MarshalAs(UnmanagedType.LPWStr)] string wszContentId, [MarshalAs(UnmanagedType.LPWStr)] string wszContentIdType, [MarshalAs(UnmanagedType.LPWStr)] string wszSKUId, [MarshalAs(UnmanagedType.LPWStr)] string wszSKUIdType, [MarshalAs(UnmanagedType.LPWStr)] string wszContentType, [MarshalAs(UnmanagedType.LPWStr)] string wszContentName);
"@
$api = Add-Type -MemberDefinition $sig -Name 'msdrm_DRMSetMetaData' -Namespace Win32 -PassThru
# $api::DRMSetMetaData(hIssuanceLicense, wszContentId, wszContentIdType, wszSKUId, wszSKUIdType, wszContentType, wszContentName)
#uselib "msdrm.dll"
#func global DRMSetMetaData "DRMSetMetaData" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; DRMSetMetaData hIssuanceLicense, wszContentId, wszContentIdType, wszSKUId, wszSKUIdType, wszContentType, wszContentName   ; 戻り値は stat
; hIssuanceLicense : DWORD -> "sptr"
; wszContentId : LPWSTR -> "sptr"
; wszContentIdType : LPWSTR -> "sptr"
; wszSKUId : LPWSTR optional -> "sptr"
; wszSKUIdType : LPWSTR optional -> "sptr"
; wszContentType : LPWSTR optional -> "sptr"
; wszContentName : LPWSTR optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "msdrm.dll"
#cfunc global DRMSetMetaData "DRMSetMetaData" int, wstr, wstr, wstr, wstr, wstr, wstr
; res = DRMSetMetaData(hIssuanceLicense, wszContentId, wszContentIdType, wszSKUId, wszSKUIdType, wszContentType, wszContentName)
; hIssuanceLicense : DWORD -> "int"
; wszContentId : LPWSTR -> "wstr"
; wszContentIdType : LPWSTR -> "wstr"
; wszSKUId : LPWSTR optional -> "wstr"
; wszSKUIdType : LPWSTR optional -> "wstr"
; wszContentType : LPWSTR optional -> "wstr"
; wszContentName : LPWSTR optional -> "wstr"
; HRESULT DRMSetMetaData(DWORD hIssuanceLicense, LPWSTR wszContentId, LPWSTR wszContentIdType, LPWSTR wszSKUId, LPWSTR wszSKUIdType, LPWSTR wszContentType, LPWSTR wszContentName)
#uselib "msdrm.dll"
#cfunc global DRMSetMetaData "DRMSetMetaData" int, wstr, wstr, wstr, wstr, wstr, wstr
; res = DRMSetMetaData(hIssuanceLicense, wszContentId, wszContentIdType, wszSKUId, wszSKUIdType, wszContentType, wszContentName)
; hIssuanceLicense : DWORD -> "int"
; wszContentId : LPWSTR -> "wstr"
; wszContentIdType : LPWSTR -> "wstr"
; wszSKUId : LPWSTR optional -> "wstr"
; wszSKUIdType : LPWSTR optional -> "wstr"
; wszContentType : LPWSTR optional -> "wstr"
; wszContentName : LPWSTR optional -> "wstr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	msdrm = windows.NewLazySystemDLL("msdrm.dll")
	procDRMSetMetaData = msdrm.NewProc("DRMSetMetaData")
)

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

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

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

foreign import stdcall safe "DRMSetMetaData"
  c_DRMSetMetaData :: Word32 -> CWString -> CWString -> CWString -> CWString -> CWString -> CWString -> IO Int32
-- hIssuanceLicense : DWORD -> Word32
-- wszContentId : LPWSTR -> CWString
-- wszContentIdType : LPWSTR -> CWString
-- wszSKUId : LPWSTR optional -> CWString
-- wszSKUIdType : LPWSTR optional -> CWString
-- wszContentType : LPWSTR optional -> CWString
-- wszContentName : LPWSTR optional -> CWString
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let drmsetmetadata =
  foreign "DRMSetMetaData"
    (uint32_t @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> returning int32_t)
(* hIssuanceLicense : DWORD -> uint32_t *)
(* wszContentId : LPWSTR -> (ptr uint16_t) *)
(* wszContentIdType : LPWSTR -> (ptr uint16_t) *)
(* wszSKUId : LPWSTR optional -> (ptr uint16_t) *)
(* wszSKUIdType : LPWSTR optional -> (ptr uint16_t) *)
(* wszContentType : LPWSTR optional -> (ptr uint16_t) *)
(* wszContentName : LPWSTR optional -> (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 ("DRMSetMetaData" drmset-meta-data :convention :stdcall) :int32
  (h-issuance-license :uint32)   ; DWORD
  (wsz-content-id (:string :encoding :utf-16le))   ; LPWSTR
  (wsz-content-id-type (:string :encoding :utf-16le))   ; LPWSTR
  (wsz-skuid (:string :encoding :utf-16le))   ; LPWSTR optional
  (wsz-skuid-type (:string :encoding :utf-16le))   ; LPWSTR optional
  (wsz-content-type (:string :encoding :utf-16le))   ; LPWSTR optional
  (wsz-content-name (:string :encoding :utf-16le)))   ; LPWSTR optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $DRMSetMetaData = Win32::API::More->new('msdrm',
    'int DRMSetMetaData(DWORD hIssuanceLicense, LPCWSTR wszContentId, LPCWSTR wszContentIdType, LPCWSTR wszSKUId, LPCWSTR wszSKUIdType, LPCWSTR wszContentType, LPCWSTR wszContentName)');
# my $ret = $DRMSetMetaData->Call($hIssuanceLicense, $wszContentId, $wszContentIdType, $wszSKUId, $wszSKUIdType, $wszContentType, $wszContentName);
# hIssuanceLicense : DWORD -> DWORD
# wszContentId : LPWSTR -> LPCWSTR
# wszContentIdType : LPWSTR -> LPCWSTR
# wszSKUId : LPWSTR optional -> LPCWSTR
# wszSKUIdType : LPWSTR optional -> LPCWSTR
# wszContentType : LPWSTR optional -> LPCWSTR
# wszContentName : LPWSTR optional -> LPCWSTR
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目