Win32 API 日本語リファレンス
ホームSecurity.Cryptography › CryptXmlCreateReference

CryptXmlCreateReference

関数
XML署名に対象データへのReference要素を作成する。
DLLCRYPTXML.dll呼出規約winapi対応OSWindows 7 以降

シグネチャ

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

HRESULT CryptXmlCreateReference(
    void* hCryptXml,
    DWORD dwFlags,
    LPCWSTR wszId,   // optional
    LPCWSTR wszURI,   // optional
    LPCWSTR wszType,   // optional
    const CRYPT_XML_ALGORITHM* pDigestMethod,
    DWORD cTransform,
    const CRYPT_XML_ALGORITHM* rgTransform,   // optional
    void** phReference
);

パラメーター

名前方向説明
hCryptXmlvoid*inXML 署名のハンドル。
dwFlagsDWORDin

参照の作成方法に影響するフラグを指定します。

現在定義されている dwFlags の値を次の表に示します。

意味
CRYPT_XML_FLAG_CREATE_REFERENCE_AS_OBJECT
0x00000001
Object ノードを作成して Signature 要素に追加するには、このフラグを設定します。Object ノードへの参照が SignedInfo 要素内に作成されます。

返されるハンドルはカプセル化された Object ノードであり、後続の CryptXmlCreateReference 関数の呼び出しで Manifest ノード内の参照を作成するために使用できます。

wszIdLPCWSTRinoptional署名の Reference 要素の ID 属性の値を含む、null で終わる Unicode 文字列へのポインター。 このパラメーターが NULL の場合、ID 属性は作成されません。 このパラメーターが空文字列の場合、空の値を持つ ID 属性が作成されます。
wszURILPCWSTRinoptional署名の Reference 要素の URI 属性の値を含む、null で終わる Unicode 文字列へのポインター。 このパラメーターが空文字列の場合、空の値を持つ URI 属性が作成されます。
wszTypeLPCWSTRinoptional署名の Reference 要素の Type 属性の値を含む、null で終わる Unicode 文字列へのポインター。 処理エンジンはこの属性をチェックも使用もしません。
pDigestMethodCRYPT_XML_ALGORITHM*inダイジェストメソッドを含む CRYPT_XML_ALGORITHM 構造体へのポインター。
cTransformDWORDinrgTransform パラメーターが指す配列の要素数。
rgTransformCRYPT_XML_ALGORITHM*inoptionalダイジェスト計算の前に参照データへ適用する変換アルゴリズムを含む、CRYPT_XML_ALGORITHM 構造体の順序付き配列へのポインター。
phReferencevoid**out参照ハンドルへのポインター。

戻り値の型: HRESULT

公式ドキュメント

XML 署名への参照を作成します。

戻り値

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

関数が失敗した場合は、エラーを示す HRESULT 値を返します。

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

各言語での呼び出し定義

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

HRESULT CryptXmlCreateReference(
    void* hCryptXml,
    DWORD dwFlags,
    LPCWSTR wszId,   // optional
    LPCWSTR wszURI,   // optional
    LPCWSTR wszType,   // optional
    const CRYPT_XML_ALGORITHM* pDigestMethod,
    DWORD cTransform,
    const CRYPT_XML_ALGORITHM* rgTransform,   // optional
    void** phReference
);
[DllImport("CRYPTXML.dll", ExactSpelling = true)]
static extern int CryptXmlCreateReference(
    IntPtr hCryptXml,   // void*
    uint dwFlags,   // DWORD
    [MarshalAs(UnmanagedType.LPWStr)] string wszId,   // LPCWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string wszURI,   // LPCWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string wszType,   // LPCWSTR optional
    IntPtr pDigestMethod,   // CRYPT_XML_ALGORITHM*
    uint cTransform,   // DWORD
    IntPtr rgTransform,   // CRYPT_XML_ALGORITHM* optional
    IntPtr phReference   // void** out
);
<DllImport("CRYPTXML.dll", ExactSpelling:=True)>
Public Shared Function CryptXmlCreateReference(
    hCryptXml As IntPtr,   ' void*
    dwFlags As UInteger,   ' DWORD
    <MarshalAs(UnmanagedType.LPWStr)> wszId As String,   ' LPCWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> wszURI As String,   ' LPCWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> wszType As String,   ' LPCWSTR optional
    pDigestMethod As IntPtr,   ' CRYPT_XML_ALGORITHM*
    cTransform As UInteger,   ' DWORD
    rgTransform As IntPtr,   ' CRYPT_XML_ALGORITHM* optional
    phReference As IntPtr   ' void** out
) As Integer
End Function
' hCryptXml : void*
' dwFlags : DWORD
' wszId : LPCWSTR optional
' wszURI : LPCWSTR optional
' wszType : LPCWSTR optional
' pDigestMethod : CRYPT_XML_ALGORITHM*
' cTransform : DWORD
' rgTransform : CRYPT_XML_ALGORITHM* optional
' phReference : void** out
Declare PtrSafe Function CryptXmlCreateReference Lib "cryptxml" ( _
    ByVal hCryptXml As LongPtr, _
    ByVal dwFlags As Long, _
    ByVal wszId As LongPtr, _
    ByVal wszURI As LongPtr, _
    ByVal wszType As LongPtr, _
    ByVal pDigestMethod As LongPtr, _
    ByVal cTransform As Long, _
    ByVal rgTransform As LongPtr, _
    ByVal phReference As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CryptXmlCreateReference = ctypes.windll.cryptxml.CryptXmlCreateReference
CryptXmlCreateReference.restype = ctypes.c_int
CryptXmlCreateReference.argtypes = [
    ctypes.POINTER(None),  # hCryptXml : void*
    wintypes.DWORD,  # dwFlags : DWORD
    wintypes.LPCWSTR,  # wszId : LPCWSTR optional
    wintypes.LPCWSTR,  # wszURI : LPCWSTR optional
    wintypes.LPCWSTR,  # wszType : LPCWSTR optional
    ctypes.c_void_p,  # pDigestMethod : CRYPT_XML_ALGORITHM*
    wintypes.DWORD,  # cTransform : DWORD
    ctypes.c_void_p,  # rgTransform : CRYPT_XML_ALGORITHM* optional
    ctypes.c_void_p,  # phReference : void** out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('CRYPTXML.dll')
CryptXmlCreateReference = Fiddle::Function.new(
  lib['CryptXmlCreateReference'],
  [
    Fiddle::TYPE_VOIDP,  # hCryptXml : void*
    -Fiddle::TYPE_INT,  # dwFlags : DWORD
    Fiddle::TYPE_VOIDP,  # wszId : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # wszURI : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # wszType : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # pDigestMethod : CRYPT_XML_ALGORITHM*
    -Fiddle::TYPE_INT,  # cTransform : DWORD
    Fiddle::TYPE_VOIDP,  # rgTransform : CRYPT_XML_ALGORITHM* optional
    Fiddle::TYPE_VOIDP,  # phReference : void** out
  ],
  Fiddle::TYPE_INT)
#[link(name = "cryptxml")]
extern "system" {
    fn CryptXmlCreateReference(
        hCryptXml: *mut (),  // void*
        dwFlags: u32,  // DWORD
        wszId: *const u16,  // LPCWSTR optional
        wszURI: *const u16,  // LPCWSTR optional
        wszType: *const u16,  // LPCWSTR optional
        pDigestMethod: *const CRYPT_XML_ALGORITHM,  // CRYPT_XML_ALGORITHM*
        cTransform: u32,  // DWORD
        rgTransform: *const CRYPT_XML_ALGORITHM,  // CRYPT_XML_ALGORITHM* optional
        phReference: *mut *mut ()  // void** out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("CRYPTXML.dll")]
public static extern int CryptXmlCreateReference(IntPtr hCryptXml, uint dwFlags, [MarshalAs(UnmanagedType.LPWStr)] string wszId, [MarshalAs(UnmanagedType.LPWStr)] string wszURI, [MarshalAs(UnmanagedType.LPWStr)] string wszType, IntPtr pDigestMethod, uint cTransform, IntPtr rgTransform, IntPtr phReference);
"@
$api = Add-Type -MemberDefinition $sig -Name 'CRYPTXML_CryptXmlCreateReference' -Namespace Win32 -PassThru
# $api::CryptXmlCreateReference(hCryptXml, dwFlags, wszId, wszURI, wszType, pDigestMethod, cTransform, rgTransform, phReference)
#uselib "CRYPTXML.dll"
#func global CryptXmlCreateReference "CryptXmlCreateReference" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; CryptXmlCreateReference hCryptXml, dwFlags, wszId, wszURI, wszType, varptr(pDigestMethod), cTransform, varptr(rgTransform), phReference   ; 戻り値は stat
; hCryptXml : void* -> "sptr"
; dwFlags : DWORD -> "sptr"
; wszId : LPCWSTR optional -> "sptr"
; wszURI : LPCWSTR optional -> "sptr"
; wszType : LPCWSTR optional -> "sptr"
; pDigestMethod : CRYPT_XML_ALGORITHM* -> "sptr"
; cTransform : DWORD -> "sptr"
; rgTransform : CRYPT_XML_ALGORITHM* optional -> "sptr"
; phReference : void** out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "CRYPTXML.dll"
#cfunc global CryptXmlCreateReference "CryptXmlCreateReference" sptr, int, wstr, wstr, wstr, var, int, var, sptr
; res = CryptXmlCreateReference(hCryptXml, dwFlags, wszId, wszURI, wszType, pDigestMethod, cTransform, rgTransform, phReference)
; hCryptXml : void* -> "sptr"
; dwFlags : DWORD -> "int"
; wszId : LPCWSTR optional -> "wstr"
; wszURI : LPCWSTR optional -> "wstr"
; wszType : LPCWSTR optional -> "wstr"
; pDigestMethod : CRYPT_XML_ALGORITHM* -> "var"
; cTransform : DWORD -> "int"
; rgTransform : CRYPT_XML_ALGORITHM* optional -> "var"
; phReference : void** out -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HRESULT CryptXmlCreateReference(void* hCryptXml, DWORD dwFlags, LPCWSTR wszId, LPCWSTR wszURI, LPCWSTR wszType, CRYPT_XML_ALGORITHM* pDigestMethod, DWORD cTransform, CRYPT_XML_ALGORITHM* rgTransform, void** phReference)
#uselib "CRYPTXML.dll"
#cfunc global CryptXmlCreateReference "CryptXmlCreateReference" intptr, int, wstr, wstr, wstr, var, int, var, intptr
; res = CryptXmlCreateReference(hCryptXml, dwFlags, wszId, wszURI, wszType, pDigestMethod, cTransform, rgTransform, phReference)
; hCryptXml : void* -> "intptr"
; dwFlags : DWORD -> "int"
; wszId : LPCWSTR optional -> "wstr"
; wszURI : LPCWSTR optional -> "wstr"
; wszType : LPCWSTR optional -> "wstr"
; pDigestMethod : CRYPT_XML_ALGORITHM* -> "var"
; cTransform : DWORD -> "int"
; rgTransform : CRYPT_XML_ALGORITHM* optional -> "var"
; phReference : void** out -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	cryptxml = windows.NewLazySystemDLL("CRYPTXML.dll")
	procCryptXmlCreateReference = cryptxml.NewProc("CryptXmlCreateReference")
)

// hCryptXml (void*), dwFlags (DWORD), wszId (LPCWSTR optional), wszURI (LPCWSTR optional), wszType (LPCWSTR optional), pDigestMethod (CRYPT_XML_ALGORITHM*), cTransform (DWORD), rgTransform (CRYPT_XML_ALGORITHM* optional), phReference (void** out)
r1, _, err := procCryptXmlCreateReference.Call(
	uintptr(hCryptXml),
	uintptr(dwFlags),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(wszId))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(wszURI))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(wszType))),
	uintptr(pDigestMethod),
	uintptr(cTransform),
	uintptr(rgTransform),
	uintptr(phReference),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function CryptXmlCreateReference(
  hCryptXml: Pointer;   // void*
  dwFlags: DWORD;   // DWORD
  wszId: PWideChar;   // LPCWSTR optional
  wszURI: PWideChar;   // LPCWSTR optional
  wszType: PWideChar;   // LPCWSTR optional
  pDigestMethod: Pointer;   // CRYPT_XML_ALGORITHM*
  cTransform: DWORD;   // DWORD
  rgTransform: Pointer;   // CRYPT_XML_ALGORITHM* optional
  phReference: Pointer   // void** out
): Integer; stdcall;
  external 'CRYPTXML.dll' name 'CryptXmlCreateReference';
result := DllCall("CRYPTXML\CryptXmlCreateReference"
    , "Ptr", hCryptXml   ; void*
    , "UInt", dwFlags   ; DWORD
    , "WStr", wszId   ; LPCWSTR optional
    , "WStr", wszURI   ; LPCWSTR optional
    , "WStr", wszType   ; LPCWSTR optional
    , "Ptr", pDigestMethod   ; CRYPT_XML_ALGORITHM*
    , "UInt", cTransform   ; DWORD
    , "Ptr", rgTransform   ; CRYPT_XML_ALGORITHM* optional
    , "Ptr", phReference   ; void** out
    , "Int")   ; return: HRESULT
●CryptXmlCreateReference(hCryptXml, dwFlags, wszId, wszURI, wszType, pDigestMethod, cTransform, rgTransform, phReference) = DLL("CRYPTXML.dll", "int CryptXmlCreateReference(void*, dword, char*, char*, char*, void*, dword, void*, void*)")
# 呼び出し: CryptXmlCreateReference(hCryptXml, dwFlags, wszId, wszURI, wszType, pDigestMethod, cTransform, rgTransform, phReference)
# hCryptXml : void* -> "void*"
# dwFlags : DWORD -> "dword"
# wszId : LPCWSTR optional -> "char*"
# wszURI : LPCWSTR optional -> "char*"
# wszType : LPCWSTR optional -> "char*"
# pDigestMethod : CRYPT_XML_ALGORITHM* -> "void*"
# cTransform : DWORD -> "dword"
# rgTransform : CRYPT_XML_ALGORITHM* optional -> "void*"
# phReference : void** out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef CryptXmlCreateReferenceNative = Int32 Function(Pointer<Void>, Uint32, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Void>, Uint32, Pointer<Void>, Pointer<Void>);
typedef CryptXmlCreateReferenceDart = int Function(Pointer<Void>, int, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Void>, int, Pointer<Void>, Pointer<Void>);
final CryptXmlCreateReference = DynamicLibrary.open('CRYPTXML.dll')
    .lookupFunction<CryptXmlCreateReferenceNative, CryptXmlCreateReferenceDart>('CryptXmlCreateReference');
// hCryptXml : void* -> Pointer<Void>
// dwFlags : DWORD -> Uint32
// wszId : LPCWSTR optional -> Pointer<Utf16>
// wszURI : LPCWSTR optional -> Pointer<Utf16>
// wszType : LPCWSTR optional -> Pointer<Utf16>
// pDigestMethod : CRYPT_XML_ALGORITHM* -> Pointer<Void>
// cTransform : DWORD -> Uint32
// rgTransform : CRYPT_XML_ALGORITHM* optional -> Pointer<Void>
// phReference : void** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CryptXmlCreateReference(
  hCryptXml: Pointer;   // void*
  dwFlags: DWORD;   // DWORD
  wszId: PWideChar;   // LPCWSTR optional
  wszURI: PWideChar;   // LPCWSTR optional
  wszType: PWideChar;   // LPCWSTR optional
  pDigestMethod: Pointer;   // CRYPT_XML_ALGORITHM*
  cTransform: DWORD;   // DWORD
  rgTransform: Pointer;   // CRYPT_XML_ALGORITHM* optional
  phReference: Pointer   // void** out
): Integer; stdcall;
  external 'CRYPTXML.dll' name 'CryptXmlCreateReference';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CryptXmlCreateReference"
  c_CryptXmlCreateReference :: Ptr () -> Word32 -> CWString -> CWString -> CWString -> Ptr () -> Word32 -> Ptr () -> Ptr () -> IO Int32
-- hCryptXml : void* -> Ptr ()
-- dwFlags : DWORD -> Word32
-- wszId : LPCWSTR optional -> CWString
-- wszURI : LPCWSTR optional -> CWString
-- wszType : LPCWSTR optional -> CWString
-- pDigestMethod : CRYPT_XML_ALGORITHM* -> Ptr ()
-- cTransform : DWORD -> Word32
-- rgTransform : CRYPT_XML_ALGORITHM* optional -> Ptr ()
-- phReference : void** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let cryptxmlcreatereference =
  foreign "CryptXmlCreateReference"
    ((ptr void) @-> uint32_t @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr void) @-> uint32_t @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* hCryptXml : void* -> (ptr void) *)
(* dwFlags : DWORD -> uint32_t *)
(* wszId : LPCWSTR optional -> (ptr uint16_t) *)
(* wszURI : LPCWSTR optional -> (ptr uint16_t) *)
(* wszType : LPCWSTR optional -> (ptr uint16_t) *)
(* pDigestMethod : CRYPT_XML_ALGORITHM* -> (ptr void) *)
(* cTransform : DWORD -> uint32_t *)
(* rgTransform : CRYPT_XML_ALGORITHM* optional -> (ptr void) *)
(* phReference : void** out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library cryptxml (t "CRYPTXML.dll"))
(cffi:use-foreign-library cryptxml)

(cffi:defcfun ("CryptXmlCreateReference" crypt-xml-create-reference :convention :stdcall) :int32
  (h-crypt-xml :pointer)   ; void*
  (dw-flags :uint32)   ; DWORD
  (wsz-id (:string :encoding :utf-16le))   ; LPCWSTR optional
  (wsz-uri (:string :encoding :utf-16le))   ; LPCWSTR optional
  (wsz-type (:string :encoding :utf-16le))   ; LPCWSTR optional
  (p-digest-method :pointer)   ; CRYPT_XML_ALGORITHM*
  (c-transform :uint32)   ; DWORD
  (rg-transform :pointer)   ; CRYPT_XML_ALGORITHM* optional
  (ph-reference :pointer))   ; void** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CryptXmlCreateReference = Win32::API::More->new('CRYPTXML',
    'int CryptXmlCreateReference(LPVOID hCryptXml, DWORD dwFlags, LPCWSTR wszId, LPCWSTR wszURI, LPCWSTR wszType, LPVOID pDigestMethod, DWORD cTransform, LPVOID rgTransform, LPVOID phReference)');
# my $ret = $CryptXmlCreateReference->Call($hCryptXml, $dwFlags, $wszId, $wszURI, $wszType, $pDigestMethod, $cTransform, $rgTransform, $phReference);
# hCryptXml : void* -> LPVOID
# dwFlags : DWORD -> DWORD
# wszId : LPCWSTR optional -> LPCWSTR
# wszURI : LPCWSTR optional -> LPCWSTR
# wszType : LPCWSTR optional -> LPCWSTR
# pDigestMethod : CRYPT_XML_ALGORITHM* -> LPVOID
# cTransform : DWORD -> DWORD
# rgTransform : CRYPT_XML_ALGORITHM* optional -> LPVOID
# phReference : void** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

使用する型