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

CertNameToStrA

関数
エンコードされた証明書名をANSIのX.500文字列に変換する。
DLLCRYPT32.dll文字セットANSI (-A)呼出規約winapi対応OSWindows XP 以降

シグネチャ

// CRYPT32.dll  (ANSI / -A)
#include <windows.h>

DWORD CertNameToStrA(
    CERT_QUERY_ENCODING_TYPE dwCertEncodingType,
    CRYPT_INTEGER_BLOB* pName,
    CERT_STRING_TYPE dwStrType,
    LPSTR psz,   // optional
    DWORD csz
);

パラメーター

名前方向説明
dwCertEncodingTypeCERT_QUERY_ENCODING_TYPEin

名前のエンコードに使用された certificate encoding type です。この値の上位 WORD に含まれる message encoding type 識別子は、この関数では無視されます。

このパラメーターには、現在定義されている以下の certificate encoding type を指定できます。

意味
X509_ASN_ENCODING
1 (0x1)
X.509 証明書エンコードを指定します。
pNameCRYPT_INTEGER_BLOB*in変換対象の CERT_NAME_BLOB 構造体へのポインターです。
dwStrTypeCERT_STRING_TYPEin

このパラメーターは、出力文字列の形式を指定します。また、文字列の内容に関するその他のオプションも指定します。

このパラメーターには、以下のいずれかの値を指定できます。

意味
CERT_SIMPLE_NAME_STR
1
すべての object identifiers (OID) が破棄されます。 CERT_RDN エントリは、カンマとそれに続くスペース (, ) で区切られます。1 つの CERT_RDN 内の複数の属性は、前後をスペースで囲んだプラス記号 ( + ) で区切られます。例: Microsoft, Kim Abercrombie + Programmer。
CERT_OID_NAME_STR
2
OID は、属性値との間を等号 (=) 区切りで含めて出力されます。CERT_RDN エントリは、カンマとそれに続くスペース (, ) で区切られます。1 つの CERT_RDN 内の複数の属性は、プラス記号とそれに続くスペース (+ ) で区切られます。
CERT_X500_NAME_STR
3
OID はその X.500 キー名に変換されます。それ以外は CERT_OID_NAME_STR と同じです。OID に対応する X.500 名が存在しない場合は、OID に OID というプレフィックスを付けて使用します。

RDN 値に先頭または末尾の空白、あるいは以下のいずれかの文字が含まれている場合、その値は引用符で囲まれます。

  • カンマ (,)
  • プラス記号 (+)
  • 等号 (=)
  • 二重引用符 (")
  • バックスラッシュとそれに続く文字 n (\n)
  • 小なり記号 (<)
  • 大なり記号 (>)
  • 番号記号 (#)
  • セミコロン (;)
引用文字は二重引用符 (") です。RDN 値に二重引用符が含まれる場合は、二重引用符 ("") で囲まれます。

上記の値と以下のオプションを組み合わせて、文字列に関する追加オプションを指定することもできます。

意味
CERT_NAME_STR_SEMICOLON_FLAG
0x40000000
カンマとそれに続くスペース (, ) の区切りを、セミコロンとそれに続くスペース (; ) の区切りに置き換えます。
CERT_NAME_STR_CRLF_FLAG
0x08000000
カンマとそれに続くスペース (, ) の区切りを、バックスラッシュ、文字 r、バックスラッシュ、文字 n の並び (\r\n) の区切りに置き換えます。
CERT_NAME_STR_NO_PLUS_FLAG
0x20000000
前後をスペースで囲んだプラス記号 ( + ) の区切りを、単一のスペース区切りに置き換えます。
CERT_NAME_STR_NO_QUOTING_FLAG
0x10000000
引用符による囲みを無効にします。
CERT_NAME_STR_REVERSE_FLAG
0x02000000
デコード後、識別名文字列内の RDN の順序を逆にします。このフラグは既定では設定されません。
CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG
0x00010000
既定では、CERT_RDN_T61_STRING の X.500 キー文字列は UTF8 としてデコードされます。UTF8 デコードに失敗した場合、X.500 キーは 8 ビット文字としてデコードされます。最初に UTF8 としてデコードを試みる処理をスキップするには、CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG を使用します。
CERT_NAME_STR_ENABLE_PUNYCODE_FLAG
0x00200000
pName パラメーターが指す名前に email RDN が含まれ、かつそのメールアドレスのホスト名部分に Punycode でエンコードされた IA5String が含まれている場合、その名前は対応する Unicode に変換されます。

Windows Server 2008、Windows Vista、Windows Server 2003、および Windows XP: この値はサポートされていません。

pszLPSTRoutoptional返される文字列を受け取る文字バッファーへのポインターです。このバッファーのサイズは csz パラメーターで指定します。
cszDWORDinpsz バッファーのサイズ (文字数)。このサイズには終端の null 文字を含める必要があります。

戻り値の型: DWORD

公式ドキュメント

CERT_NAME_BLOB 構造体内のエンコードされた名前を、null 終端の文字列に変換します。(ANSI)

戻り値

終端の null 文字を含む、変換された文字数を返します。

pszNULL、または csz が 0 の場合は、変換先文字列に必要なサイズを返します。

解説(Remarks)

pszNULL ではなく、かつ csz が 0 でない場合、返される psz は常に null 終端の文字列になります。

デコード時に順序の問題が発生する可能性を避けるため、複数コンポーネントの RDN (例: CN=James+O=Microsoft) の使用は推奨しません。代わりに、単一値の RDN (例: CN=James, O=Microsoft) の使用を検討してください。

文字列表現は、以下のリストで説明する相違点を除き、RFC 1779 の識別名仕様に従います。

さらに、以下の X.500 キー名は RFC 1779 には記載されていませんが、この API によって返される場合があります。
キー オブジェクト識別子文字列
E 1.2.840.113549.1.9.1
T 2.5.4.12
G 2.5.4.42
I 2.5.4.43
SN 2.5.4.4

この関数を使用する例については、

例: C プログラム — 証明書の名前を ASN.1 へ変換し元に戻す を参照してください。

メモ

wincrypt.h ヘッダーは CertNameToStr を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義しています。このエンコード中立のエイリアスの使用を、エンコード中立でないコードと混在させると、不一致が生じてコンパイル エラーや実行時エラーを引き起こす可能性があります。詳細については、関数プロトタイプの規則 を参照してください。

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

各言語での呼び出し定義

// CRYPT32.dll  (ANSI / -A)
#include <windows.h>

DWORD CertNameToStrA(
    CERT_QUERY_ENCODING_TYPE dwCertEncodingType,
    CRYPT_INTEGER_BLOB* pName,
    CERT_STRING_TYPE dwStrType,
    LPSTR psz,   // optional
    DWORD csz
);
[DllImport("CRYPT32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern uint CertNameToStrA(
    uint dwCertEncodingType,   // CERT_QUERY_ENCODING_TYPE
    IntPtr pName,   // CRYPT_INTEGER_BLOB*
    uint dwStrType,   // CERT_STRING_TYPE
    [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder psz,   // LPSTR optional, out
    uint csz   // DWORD
);
<DllImport("CRYPT32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function CertNameToStrA(
    dwCertEncodingType As UInteger,   ' CERT_QUERY_ENCODING_TYPE
    pName As IntPtr,   ' CRYPT_INTEGER_BLOB*
    dwStrType As UInteger,   ' CERT_STRING_TYPE
    <MarshalAs(UnmanagedType.LPStr)> psz As System.Text.StringBuilder,   ' LPSTR optional, out
    csz As UInteger   ' DWORD
) As UInteger
End Function
' dwCertEncodingType : CERT_QUERY_ENCODING_TYPE
' pName : CRYPT_INTEGER_BLOB*
' dwStrType : CERT_STRING_TYPE
' psz : LPSTR optional, out
' csz : DWORD
Declare PtrSafe Function CertNameToStrA Lib "crypt32" ( _
    ByVal dwCertEncodingType As Long, _
    ByVal pName As LongPtr, _
    ByVal dwStrType As Long, _
    ByVal psz As String, _
    ByVal csz As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CertNameToStrA = ctypes.windll.crypt32.CertNameToStrA
CertNameToStrA.restype = wintypes.DWORD
CertNameToStrA.argtypes = [
    wintypes.DWORD,  # dwCertEncodingType : CERT_QUERY_ENCODING_TYPE
    ctypes.c_void_p,  # pName : CRYPT_INTEGER_BLOB*
    wintypes.DWORD,  # dwStrType : CERT_STRING_TYPE
    wintypes.LPSTR,  # psz : LPSTR optional, out
    wintypes.DWORD,  # csz : DWORD
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('CRYPT32.dll')
CertNameToStrA = Fiddle::Function.new(
  lib['CertNameToStrA'],
  [
    -Fiddle::TYPE_INT,  # dwCertEncodingType : CERT_QUERY_ENCODING_TYPE
    Fiddle::TYPE_VOIDP,  # pName : CRYPT_INTEGER_BLOB*
    -Fiddle::TYPE_INT,  # dwStrType : CERT_STRING_TYPE
    Fiddle::TYPE_VOIDP,  # psz : LPSTR optional, out
    -Fiddle::TYPE_INT,  # csz : DWORD
  ],
  -Fiddle::TYPE_INT)
#[link(name = "crypt32")]
extern "system" {
    fn CertNameToStrA(
        dwCertEncodingType: u32,  // CERT_QUERY_ENCODING_TYPE
        pName: *mut CRYPT_INTEGER_BLOB,  // CRYPT_INTEGER_BLOB*
        dwStrType: u32,  // CERT_STRING_TYPE
        psz: *mut u8,  // LPSTR optional, out
        csz: u32  // DWORD
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("CRYPT32.dll", CharSet = CharSet.Ansi)]
public static extern uint CertNameToStrA(uint dwCertEncodingType, IntPtr pName, uint dwStrType, [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder psz, uint csz);
"@
$api = Add-Type -MemberDefinition $sig -Name 'CRYPT32_CertNameToStrA' -Namespace Win32 -PassThru
# $api::CertNameToStrA(dwCertEncodingType, pName, dwStrType, psz, csz)
#uselib "CRYPT32.dll"
#func global CertNameToStrA "CertNameToStrA" sptr, sptr, sptr, sptr, sptr
; CertNameToStrA dwCertEncodingType, varptr(pName), dwStrType, varptr(psz), csz   ; 戻り値は stat
; dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> "sptr"
; pName : CRYPT_INTEGER_BLOB* -> "sptr"
; dwStrType : CERT_STRING_TYPE -> "sptr"
; psz : LPSTR optional, out -> "sptr"
; csz : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "CRYPT32.dll"
#cfunc global CertNameToStrA "CertNameToStrA" int, var, int, var, int
; res = CertNameToStrA(dwCertEncodingType, pName, dwStrType, psz, csz)
; dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> "int"
; pName : CRYPT_INTEGER_BLOB* -> "var"
; dwStrType : CERT_STRING_TYPE -> "int"
; psz : LPSTR optional, out -> "var"
; csz : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD CertNameToStrA(CERT_QUERY_ENCODING_TYPE dwCertEncodingType, CRYPT_INTEGER_BLOB* pName, CERT_STRING_TYPE dwStrType, LPSTR psz, DWORD csz)
#uselib "CRYPT32.dll"
#cfunc global CertNameToStrA "CertNameToStrA" int, var, int, var, int
; res = CertNameToStrA(dwCertEncodingType, pName, dwStrType, psz, csz)
; dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> "int"
; pName : CRYPT_INTEGER_BLOB* -> "var"
; dwStrType : CERT_STRING_TYPE -> "int"
; psz : LPSTR optional, out -> "var"
; csz : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	crypt32 = windows.NewLazySystemDLL("CRYPT32.dll")
	procCertNameToStrA = crypt32.NewProc("CertNameToStrA")
)

// dwCertEncodingType (CERT_QUERY_ENCODING_TYPE), pName (CRYPT_INTEGER_BLOB*), dwStrType (CERT_STRING_TYPE), psz (LPSTR optional, out), csz (DWORD)
r1, _, err := procCertNameToStrA.Call(
	uintptr(dwCertEncodingType),
	uintptr(pName),
	uintptr(dwStrType),
	uintptr(psz),
	uintptr(csz),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function CertNameToStrA(
  dwCertEncodingType: DWORD;   // CERT_QUERY_ENCODING_TYPE
  pName: Pointer;   // CRYPT_INTEGER_BLOB*
  dwStrType: DWORD;   // CERT_STRING_TYPE
  psz: PAnsiChar;   // LPSTR optional, out
  csz: DWORD   // DWORD
): DWORD; stdcall;
  external 'CRYPT32.dll' name 'CertNameToStrA';
result := DllCall("CRYPT32\CertNameToStrA"
    , "UInt", dwCertEncodingType   ; CERT_QUERY_ENCODING_TYPE
    , "Ptr", pName   ; CRYPT_INTEGER_BLOB*
    , "UInt", dwStrType   ; CERT_STRING_TYPE
    , "Ptr", psz   ; LPSTR optional, out
    , "UInt", csz   ; DWORD
    , "UInt")   ; return: DWORD
●CertNameToStrA(dwCertEncodingType, pName, dwStrType, psz, csz) = DLL("CRYPT32.dll", "dword CertNameToStrA(dword, void*, dword, char*, dword)")
# 呼び出し: CertNameToStrA(dwCertEncodingType, pName, dwStrType, psz, csz)
# dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> "dword"
# pName : CRYPT_INTEGER_BLOB* -> "void*"
# dwStrType : CERT_STRING_TYPE -> "dword"
# psz : LPSTR optional, out -> "char*"
# csz : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "crypt32" fn CertNameToStrA(
    dwCertEncodingType: u32, // CERT_QUERY_ENCODING_TYPE
    pName: [*c]CRYPT_INTEGER_BLOB, // CRYPT_INTEGER_BLOB*
    dwStrType: u32, // CERT_STRING_TYPE
    psz: [*c]u8, // LPSTR optional, out
    csz: u32 // DWORD
) callconv(std.os.windows.WINAPI) u32;
proc CertNameToStrA(
    dwCertEncodingType: uint32,  # CERT_QUERY_ENCODING_TYPE
    pName: ptr CRYPT_INTEGER_BLOB,  # CRYPT_INTEGER_BLOB*
    dwStrType: uint32,  # CERT_STRING_TYPE
    psz: ptr char,  # LPSTR optional, out
    csz: uint32  # DWORD
): uint32 {.importc: "CertNameToStrA", stdcall, dynlib: "CRYPT32.dll".}
pragma(lib, "crypt32");
extern(Windows)
uint CertNameToStrA(
    uint dwCertEncodingType,   // CERT_QUERY_ENCODING_TYPE
    CRYPT_INTEGER_BLOB* pName,   // CRYPT_INTEGER_BLOB*
    uint dwStrType,   // CERT_STRING_TYPE
    char* psz,   // LPSTR optional, out
    uint csz   // DWORD
);
ccall((:CertNameToStrA, "CRYPT32.dll"), stdcall, UInt32,
      (UInt32, Ptr{CRYPT_INTEGER_BLOB}, UInt32, Ptr{UInt8}, UInt32),
      dwCertEncodingType, pName, dwStrType, psz, csz)
# dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> UInt32
# pName : CRYPT_INTEGER_BLOB* -> Ptr{CRYPT_INTEGER_BLOB}
# dwStrType : CERT_STRING_TYPE -> UInt32
# psz : LPSTR optional, out -> Ptr{UInt8}
# csz : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t CertNameToStrA(
    uint32_t dwCertEncodingType,
    void* pName,
    uint32_t dwStrType,
    char* psz,
    uint32_t csz);
]]
local crypt32 = ffi.load("crypt32")
-- crypt32.CertNameToStrA(dwCertEncodingType, pName, dwStrType, psz, csz)
-- dwCertEncodingType : CERT_QUERY_ENCODING_TYPE
-- pName : CRYPT_INTEGER_BLOB*
-- dwStrType : CERT_STRING_TYPE
-- psz : LPSTR optional, out
-- csz : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('CRYPT32.dll');
const CertNameToStrA = lib.func('__stdcall', 'CertNameToStrA', 'uint32_t', ['uint32_t', 'void *', 'uint32_t', 'char *', 'uint32_t']);
// CertNameToStrA(dwCertEncodingType, pName, dwStrType, psz, csz)
// dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> 'uint32_t'
// pName : CRYPT_INTEGER_BLOB* -> 'void *'
// dwStrType : CERT_STRING_TYPE -> 'uint32_t'
// psz : LPSTR optional, out -> 'char *'
// csz : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("CRYPT32.dll", {
  CertNameToStrA: { parameters: ["u32", "pointer", "u32", "buffer", "u32"], result: "u32" },
});
// lib.symbols.CertNameToStrA(dwCertEncodingType, pName, dwStrType, psz, csz)
// dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> "u32"
// pName : CRYPT_INTEGER_BLOB* -> "pointer"
// dwStrType : CERT_STRING_TYPE -> "u32"
// psz : LPSTR optional, out -> "buffer"
// csz : DWORD -> "u32"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t CertNameToStrA(
    uint32_t dwCertEncodingType,
    void* pName,
    uint32_t dwStrType,
    char* psz,
    uint32_t csz);
C, "CRYPT32.dll");
// $ffi->CertNameToStrA(dwCertEncodingType, pName, dwStrType, psz, csz);
// dwCertEncodingType : CERT_QUERY_ENCODING_TYPE
// pName : CRYPT_INTEGER_BLOB*
// dwStrType : CERT_STRING_TYPE
// psz : LPSTR optional, out
// csz : DWORD
// 構造体/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 Crypt32 extends StdCallLibrary {
    Crypt32 INSTANCE = Native.load("crypt32", Crypt32.class, W32APIOptions.ASCII_OPTIONS);
    int CertNameToStrA(
        int dwCertEncodingType,   // CERT_QUERY_ENCODING_TYPE
        Pointer pName,   // CRYPT_INTEGER_BLOB*
        int dwStrType,   // CERT_STRING_TYPE
        byte[] psz,   // LPSTR optional, out
        int csz   // DWORD
    );
}
@[Link("crypt32")]
lib LibCRYPT32
  fun CertNameToStrA = CertNameToStrA(
    dwCertEncodingType : UInt32,   # CERT_QUERY_ENCODING_TYPE
    pName : CRYPT_INTEGER_BLOB*,   # CRYPT_INTEGER_BLOB*
    dwStrType : UInt32,   # CERT_STRING_TYPE
    psz : UInt8*,   # LPSTR optional, out
    csz : UInt32   # DWORD
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CertNameToStrANative = Uint32 Function(Uint32, Pointer<Void>, Uint32, Pointer<Utf8>, Uint32);
typedef CertNameToStrADart = int Function(int, Pointer<Void>, int, Pointer<Utf8>, int);
final CertNameToStrA = DynamicLibrary.open('CRYPT32.dll')
    .lookupFunction<CertNameToStrANative, CertNameToStrADart>('CertNameToStrA');
// dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> Uint32
// pName : CRYPT_INTEGER_BLOB* -> Pointer<Void>
// dwStrType : CERT_STRING_TYPE -> Uint32
// psz : LPSTR optional, out -> Pointer<Utf8>
// csz : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CertNameToStrA(
  dwCertEncodingType: DWORD;   // CERT_QUERY_ENCODING_TYPE
  pName: Pointer;   // CRYPT_INTEGER_BLOB*
  dwStrType: DWORD;   // CERT_STRING_TYPE
  psz: PAnsiChar;   // LPSTR optional, out
  csz: DWORD   // DWORD
): DWORD; stdcall;
  external 'CRYPT32.dll' name 'CertNameToStrA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CertNameToStrA"
  c_CertNameToStrA :: Word32 -> Ptr () -> Word32 -> CString -> Word32 -> IO Word32
-- dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> Word32
-- pName : CRYPT_INTEGER_BLOB* -> Ptr ()
-- dwStrType : CERT_STRING_TYPE -> Word32
-- psz : LPSTR optional, out -> CString
-- csz : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let certnametostra =
  foreign "CertNameToStrA"
    (uint32_t @-> (ptr void) @-> uint32_t @-> string @-> uint32_t @-> returning uint32_t)
(* dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> uint32_t *)
(* pName : CRYPT_INTEGER_BLOB* -> (ptr void) *)
(* dwStrType : CERT_STRING_TYPE -> uint32_t *)
(* psz : LPSTR optional, out -> string *)
(* csz : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library crypt32 (t "CRYPT32.dll"))
(cffi:use-foreign-library crypt32)

(cffi:defcfun ("CertNameToStrA" cert-name-to-str-a :convention :stdcall) :uint32
  (dw-cert-encoding-type :uint32)   ; CERT_QUERY_ENCODING_TYPE
  (p-name :pointer)   ; CRYPT_INTEGER_BLOB*
  (dw-str-type :uint32)   ; CERT_STRING_TYPE
  (psz :pointer)   ; LPSTR optional, out
  (csz :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CertNameToStrA = Win32::API::More->new('CRYPT32',
    'DWORD CertNameToStrA(DWORD dwCertEncodingType, LPVOID pName, DWORD dwStrType, LPSTR psz, DWORD csz)');
# my $ret = $CertNameToStrA->Call($dwCertEncodingType, $pName, $dwStrType, $psz, $csz);
# dwCertEncodingType : CERT_QUERY_ENCODING_TYPE -> DWORD
# pName : CRYPT_INTEGER_BLOB* -> LPVOID
# dwStrType : CERT_STRING_TYPE -> DWORD
# psz : LPSTR optional, out -> LPSTR
# csz : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

文字セット違い
公式の関連項目
使用する型