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

DRMGetUserInfo

関数
RMSユーザーの名前やIDなどの情報を取得する。
DLLmsdrm.dll呼出規約winapi

シグネチャ

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

HRESULT DRMGetUserInfo(
    DWORD hUser,
    DWORD* puUserNameLength,
    LPWSTR wszUserName,   // optional
    DWORD* puUserIdLength,
    LPWSTR wszUserId,   // optional
    DWORD* puUserIdTypeLength,
    LPWSTR wszUserIdType   // optional
);

パラメーター

名前型方向説明
hUserDWORDin情報を取得する対象のユーザーのハンドル。
puUserNameLengthDWORD*inout

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

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

wszUserNameLPWSTRoutoptional

null で終わる Unicode 文字列へのポインター。完全修飾された SMTP 電子メール アドレスの形式でユーザー名を受け取ります。これは強制されるものではなく、ID の確認に使用されるものでもありません。人間が読める識別情報を提供する目的でのみ含まれています。このバッファーのサイズは puUserNameLength パラメーターで指定します。

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

puUserIdLengthDWORD*inout

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

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

wszUserIdLPWSTRoutoptional

null で終わる Unicode 文字列へのポインター。ユーザーの ID を受け取ります。このバッファーのサイズは puUserIdLength パラメーターで指定します。

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

puUserIdTypeLengthDWORD*inout

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

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

wszUserIdTypeLPWSTRoutoptional

null で終わる Unicode 文字列へのポインター。ユーザーの識別に使用される ID の種類 (Passport、Windows、その他など) を受け取ります。このバッファーのサイズは puUserIdTypeLength パラメーターで指定します。

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

戻り値の型: HRESULT

公式ドキュメント

ユーザーに関する情報を取得します。

戻り値

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

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

解説(Remarks)

ユーザー ID および ID の種類の詳細については、DRMCreateUser を参照してください。

出力値を取得する際は、まず wszUserName、wszUserId、wszUserIdType に NULL を設定してこの関数を呼び出し、puUserNameLength、puUserIdLength、puUserIdTypeLength を通じて必要なバッファー サイズを取得できます。バッファー領域の割り当てと解放は、アプリケーションが行う必要があります。

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

各言語での呼び出し定義

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

HRESULT DRMGetUserInfo(
    DWORD hUser,
    DWORD* puUserNameLength,
    LPWSTR wszUserName,   // optional
    DWORD* puUserIdLength,
    LPWSTR wszUserId,   // optional
    DWORD* puUserIdTypeLength,
    LPWSTR wszUserIdType   // optional
);
[DllImport("msdrm.dll", ExactSpelling = true)]
static extern int DRMGetUserInfo(
    uint hUser,   // DWORD
    ref uint puUserNameLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszUserName,   // LPWSTR optional, out
    ref uint puUserIdLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszUserId,   // LPWSTR optional, out
    ref uint puUserIdTypeLength,   // DWORD* in/out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder wszUserIdType   // LPWSTR optional, out
);
<DllImport("msdrm.dll", ExactSpelling:=True)>
Public Shared Function DRMGetUserInfo(
    hUser As UInteger,   ' DWORD
    ByRef puUserNameLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszUserName As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef puUserIdLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszUserId As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef puUserIdTypeLength As UInteger,   ' DWORD* in/out
    <MarshalAs(UnmanagedType.LPWStr)> wszUserIdType As System.Text.StringBuilder   ' LPWSTR optional, out
) As Integer
End Function
' hUser : DWORD
' puUserNameLength : DWORD* in/out
' wszUserName : LPWSTR optional, out
' puUserIdLength : DWORD* in/out
' wszUserId : LPWSTR optional, out
' puUserIdTypeLength : DWORD* in/out
' wszUserIdType : LPWSTR optional, out
Declare PtrSafe Function DRMGetUserInfo Lib "msdrm" ( _
    ByVal hUser As Long, _
    ByRef puUserNameLength As Long, _
    ByVal wszUserName As LongPtr, _
    ByRef puUserIdLength As Long, _
    ByVal wszUserId As LongPtr, _
    ByRef puUserIdTypeLength As Long, _
    ByVal wszUserIdType As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

DRMGetUserInfo = ctypes.windll.msdrm.DRMGetUserInfo
DRMGetUserInfo.restype = ctypes.c_int
DRMGetUserInfo.argtypes = [
    wintypes.DWORD,  # hUser : DWORD
    ctypes.POINTER(wintypes.DWORD),  # puUserNameLength : DWORD* in/out
    wintypes.LPWSTR,  # wszUserName : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # puUserIdLength : DWORD* in/out
    wintypes.LPWSTR,  # wszUserId : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # puUserIdTypeLength : DWORD* in/out
    wintypes.LPWSTR,  # wszUserIdType : LPWSTR optional, out
]
require 'fiddle'
require 'fiddle/import'

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

var (
	msdrm = windows.NewLazySystemDLL("msdrm.dll")
	procDRMGetUserInfo = msdrm.NewProc("DRMGetUserInfo")
)

// hUser (DWORD), puUserNameLength (DWORD* in/out), wszUserName (LPWSTR optional, out), puUserIdLength (DWORD* in/out), wszUserId (LPWSTR optional, out), puUserIdTypeLength (DWORD* in/out), wszUserIdType (LPWSTR optional, out)
r1, _, err := procDRMGetUserInfo.Call(
	uintptr(hUser),
	uintptr(puUserNameLength),
	uintptr(wszUserName),
	uintptr(puUserIdLength),
	uintptr(wszUserId),
	uintptr(puUserIdTypeLength),
	uintptr(wszUserIdType),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function DRMGetUserInfo(
  hUser: DWORD;   // DWORD
  puUserNameLength: Pointer;   // DWORD* in/out
  wszUserName: PWideChar;   // LPWSTR optional, out
  puUserIdLength: Pointer;   // DWORD* in/out
  wszUserId: PWideChar;   // LPWSTR optional, out
  puUserIdTypeLength: Pointer;   // DWORD* in/out
  wszUserIdType: PWideChar   // LPWSTR optional, out
): Integer; stdcall;
  external 'msdrm.dll' name 'DRMGetUserInfo';
result := DllCall("msdrm\DRMGetUserInfo"
    , "UInt", hUser   ; DWORD
    , "Ptr", puUserNameLength   ; DWORD* in/out
    , "Ptr", wszUserName   ; LPWSTR optional, out
    , "Ptr", puUserIdLength   ; DWORD* in/out
    , "Ptr", wszUserId   ; LPWSTR optional, out
    , "Ptr", puUserIdTypeLength   ; DWORD* in/out
    , "Ptr", wszUserIdType   ; LPWSTR optional, out
    , "Int")   ; return: HRESULT
●DRMGetUserInfo(hUser, puUserNameLength, wszUserName, puUserIdLength, wszUserId, puUserIdTypeLength, wszUserIdType) = DLL("msdrm.dll", "int DRMGetUserInfo(dword, void*, char*, void*, char*, void*, char*)")
# 呼び出し: DRMGetUserInfo(hUser, puUserNameLength, wszUserName, puUserIdLength, wszUserId, puUserIdTypeLength, wszUserIdType)
# hUser : DWORD -> "dword"
# puUserNameLength : DWORD* in/out -> "void*"
# wszUserName : LPWSTR optional, out -> "char*"
# puUserIdLength : DWORD* in/out -> "void*"
# wszUserId : LPWSTR optional, out -> "char*"
# puUserIdTypeLength : DWORD* in/out -> "void*"
# wszUserIdType : LPWSTR optional, out -> "char*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "msdrm" fn DRMGetUserInfo(
    hUser: u32, // DWORD
    puUserNameLength: [*c]u32, // DWORD* in/out
    wszUserName: [*c]u16, // LPWSTR optional, out
    puUserIdLength: [*c]u32, // DWORD* in/out
    wszUserId: [*c]u16, // LPWSTR optional, out
    puUserIdTypeLength: [*c]u32, // DWORD* in/out
    wszUserIdType: [*c]u16 // LPWSTR optional, out
) callconv(std.os.windows.WINAPI) i32;
proc DRMGetUserInfo(
    hUser: uint32,  # DWORD
    puUserNameLength: ptr uint32,  # DWORD* in/out
    wszUserName: ptr uint16,  # LPWSTR optional, out
    puUserIdLength: ptr uint32,  # DWORD* in/out
    wszUserId: ptr uint16,  # LPWSTR optional, out
    puUserIdTypeLength: ptr uint32,  # DWORD* in/out
    wszUserIdType: ptr uint16  # LPWSTR optional, out
): int32 {.importc: "DRMGetUserInfo", stdcall, dynlib: "msdrm.dll".}
pragma(lib, "msdrm");
extern(Windows)
int DRMGetUserInfo(
    uint hUser,   // DWORD
    uint* puUserNameLength,   // DWORD* in/out
    wchar* wszUserName,   // LPWSTR optional, out
    uint* puUserIdLength,   // DWORD* in/out
    wchar* wszUserId,   // LPWSTR optional, out
    uint* puUserIdTypeLength,   // DWORD* in/out
    wchar* wszUserIdType   // LPWSTR optional, out
);
ccall((:DRMGetUserInfo, "msdrm.dll"), stdcall, Int32,
      (UInt32, Ptr{UInt32}, Ptr{UInt16}, Ptr{UInt32}, Ptr{UInt16}, Ptr{UInt32}, Ptr{UInt16}),
      hUser, puUserNameLength, wszUserName, puUserIdLength, wszUserId, puUserIdTypeLength, wszUserIdType)
# hUser : DWORD -> UInt32
# puUserNameLength : DWORD* in/out -> Ptr{UInt32}
# wszUserName : LPWSTR optional, out -> Ptr{UInt16}
# puUserIdLength : DWORD* in/out -> Ptr{UInt32}
# wszUserId : LPWSTR optional, out -> Ptr{UInt16}
# puUserIdTypeLength : DWORD* in/out -> Ptr{UInt32}
# wszUserIdType : LPWSTR optional, out -> Ptr{UInt16}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t DRMGetUserInfo(
    uint32_t hUser,
    uint32_t* puUserNameLength,
    uint16_t* wszUserName,
    uint32_t* puUserIdLength,
    uint16_t* wszUserId,
    uint32_t* puUserIdTypeLength,
    uint16_t* wszUserIdType);
]]
local msdrm = ffi.load("msdrm")
-- msdrm.DRMGetUserInfo(hUser, puUserNameLength, wszUserName, puUserIdLength, wszUserId, puUserIdTypeLength, wszUserIdType)
-- hUser : DWORD
-- puUserNameLength : DWORD* in/out
-- wszUserName : LPWSTR optional, out
-- puUserIdLength : DWORD* in/out
-- wszUserId : LPWSTR optional, out
-- puUserIdTypeLength : DWORD* in/out
-- wszUserIdType : LPWSTR optional, out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('msdrm.dll');
const DRMGetUserInfo = lib.func('__stdcall', 'DRMGetUserInfo', 'int32_t', ['uint32_t', 'uint32_t *', 'uint16_t *', 'uint32_t *', 'uint16_t *', 'uint32_t *', 'uint16_t *']);
// DRMGetUserInfo(hUser, puUserNameLength, wszUserName, puUserIdLength, wszUserId, puUserIdTypeLength, wszUserIdType)
// hUser : DWORD -> 'uint32_t'
// puUserNameLength : DWORD* in/out -> 'uint32_t *'
// wszUserName : LPWSTR optional, out -> 'uint16_t *'
// puUserIdLength : DWORD* in/out -> 'uint32_t *'
// wszUserId : LPWSTR optional, out -> 'uint16_t *'
// puUserIdTypeLength : DWORD* in/out -> 'uint32_t *'
// wszUserIdType : LPWSTR optional, out -> 'uint16_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("msdrm.dll", {
  DRMGetUserInfo: { parameters: ["u32", "pointer", "buffer", "pointer", "buffer", "pointer", "buffer"], result: "i32" },
});
// lib.symbols.DRMGetUserInfo(hUser, puUserNameLength, wszUserName, puUserIdLength, wszUserId, puUserIdTypeLength, wszUserIdType)
// hUser : DWORD -> "u32"
// puUserNameLength : DWORD* in/out -> "pointer"
// wszUserName : LPWSTR optional, out -> "buffer"
// puUserIdLength : DWORD* in/out -> "pointer"
// wszUserId : LPWSTR optional, out -> "buffer"
// puUserIdTypeLength : DWORD* in/out -> "pointer"
// wszUserIdType : LPWSTR optional, out -> "buffer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t DRMGetUserInfo(
    uint32_t hUser,
    uint32_t* puUserNameLength,
    uint16_t* wszUserName,
    uint32_t* puUserIdLength,
    uint16_t* wszUserId,
    uint32_t* puUserIdTypeLength,
    uint16_t* wszUserIdType);
C, "msdrm.dll");
// $ffi->DRMGetUserInfo(hUser, puUserNameLength, wszUserName, puUserIdLength, wszUserId, puUserIdTypeLength, wszUserIdType);
// hUser : DWORD
// puUserNameLength : DWORD* in/out
// wszUserName : LPWSTR optional, out
// puUserIdLength : DWORD* in/out
// wszUserId : LPWSTR optional, out
// puUserIdTypeLength : DWORD* in/out
// wszUserIdType : 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 DRMGetUserInfo(
        int hUser,   // DWORD
        IntByReference puUserNameLength,   // DWORD* in/out
        char[] wszUserName,   // LPWSTR optional, out
        IntByReference puUserIdLength,   // DWORD* in/out
        char[] wszUserId,   // LPWSTR optional, out
        IntByReference puUserIdTypeLength,   // DWORD* in/out
        char[] wszUserIdType   // LPWSTR optional, out
    );
}
@[Link("msdrm")]
lib Libmsdrm
  fun DRMGetUserInfo = DRMGetUserInfo(
    hUser : UInt32,   # DWORD
    puUserNameLength : UInt32*,   # DWORD* in/out
    wszUserName : UInt16*,   # LPWSTR optional, out
    puUserIdLength : UInt32*,   # DWORD* in/out
    wszUserId : UInt16*,   # LPWSTR optional, out
    puUserIdTypeLength : UInt32*,   # DWORD* in/out
    wszUserIdType : 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 DRMGetUserInfoNative = Int32 Function(Uint32, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>);
typedef DRMGetUserInfoDart = int Function(int, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>, Pointer<Uint32>, Pointer<Utf16>);
final DRMGetUserInfo = DynamicLibrary.open('msdrm.dll')
    .lookupFunction<DRMGetUserInfoNative, DRMGetUserInfoDart>('DRMGetUserInfo');
// hUser : DWORD -> Uint32
// puUserNameLength : DWORD* in/out -> Pointer<Uint32>
// wszUserName : LPWSTR optional, out -> Pointer<Utf16>
// puUserIdLength : DWORD* in/out -> Pointer<Uint32>
// wszUserId : LPWSTR optional, out -> Pointer<Utf16>
// puUserIdTypeLength : DWORD* in/out -> Pointer<Uint32>
// wszUserIdType : LPWSTR optional, out -> Pointer<Utf16>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function DRMGetUserInfo(
  hUser: DWORD;   // DWORD
  puUserNameLength: Pointer;   // DWORD* in/out
  wszUserName: PWideChar;   // LPWSTR optional, out
  puUserIdLength: Pointer;   // DWORD* in/out
  wszUserId: PWideChar;   // LPWSTR optional, out
  puUserIdTypeLength: Pointer;   // DWORD* in/out
  wszUserIdType: PWideChar   // LPWSTR optional, out
): Integer; stdcall;
  external 'msdrm.dll' name 'DRMGetUserInfo';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "DRMGetUserInfo"
  c_DRMGetUserInfo :: Word32 -> Ptr Word32 -> CWString -> Ptr Word32 -> CWString -> Ptr Word32 -> CWString -> IO Int32
-- hUser : DWORD -> Word32
-- puUserNameLength : DWORD* in/out -> Ptr Word32
-- wszUserName : LPWSTR optional, out -> CWString
-- puUserIdLength : DWORD* in/out -> Ptr Word32
-- wszUserId : LPWSTR optional, out -> CWString
-- puUserIdTypeLength : DWORD* in/out -> Ptr Word32
-- wszUserIdType : LPWSTR optional, out -> CWString
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let drmgetuserinfo =
  foreign "DRMGetUserInfo"
    (uint32_t @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> returning int32_t)
(* hUser : DWORD -> uint32_t *)
(* puUserNameLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszUserName : LPWSTR optional, out -> (ptr uint16_t) *)
(* puUserIdLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszUserId : LPWSTR optional, out -> (ptr uint16_t) *)
(* puUserIdTypeLength : DWORD* in/out -> (ptr uint32_t) *)
(* wszUserIdType : 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 ("DRMGetUserInfo" drmget-user-info :convention :stdcall) :int32
  (h-user :uint32)   ; DWORD
  (pu-user-name-length :pointer)   ; DWORD* in/out
  (wsz-user-name :pointer)   ; LPWSTR optional, out
  (pu-user-id-length :pointer)   ; DWORD* in/out
  (wsz-user-id :pointer)   ; LPWSTR optional, out
  (pu-user-id-type-length :pointer)   ; DWORD* in/out
  (wsz-user-id-type :pointer))   ; LPWSTR optional, out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $DRMGetUserInfo = Win32::API::More->new('msdrm',
    'int DRMGetUserInfo(DWORD hUser, LPVOID puUserNameLength, LPWSTR wszUserName, LPVOID puUserIdLength, LPWSTR wszUserId, LPVOID puUserIdTypeLength, LPWSTR wszUserIdType)');
# my $ret = $DRMGetUserInfo->Call($hUser, $puUserNameLength, $wszUserName, $puUserIdLength, $wszUserId, $puUserIdTypeLength, $wszUserIdType);
# hUser : DWORD -> DWORD
# puUserNameLength : DWORD* in/out -> LPVOID
# wszUserName : LPWSTR optional, out -> LPWSTR
# puUserIdLength : DWORD* in/out -> LPVOID
# wszUserId : LPWSTR optional, out -> LPWSTR
# puUserIdTypeLength : DWORD* in/out -> LPVOID
# wszUserIdType : LPWSTR optional, out -> LPWSTR
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目