Win32 API 日本語リファレンス
ホームSystem.Performance › PdhOpenLogW

PdhOpenLogW

関数
パフォーマンスデータのログファイルを開く。
DLLpdh.dll文字セットUnicode (-W)呼出規約winapi対応OSWindows XP 以降

シグネチャ

// pdh.dll  (Unicode / -W)
#include <windows.h>

DWORD PdhOpenLogW(
    LPCWSTR szLogFileName,
    PDH_LOG dwAccessFlags,
    PDH_LOG_TYPE* lpdwLogType,
    PDH_HQUERY hQuery,   // optional
    DWORD dwMaxSize,
    LPCWSTR szUserCaption,   // optional
    PDH_HLOG* phLog
);

パラメーター

名前方向説明
szLogFileNameLPCWSTRin

開くログ ファイルの名前を指定する Null 終端文字列です。名前には絶対パスまたは相対パスを含めることができます。

lpdwLogType パラメーターが PDH_LOG_TYPE_SQL の場合は、SQL:DataSourceName!LogFileName という形式でログ ファイルの名前を指定します。

dwAccessFlagsPDH_LOGin

ログ ファイルを開く際に使用するアクセスの種類です。次のいずれかの値を指定します。

Value Meaning
PDH_LOG_READ_ACCESS
ログ ファイルを読み取り用に開きます。
PDH_LOG_WRITE_ACCESS
新しいログ ファイルを書き込み用に開きます。
PDH_LOG_UPDATE_ACCESS
既存のログ ファイルを書き込み用に開きます。

ビットごとの論理和 OR 演算子 (|) を使用して、アクセスの種類を次の作成フラグの 1 つ以上と組み合わせることができます。

Value Meaning
PDH_LOG_CREATE_NEW
指定した名前で新しいログ ファイルを作成します。
PDH_LOG_CREATE_ALWAYS
指定した名前で新しいログ ファイルを作成します。同名のログ ファイルが既に存在する場合、この関数は新しいファイルを作成する前に既存のログ ファイルを削除します。
PDH_LOG_OPEN_EXISTING
指定した名前の既存のログ ファイルを開きます。指定した名前のログ ファイルが存在しない場合は、PDH_LOG_CREATE_NEW と同じ動作になります。
PDH_LOG_OPEN_ALWAYS
指定した名前の既存のログ ファイルを開くか、指定した名前で新しいログ ファイルを作成します。
PDH_LOG_OPT_CIRCULAR
指定した名前で循環ログ ファイルを作成します。ファイルが dwMaxSize パラメーターの値に達すると、データはログ ファイルの先頭に折り返されます。このフラグは、lpdwLogType パラメーターが PDH_LOG_TYPE_BINARY の場合にのみ指定できます。
PDH_LOG_USER_STRING
PDH_LOG_TYPE_TSV と共に使用し、PdhUpdateLog または PdhOpenLogszUserString パラメーターで示されるユーザー キャプションまたはログ ファイルの説明を書き込みます。ユーザー キャプションまたはログ ファイルの説明は、テキスト ログの最初の行の最後の列として書き込まれます。
lpdwLogTypePDH_LOG_TYPE*inout

開くログ ファイルの種類です。このパラメーターには次のいずれかの値を指定できます。

Value Meaning
PDH_LOG_TYPE_UNDEFINED
未定義のログ ファイル形式です。これを指定すると、PDH がログ ファイルの種類を判別します。dwAccessFlags パラメーターが PDH_LOG_WRITE_ACCESS の場合、この値は指定できません。
PDH_LOG_TYPE_CSV
最初の行に列ヘッダーを含み、それ以降の各行に個々のデータ レコードを含むテキスト ファイルです。各データ レコードのフィールドはコンマで区切られます。

最初の行には、ファイルの形式、ログ ファイルの作成に使用された PDH のバージョン、および各カウンターの名前とパスに関する情報も含まれます。

PDH_LOG_TYPE_SQL
ログ ファイルのデータ ソースは SQL データベースです。
PDH_LOG_TYPE_TSV
最初の行に列ヘッダーを含み、それ以降の各行に個々のデータ レコードを含むテキスト ファイルです。各データ レコードのフィールドはタブで区切られます。

最初の行には、ファイルの形式、ログ ファイルの作成に使用された PDH のバージョン、および各カウンターの名前とパスに関する情報も含まれます。

PDH_LOG_TYPE_BINARY
バイナリ ログ ファイル形式です。
hQueryPDH_HQUERYinoptional

クエリ データをログ ファイルに書き込む場合は、クエリ ハンドルを指定します。このハンドルは PdhOpenQuery 関数によって返されます。

ログ ファイルから読み取る場合、このパラメーターは無視され、NULL を指定する必要があります。

dwMaxSizeDWORDin

ログ ファイルの最大サイズ (バイト単位) です。ファイル サイズを制限する場合、または dwAccessFlagsPDH_LOG_OPT_CIRCULAR を指定する場合は最大サイズを指定し、それ以外の場合は 0 に設定します。

循環ログ ファイルの場合は、少なくとも 1 つのサンプルを保持できる十分な大きさの値を指定する必要があります。サンプル サイズは収集されるデータによって異なりますが、少なくとも 1 メガバイトの値を指定すれば、ほとんどのサンプルに対応できます。

szUserCaptionLPCWSTRinoptionalログ ファイルのユーザー定義のキャプションを指定する Null 終端文字列です。ログ ファイルのキャプションは、通常、ログ ファイルの内容を説明するものです。既存のログ ファイルを開く場合、このパラメーターの値は無視されます。
phLogPDH_HLOG*out開いたログ ファイルへのハンドルです。

戻り値の型: DWORD

公式ドキュメント

指定したログ ファイルを読み取りまたは書き込み用に開きます。(Unicode)

戻り値

関数が成功すると、ERROR_SUCCESS を返します。

関数が失敗した場合、戻り値は システム エラー コード または PDH エラー コードです。

解説(Remarks)

この関数を使用してパフォーマンス データをログ ファイルに書き込むには、この関数を呼び出す前に、PdhOpenQuery を使用してクエリを開き、目的のカウンターを追加しておく必要があります。

新しいオペレーティング システムでは、古いオペレーティング システムで生成されたログ ファイルを読み取ることができます。ただし、Windows Vista 以降のオペレーティング システムで作成されたログ ファイルは、それより前のオペレーティング システムでは読み取ることができません。

ログ ファイルには次の規則が適用されます。

Examples

例については、Writing Performance Data to a Log File を参照してください。

メモ

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

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

各言語での呼び出し定義

// pdh.dll  (Unicode / -W)
#include <windows.h>

DWORD PdhOpenLogW(
    LPCWSTR szLogFileName,
    PDH_LOG dwAccessFlags,
    PDH_LOG_TYPE* lpdwLogType,
    PDH_HQUERY hQuery,   // optional
    DWORD dwMaxSize,
    LPCWSTR szUserCaption,   // optional
    PDH_HLOG* phLog
);
[DllImport("pdh.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern uint PdhOpenLogW(
    [MarshalAs(UnmanagedType.LPWStr)] string szLogFileName,   // LPCWSTR
    uint dwAccessFlags,   // PDH_LOG
    ref uint lpdwLogType,   // PDH_LOG_TYPE* in/out
    IntPtr hQuery,   // PDH_HQUERY optional
    uint dwMaxSize,   // DWORD
    [MarshalAs(UnmanagedType.LPWStr)] string szUserCaption,   // LPCWSTR optional
    IntPtr phLog   // PDH_HLOG* out
);
<DllImport("pdh.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)>
Public Shared Function PdhOpenLogW(
    <MarshalAs(UnmanagedType.LPWStr)> szLogFileName As String,   ' LPCWSTR
    dwAccessFlags As UInteger,   ' PDH_LOG
    ByRef lpdwLogType As UInteger,   ' PDH_LOG_TYPE* in/out
    hQuery As IntPtr,   ' PDH_HQUERY optional
    dwMaxSize As UInteger,   ' DWORD
    <MarshalAs(UnmanagedType.LPWStr)> szUserCaption As String,   ' LPCWSTR optional
    phLog As IntPtr   ' PDH_HLOG* out
) As UInteger
End Function
' szLogFileName : LPCWSTR
' dwAccessFlags : PDH_LOG
' lpdwLogType : PDH_LOG_TYPE* in/out
' hQuery : PDH_HQUERY optional
' dwMaxSize : DWORD
' szUserCaption : LPCWSTR optional
' phLog : PDH_HLOG* out
Declare PtrSafe Function PdhOpenLogW Lib "pdh" ( _
    ByVal szLogFileName As LongPtr, _
    ByVal dwAccessFlags As Long, _
    ByRef lpdwLogType As Long, _
    ByVal hQuery As LongPtr, _
    ByVal dwMaxSize As Long, _
    ByVal szUserCaption As LongPtr, _
    ByVal phLog As LongPtr) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

PdhOpenLogW = ctypes.windll.pdh.PdhOpenLogW
PdhOpenLogW.restype = wintypes.DWORD
PdhOpenLogW.argtypes = [
    wintypes.LPCWSTR,  # szLogFileName : LPCWSTR
    wintypes.DWORD,  # dwAccessFlags : PDH_LOG
    ctypes.c_void_p,  # lpdwLogType : PDH_LOG_TYPE* in/out
    wintypes.HANDLE,  # hQuery : PDH_HQUERY optional
    wintypes.DWORD,  # dwMaxSize : DWORD
    wintypes.LPCWSTR,  # szUserCaption : LPCWSTR optional
    ctypes.c_void_p,  # phLog : PDH_HLOG* out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('pdh.dll')
PdhOpenLogW = Fiddle::Function.new(
  lib['PdhOpenLogW'],
  [
    Fiddle::TYPE_VOIDP,  # szLogFileName : LPCWSTR
    -Fiddle::TYPE_INT,  # dwAccessFlags : PDH_LOG
    Fiddle::TYPE_VOIDP,  # lpdwLogType : PDH_LOG_TYPE* in/out
    Fiddle::TYPE_VOIDP,  # hQuery : PDH_HQUERY optional
    -Fiddle::TYPE_INT,  # dwMaxSize : DWORD
    Fiddle::TYPE_VOIDP,  # szUserCaption : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # phLog : PDH_HLOG* out
  ],
  -Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "pdh")]
extern "system" {
    fn PdhOpenLogW(
        szLogFileName: *const u16,  // LPCWSTR
        dwAccessFlags: u32,  // PDH_LOG
        lpdwLogType: *mut u32,  // PDH_LOG_TYPE* in/out
        hQuery: *mut core::ffi::c_void,  // PDH_HQUERY optional
        dwMaxSize: u32,  // DWORD
        szUserCaption: *const u16,  // LPCWSTR optional
        phLog: *mut *mut core::ffi::c_void  // PDH_HLOG* out
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("pdh.dll", CharSet = CharSet.Unicode)]
public static extern uint PdhOpenLogW([MarshalAs(UnmanagedType.LPWStr)] string szLogFileName, uint dwAccessFlags, ref uint lpdwLogType, IntPtr hQuery, uint dwMaxSize, [MarshalAs(UnmanagedType.LPWStr)] string szUserCaption, IntPtr phLog);
"@
$api = Add-Type -MemberDefinition $sig -Name 'pdh_PdhOpenLogW' -Namespace Win32 -PassThru
# $api::PdhOpenLogW(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
#uselib "pdh.dll"
#func global PdhOpenLogW "PdhOpenLogW" wptr, wptr, wptr, wptr, wptr, wptr, wptr
; PdhOpenLogW szLogFileName, dwAccessFlags, varptr(lpdwLogType), hQuery, dwMaxSize, szUserCaption, phLog   ; 戻り値は stat
; szLogFileName : LPCWSTR -> "wptr"
; dwAccessFlags : PDH_LOG -> "wptr"
; lpdwLogType : PDH_LOG_TYPE* in/out -> "wptr"
; hQuery : PDH_HQUERY optional -> "wptr"
; dwMaxSize : DWORD -> "wptr"
; szUserCaption : LPCWSTR optional -> "wptr"
; phLog : PDH_HLOG* out -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "pdh.dll"
#cfunc global PdhOpenLogW "PdhOpenLogW" wstr, int, var, sptr, int, wstr, sptr
; res = PdhOpenLogW(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
; szLogFileName : LPCWSTR -> "wstr"
; dwAccessFlags : PDH_LOG -> "int"
; lpdwLogType : PDH_LOG_TYPE* in/out -> "var"
; hQuery : PDH_HQUERY optional -> "sptr"
; dwMaxSize : DWORD -> "int"
; szUserCaption : LPCWSTR optional -> "wstr"
; phLog : PDH_HLOG* out -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD PdhOpenLogW(LPCWSTR szLogFileName, PDH_LOG dwAccessFlags, PDH_LOG_TYPE* lpdwLogType, PDH_HQUERY hQuery, DWORD dwMaxSize, LPCWSTR szUserCaption, PDH_HLOG* phLog)
#uselib "pdh.dll"
#cfunc global PdhOpenLogW "PdhOpenLogW" wstr, int, var, intptr, int, wstr, intptr
; res = PdhOpenLogW(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
; szLogFileName : LPCWSTR -> "wstr"
; dwAccessFlags : PDH_LOG -> "int"
; lpdwLogType : PDH_LOG_TYPE* in/out -> "var"
; hQuery : PDH_HQUERY optional -> "intptr"
; dwMaxSize : DWORD -> "int"
; szUserCaption : LPCWSTR optional -> "wstr"
; phLog : PDH_HLOG* out -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	pdh = windows.NewLazySystemDLL("pdh.dll")
	procPdhOpenLogW = pdh.NewProc("PdhOpenLogW")
)

// szLogFileName (LPCWSTR), dwAccessFlags (PDH_LOG), lpdwLogType (PDH_LOG_TYPE* in/out), hQuery (PDH_HQUERY optional), dwMaxSize (DWORD), szUserCaption (LPCWSTR optional), phLog (PDH_HLOG* out)
r1, _, err := procPdhOpenLogW.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(szLogFileName))),
	uintptr(dwAccessFlags),
	uintptr(lpdwLogType),
	uintptr(hQuery),
	uintptr(dwMaxSize),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(szUserCaption))),
	uintptr(phLog),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function PdhOpenLogW(
  szLogFileName: PWideChar;   // LPCWSTR
  dwAccessFlags: DWORD;   // PDH_LOG
  lpdwLogType: Pointer;   // PDH_LOG_TYPE* in/out
  hQuery: THandle;   // PDH_HQUERY optional
  dwMaxSize: DWORD;   // DWORD
  szUserCaption: PWideChar;   // LPCWSTR optional
  phLog: Pointer   // PDH_HLOG* out
): DWORD; stdcall;
  external 'pdh.dll' name 'PdhOpenLogW';
result := DllCall("pdh\PdhOpenLogW"
    , "WStr", szLogFileName   ; LPCWSTR
    , "UInt", dwAccessFlags   ; PDH_LOG
    , "Ptr", lpdwLogType   ; PDH_LOG_TYPE* in/out
    , "Ptr", hQuery   ; PDH_HQUERY optional
    , "UInt", dwMaxSize   ; DWORD
    , "WStr", szUserCaption   ; LPCWSTR optional
    , "Ptr", phLog   ; PDH_HLOG* out
    , "UInt")   ; return: DWORD
●PdhOpenLogW(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog) = DLL("pdh.dll", "dword PdhOpenLogW(char*, dword, void*, void*, dword, char*, void*)")
# 呼び出し: PdhOpenLogW(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
# szLogFileName : LPCWSTR -> "char*"
# dwAccessFlags : PDH_LOG -> "dword"
# lpdwLogType : PDH_LOG_TYPE* in/out -> "void*"
# hQuery : PDH_HQUERY optional -> "void*"
# dwMaxSize : DWORD -> "dword"
# szUserCaption : LPCWSTR optional -> "char*"
# phLog : PDH_HLOG* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "pdh" fn PdhOpenLogW(
    szLogFileName: [*c]const u16, // LPCWSTR
    dwAccessFlags: u32, // PDH_LOG
    lpdwLogType: [*c]u32, // PDH_LOG_TYPE* in/out
    hQuery: ?*anyopaque, // PDH_HQUERY optional
    dwMaxSize: u32, // DWORD
    szUserCaption: [*c]const u16, // LPCWSTR optional
    phLog: ?*anyopaque // PDH_HLOG* out
) callconv(std.os.windows.WINAPI) u32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc PdhOpenLogW(
    szLogFileName: WideCString,  # LPCWSTR
    dwAccessFlags: uint32,  # PDH_LOG
    lpdwLogType: ptr uint32,  # PDH_LOG_TYPE* in/out
    hQuery: pointer,  # PDH_HQUERY optional
    dwMaxSize: uint32,  # DWORD
    szUserCaption: WideCString,  # LPCWSTR optional
    phLog: pointer  # PDH_HLOG* out
): uint32 {.importc: "PdhOpenLogW", stdcall, dynlib: "pdh.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "pdh");
extern(Windows)
uint PdhOpenLogW(
    const(wchar)* szLogFileName,   // LPCWSTR
    uint dwAccessFlags,   // PDH_LOG
    uint* lpdwLogType,   // PDH_LOG_TYPE* in/out
    void* hQuery,   // PDH_HQUERY optional
    uint dwMaxSize,   // DWORD
    const(wchar)* szUserCaption,   // LPCWSTR optional
    void* phLog   // PDH_HLOG* out
);
ccall((:PdhOpenLogW, "pdh.dll"), stdcall, UInt32,
      (Cwstring, UInt32, Ptr{UInt32}, Ptr{Cvoid}, UInt32, Cwstring, Ptr{Cvoid}),
      szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
# szLogFileName : LPCWSTR -> Cwstring
# dwAccessFlags : PDH_LOG -> UInt32
# lpdwLogType : PDH_LOG_TYPE* in/out -> Ptr{UInt32}
# hQuery : PDH_HQUERY optional -> Ptr{Cvoid}
# dwMaxSize : DWORD -> UInt32
# szUserCaption : LPCWSTR optional -> Cwstring
# phLog : PDH_HLOG* out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
uint32_t PdhOpenLogW(
    const uint16_t* szLogFileName,
    uint32_t dwAccessFlags,
    uint32_t* lpdwLogType,
    void* hQuery,
    uint32_t dwMaxSize,
    const uint16_t* szUserCaption,
    void* phLog);
]]
local pdh = ffi.load("pdh")
-- pdh.PdhOpenLogW(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
-- szLogFileName : LPCWSTR
-- dwAccessFlags : PDH_LOG
-- lpdwLogType : PDH_LOG_TYPE* in/out
-- hQuery : PDH_HQUERY optional
-- dwMaxSize : DWORD
-- szUserCaption : LPCWSTR optional
-- phLog : PDH_HLOG* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('pdh.dll');
const PdhOpenLogW = lib.func('__stdcall', 'PdhOpenLogW', 'uint32_t', ['str16', 'uint32_t', 'uint32_t *', 'void *', 'uint32_t', 'str16', 'void *']);
// PdhOpenLogW(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
// szLogFileName : LPCWSTR -> 'str16'
// dwAccessFlags : PDH_LOG -> 'uint32_t'
// lpdwLogType : PDH_LOG_TYPE* in/out -> 'uint32_t *'
// hQuery : PDH_HQUERY optional -> 'void *'
// dwMaxSize : DWORD -> 'uint32_t'
// szUserCaption : LPCWSTR optional -> 'str16'
// phLog : PDH_HLOG* out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("pdh.dll", {
  PdhOpenLogW: { parameters: ["buffer", "u32", "pointer", "pointer", "u32", "buffer", "pointer"], result: "u32" },
});
// lib.symbols.PdhOpenLogW(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
// szLogFileName : LPCWSTR -> "buffer"
// dwAccessFlags : PDH_LOG -> "u32"
// lpdwLogType : PDH_LOG_TYPE* in/out -> "pointer"
// hQuery : PDH_HQUERY optional -> "pointer"
// dwMaxSize : DWORD -> "u32"
// szUserCaption : LPCWSTR optional -> "buffer"
// phLog : PDH_HLOG* out -> "pointer"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t PdhOpenLogW(
    const uint16_t* szLogFileName,
    uint32_t dwAccessFlags,
    uint32_t* lpdwLogType,
    void* hQuery,
    uint32_t dwMaxSize,
    const uint16_t* szUserCaption,
    void* phLog);
C, "pdh.dll");
// $ffi->PdhOpenLogW(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog);
// szLogFileName : LPCWSTR
// dwAccessFlags : PDH_LOG
// lpdwLogType : PDH_LOG_TYPE* in/out
// hQuery : PDH_HQUERY optional
// dwMaxSize : DWORD
// szUserCaption : LPCWSTR optional
// phLog : PDH_HLOG* 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 Pdh extends StdCallLibrary {
    Pdh INSTANCE = Native.load("pdh", Pdh.class, W32APIOptions.UNICODE_OPTIONS);
    int PdhOpenLogW(
        WString szLogFileName,   // LPCWSTR
        int dwAccessFlags,   // PDH_LOG
        IntByReference lpdwLogType,   // PDH_LOG_TYPE* in/out
        Pointer hQuery,   // PDH_HQUERY optional
        int dwMaxSize,   // DWORD
        WString szUserCaption,   // LPCWSTR optional
        Pointer phLog   // PDH_HLOG* out
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("pdh")]
lib Libpdh
  fun PdhOpenLogW = PdhOpenLogW(
    szLogFileName : UInt16*,   # LPCWSTR
    dwAccessFlags : UInt32,   # PDH_LOG
    lpdwLogType : UInt32*,   # PDH_LOG_TYPE* in/out
    hQuery : Void*,   # PDH_HQUERY optional
    dwMaxSize : UInt32,   # DWORD
    szUserCaption : UInt16*,   # LPCWSTR optional
    phLog : Void*   # PDH_HLOG* out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef PdhOpenLogWNative = Uint32 Function(Pointer<Utf16>, Uint32, Pointer<Uint32>, Pointer<Void>, Uint32, Pointer<Utf16>, Pointer<Void>);
typedef PdhOpenLogWDart = int Function(Pointer<Utf16>, int, Pointer<Uint32>, Pointer<Void>, int, Pointer<Utf16>, Pointer<Void>);
final PdhOpenLogW = DynamicLibrary.open('pdh.dll')
    .lookupFunction<PdhOpenLogWNative, PdhOpenLogWDart>('PdhOpenLogW');
// szLogFileName : LPCWSTR -> Pointer<Utf16>
// dwAccessFlags : PDH_LOG -> Uint32
// lpdwLogType : PDH_LOG_TYPE* in/out -> Pointer<Uint32>
// hQuery : PDH_HQUERY optional -> Pointer<Void>
// dwMaxSize : DWORD -> Uint32
// szUserCaption : LPCWSTR optional -> Pointer<Utf16>
// phLog : PDH_HLOG* out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function PdhOpenLogW(
  szLogFileName: PWideChar;   // LPCWSTR
  dwAccessFlags: DWORD;   // PDH_LOG
  lpdwLogType: Pointer;   // PDH_LOG_TYPE* in/out
  hQuery: THandle;   // PDH_HQUERY optional
  dwMaxSize: DWORD;   // DWORD
  szUserCaption: PWideChar;   // LPCWSTR optional
  phLog: Pointer   // PDH_HLOG* out
): DWORD; stdcall;
  external 'pdh.dll' name 'PdhOpenLogW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "PdhOpenLogW"
  c_PdhOpenLogW :: CWString -> Word32 -> Ptr Word32 -> Ptr () -> Word32 -> CWString -> Ptr () -> IO Word32
-- szLogFileName : LPCWSTR -> CWString
-- dwAccessFlags : PDH_LOG -> Word32
-- lpdwLogType : PDH_LOG_TYPE* in/out -> Ptr Word32
-- hQuery : PDH_HQUERY optional -> Ptr ()
-- dwMaxSize : DWORD -> Word32
-- szUserCaption : LPCWSTR optional -> CWString
-- phLog : PDH_HLOG* out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let pdhopenlogw =
  foreign "PdhOpenLogW"
    ((ptr uint16_t) @-> uint32_t @-> (ptr uint32_t) @-> (ptr void) @-> uint32_t @-> (ptr uint16_t) @-> (ptr void) @-> returning uint32_t)
(* szLogFileName : LPCWSTR -> (ptr uint16_t) *)
(* dwAccessFlags : PDH_LOG -> uint32_t *)
(* lpdwLogType : PDH_LOG_TYPE* in/out -> (ptr uint32_t) *)
(* hQuery : PDH_HQUERY optional -> (ptr void) *)
(* dwMaxSize : DWORD -> uint32_t *)
(* szUserCaption : LPCWSTR optional -> (ptr uint16_t) *)
(* phLog : PDH_HLOG* out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library pdh (t "pdh.dll"))
(cffi:use-foreign-library pdh)

(cffi:defcfun ("PdhOpenLogW" pdh-open-log-w :convention :stdcall) :uint32
  (sz-log-file-name (:string :encoding :utf-16le))   ; LPCWSTR
  (dw-access-flags :uint32)   ; PDH_LOG
  (lpdw-log-type :pointer)   ; PDH_LOG_TYPE* in/out
  (h-query :pointer)   ; PDH_HQUERY optional
  (dw-max-size :uint32)   ; DWORD
  (sz-user-caption (:string :encoding :utf-16le))   ; LPCWSTR optional
  (ph-log :pointer))   ; PDH_HLOG* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $PdhOpenLogW = Win32::API::More->new('pdh',
    'DWORD PdhOpenLogW(LPCWSTR szLogFileName, DWORD dwAccessFlags, LPVOID lpdwLogType, HANDLE hQuery, DWORD dwMaxSize, LPCWSTR szUserCaption, HANDLE phLog)');
# my $ret = $PdhOpenLogW->Call($szLogFileName, $dwAccessFlags, $lpdwLogType, $hQuery, $dwMaxSize, $szUserCaption, $phLog);
# szLogFileName : LPCWSTR -> LPCWSTR
# dwAccessFlags : PDH_LOG -> DWORD
# lpdwLogType : PDH_LOG_TYPE* in/out -> LPVOID
# hQuery : PDH_HQUERY optional -> HANDLE
# dwMaxSize : DWORD -> DWORD
# szUserCaption : LPCWSTR optional -> LPCWSTR
# phLog : PDH_HLOG* out -> HANDLE
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

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