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

OleCreatePropertyFrame

関数
オブジェクトのプロパティページを表示するダイアログを生成する。
DLLOLEAUT32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

HRESULT OleCreatePropertyFrame(
    HWND hwndOwner,
    DWORD x,
    DWORD y,
    LPCWSTR lpszCaption,
    DWORD cObjects,
    IUnknown** ppUnk,
    DWORD cPages,
    GUID* pPageClsID,
    DWORD lcid,
    DWORD dwReserved,
    void* pvReserved
);

パラメーター

名前方向説明
hwndOwnerHWNDin生成されるプロパティシートのダイアログボックスの親ウィンドウへのハンドルです。
xDWORDin予約済み。hwndOwner を基準としたダイアログボックスの水平位置です。
yDWORDin予約済み。hwndOwner を基準としたダイアログボックスの垂直位置です。
lpszCaptionLPCWSTRinダイアログボックスのキャプションに使用する文字列へのポインターです。
cObjectsDWORDinppUnk で渡されるオブジェクトポインターの数です。
ppUnkIUnknown**inこのプロパティシートの呼び出し対象となるオブジェクトに対する IUnknown ポインターの配列です。配列の要素数は cObjects で指定されます。これらのポインターは、IPropertyPage::SetObjects を通じて各プロパティページへ渡されます。
cPagesDWORDinpPageCIsID で指定されるプロパティページの数です。
pPageClsIDGUID*inプロパティシートに表示する各プロパティページの CLSID を格納した、サイズ cPages の配列です。
lcidDWORDinプロパティシートに使用するロケール識別子です。プロパティページは、IPropertyPageSite::GetLocaleID を通じてこの識別子を取得できます。
dwReservedDWORDin将来の使用のために予約されています。0 を指定する必要があります。
pvReservedvoid*in将来の使用のために予約されています。NULL を指定する必要があります。

戻り値の型: HRESULT

公式ドキュメント

新しいプロパティフレーム、すなわちプロパティシートのダイアログボックスを呼び出します。このダイアログの親ウィンドウは hwndOwner であり、親ウィンドウ内の点 (x,y) に配置され、キャプションは lpszCaption になります。

戻り値

この関数は、標準の戻り値である E_INVALIDARGE_OUTOFMEMORYE_UNEXPECTED に加えて、以下の値をサポートします。

戻り値 説明
S_OK
ダイアログボックスが正常に呼び出され、動作しました。
E_POINTER
lpszCaptionppUnk、または pPageCIsID のアドレスが無効です。たとえば、これらのいずれかが NULL である場合などです。

解説(Remarks)

表示するプロパティページは pPageClsID で識別されます。これは cPages 個の CLSID 値からなる配列です。このプロパティシートの対象となるオブジェクトは ppUnk で識別されます。これは IUnknown ポインターを格納したサイズ cObjects の配列です。

この関数は常にモーダルダイアログボックスを作成し、そのダイアログボックスが閉じられるまで制御を返しません。

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

各言語での呼び出し定義

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

HRESULT OleCreatePropertyFrame(
    HWND hwndOwner,
    DWORD x,
    DWORD y,
    LPCWSTR lpszCaption,
    DWORD cObjects,
    IUnknown** ppUnk,
    DWORD cPages,
    GUID* pPageClsID,
    DWORD lcid,
    DWORD dwReserved,
    void* pvReserved
);
[DllImport("OLEAUT32.dll", ExactSpelling = true)]
static extern int OleCreatePropertyFrame(
    IntPtr hwndOwner,   // HWND
    uint x,   // DWORD
    uint y,   // DWORD
    [MarshalAs(UnmanagedType.LPWStr)] string lpszCaption,   // LPCWSTR
    uint cObjects,   // DWORD
    IntPtr ppUnk,   // IUnknown**
    uint cPages,   // DWORD
    ref Guid pPageClsID,   // GUID*
    uint lcid,   // DWORD
    uint dwReserved,   // DWORD
    IntPtr pvReserved   // void*
);
<DllImport("OLEAUT32.dll", ExactSpelling:=True)>
Public Shared Function OleCreatePropertyFrame(
    hwndOwner As IntPtr,   ' HWND
    x As UInteger,   ' DWORD
    y As UInteger,   ' DWORD
    <MarshalAs(UnmanagedType.LPWStr)> lpszCaption As String,   ' LPCWSTR
    cObjects As UInteger,   ' DWORD
    ppUnk As IntPtr,   ' IUnknown**
    cPages As UInteger,   ' DWORD
    ByRef pPageClsID As Guid,   ' GUID*
    lcid As UInteger,   ' DWORD
    dwReserved As UInteger,   ' DWORD
    pvReserved As IntPtr   ' void*
) As Integer
End Function
' hwndOwner : HWND
' x : DWORD
' y : DWORD
' lpszCaption : LPCWSTR
' cObjects : DWORD
' ppUnk : IUnknown**
' cPages : DWORD
' pPageClsID : GUID*
' lcid : DWORD
' dwReserved : DWORD
' pvReserved : void*
Declare PtrSafe Function OleCreatePropertyFrame Lib "oleaut32" ( _
    ByVal hwndOwner As LongPtr, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal lpszCaption As LongPtr, _
    ByVal cObjects As Long, _
    ByVal ppUnk As LongPtr, _
    ByVal cPages As Long, _
    ByVal pPageClsID As LongPtr, _
    ByVal lcid As Long, _
    ByVal dwReserved As Long, _
    ByVal pvReserved As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

OleCreatePropertyFrame = ctypes.windll.oleaut32.OleCreatePropertyFrame
OleCreatePropertyFrame.restype = ctypes.c_int
OleCreatePropertyFrame.argtypes = [
    wintypes.HANDLE,  # hwndOwner : HWND
    wintypes.DWORD,  # x : DWORD
    wintypes.DWORD,  # y : DWORD
    wintypes.LPCWSTR,  # lpszCaption : LPCWSTR
    wintypes.DWORD,  # cObjects : DWORD
    ctypes.c_void_p,  # ppUnk : IUnknown**
    wintypes.DWORD,  # cPages : DWORD
    ctypes.c_void_p,  # pPageClsID : GUID*
    wintypes.DWORD,  # lcid : DWORD
    wintypes.DWORD,  # dwReserved : DWORD
    ctypes.POINTER(None),  # pvReserved : void*
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('OLEAUT32.dll')
OleCreatePropertyFrame = Fiddle::Function.new(
  lib['OleCreatePropertyFrame'],
  [
    Fiddle::TYPE_VOIDP,  # hwndOwner : HWND
    -Fiddle::TYPE_INT,  # x : DWORD
    -Fiddle::TYPE_INT,  # y : DWORD
    Fiddle::TYPE_VOIDP,  # lpszCaption : LPCWSTR
    -Fiddle::TYPE_INT,  # cObjects : DWORD
    Fiddle::TYPE_VOIDP,  # ppUnk : IUnknown**
    -Fiddle::TYPE_INT,  # cPages : DWORD
    Fiddle::TYPE_VOIDP,  # pPageClsID : GUID*
    -Fiddle::TYPE_INT,  # lcid : DWORD
    -Fiddle::TYPE_INT,  # dwReserved : DWORD
    Fiddle::TYPE_VOIDP,  # pvReserved : void*
  ],
  Fiddle::TYPE_INT)
#[link(name = "oleaut32")]
extern "system" {
    fn OleCreatePropertyFrame(
        hwndOwner: *mut core::ffi::c_void,  // HWND
        x: u32,  // DWORD
        y: u32,  // DWORD
        lpszCaption: *const u16,  // LPCWSTR
        cObjects: u32,  // DWORD
        ppUnk: *mut *mut core::ffi::c_void,  // IUnknown**
        cPages: u32,  // DWORD
        pPageClsID: *mut GUID,  // GUID*
        lcid: u32,  // DWORD
        dwReserved: u32,  // DWORD
        pvReserved: *mut ()  // void*
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("OLEAUT32.dll")]
public static extern int OleCreatePropertyFrame(IntPtr hwndOwner, uint x, uint y, [MarshalAs(UnmanagedType.LPWStr)] string lpszCaption, uint cObjects, IntPtr ppUnk, uint cPages, ref Guid pPageClsID, uint lcid, uint dwReserved, IntPtr pvReserved);
"@
$api = Add-Type -MemberDefinition $sig -Name 'OLEAUT32_OleCreatePropertyFrame' -Namespace Win32 -PassThru
# $api::OleCreatePropertyFrame(hwndOwner, x, y, lpszCaption, cObjects, ppUnk, cPages, pPageClsID, lcid, dwReserved, pvReserved)
#uselib "OLEAUT32.dll"
#func global OleCreatePropertyFrame "OleCreatePropertyFrame" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; OleCreatePropertyFrame hwndOwner, x, y, lpszCaption, cObjects, ppUnk, cPages, varptr(pPageClsID), lcid, dwReserved, pvReserved   ; 戻り値は stat
; hwndOwner : HWND -> "sptr"
; x : DWORD -> "sptr"
; y : DWORD -> "sptr"
; lpszCaption : LPCWSTR -> "sptr"
; cObjects : DWORD -> "sptr"
; ppUnk : IUnknown** -> "sptr"
; cPages : DWORD -> "sptr"
; pPageClsID : GUID* -> "sptr"
; lcid : DWORD -> "sptr"
; dwReserved : DWORD -> "sptr"
; pvReserved : void* -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "OLEAUT32.dll"
#cfunc global OleCreatePropertyFrame "OleCreatePropertyFrame" sptr, int, int, wstr, int, sptr, int, var, int, int, sptr
; res = OleCreatePropertyFrame(hwndOwner, x, y, lpszCaption, cObjects, ppUnk, cPages, pPageClsID, lcid, dwReserved, pvReserved)
; hwndOwner : HWND -> "sptr"
; x : DWORD -> "int"
; y : DWORD -> "int"
; lpszCaption : LPCWSTR -> "wstr"
; cObjects : DWORD -> "int"
; ppUnk : IUnknown** -> "sptr"
; cPages : DWORD -> "int"
; pPageClsID : GUID* -> "var"
; lcid : DWORD -> "int"
; dwReserved : DWORD -> "int"
; pvReserved : void* -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HRESULT OleCreatePropertyFrame(HWND hwndOwner, DWORD x, DWORD y, LPCWSTR lpszCaption, DWORD cObjects, IUnknown** ppUnk, DWORD cPages, GUID* pPageClsID, DWORD lcid, DWORD dwReserved, void* pvReserved)
#uselib "OLEAUT32.dll"
#cfunc global OleCreatePropertyFrame "OleCreatePropertyFrame" intptr, int, int, wstr, int, intptr, int, var, int, int, intptr
; res = OleCreatePropertyFrame(hwndOwner, x, y, lpszCaption, cObjects, ppUnk, cPages, pPageClsID, lcid, dwReserved, pvReserved)
; hwndOwner : HWND -> "intptr"
; x : DWORD -> "int"
; y : DWORD -> "int"
; lpszCaption : LPCWSTR -> "wstr"
; cObjects : DWORD -> "int"
; ppUnk : IUnknown** -> "intptr"
; cPages : DWORD -> "int"
; pPageClsID : GUID* -> "var"
; lcid : DWORD -> "int"
; dwReserved : DWORD -> "int"
; pvReserved : void* -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	oleaut32 = windows.NewLazySystemDLL("OLEAUT32.dll")
	procOleCreatePropertyFrame = oleaut32.NewProc("OleCreatePropertyFrame")
)

// hwndOwner (HWND), x (DWORD), y (DWORD), lpszCaption (LPCWSTR), cObjects (DWORD), ppUnk (IUnknown**), cPages (DWORD), pPageClsID (GUID*), lcid (DWORD), dwReserved (DWORD), pvReserved (void*)
r1, _, err := procOleCreatePropertyFrame.Call(
	uintptr(hwndOwner),
	uintptr(x),
	uintptr(y),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpszCaption))),
	uintptr(cObjects),
	uintptr(ppUnk),
	uintptr(cPages),
	uintptr(pPageClsID),
	uintptr(lcid),
	uintptr(dwReserved),
	uintptr(pvReserved),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function OleCreatePropertyFrame(
  hwndOwner: THandle;   // HWND
  x: DWORD;   // DWORD
  y: DWORD;   // DWORD
  lpszCaption: PWideChar;   // LPCWSTR
  cObjects: DWORD;   // DWORD
  ppUnk: Pointer;   // IUnknown**
  cPages: DWORD;   // DWORD
  pPageClsID: PGUID;   // GUID*
  lcid: DWORD;   // DWORD
  dwReserved: DWORD;   // DWORD
  pvReserved: Pointer   // void*
): Integer; stdcall;
  external 'OLEAUT32.dll' name 'OleCreatePropertyFrame';
result := DllCall("OLEAUT32\OleCreatePropertyFrame"
    , "Ptr", hwndOwner   ; HWND
    , "UInt", x   ; DWORD
    , "UInt", y   ; DWORD
    , "WStr", lpszCaption   ; LPCWSTR
    , "UInt", cObjects   ; DWORD
    , "Ptr", ppUnk   ; IUnknown**
    , "UInt", cPages   ; DWORD
    , "Ptr", pPageClsID   ; GUID*
    , "UInt", lcid   ; DWORD
    , "UInt", dwReserved   ; DWORD
    , "Ptr", pvReserved   ; void*
    , "Int")   ; return: HRESULT
●OleCreatePropertyFrame(hwndOwner, x, y, lpszCaption, cObjects, ppUnk, cPages, pPageClsID, lcid, dwReserved, pvReserved) = DLL("OLEAUT32.dll", "int OleCreatePropertyFrame(void*, dword, dword, char*, dword, void*, dword, void*, dword, dword, void*)")
# 呼び出し: OleCreatePropertyFrame(hwndOwner, x, y, lpszCaption, cObjects, ppUnk, cPages, pPageClsID, lcid, dwReserved, pvReserved)
# hwndOwner : HWND -> "void*"
# x : DWORD -> "dword"
# y : DWORD -> "dword"
# lpszCaption : LPCWSTR -> "char*"
# cObjects : DWORD -> "dword"
# ppUnk : IUnknown** -> "void*"
# cPages : DWORD -> "dword"
# pPageClsID : GUID* -> "void*"
# lcid : DWORD -> "dword"
# dwReserved : DWORD -> "dword"
# pvReserved : void* -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef OleCreatePropertyFrameNative = Int32 Function(Pointer<Void>, Uint32, Uint32, Pointer<Utf16>, Uint32, Pointer<Void>, Uint32, Pointer<Void>, Uint32, Uint32, Pointer<Void>);
typedef OleCreatePropertyFrameDart = int Function(Pointer<Void>, int, int, Pointer<Utf16>, int, Pointer<Void>, int, Pointer<Void>, int, int, Pointer<Void>);
final OleCreatePropertyFrame = DynamicLibrary.open('OLEAUT32.dll')
    .lookupFunction<OleCreatePropertyFrameNative, OleCreatePropertyFrameDart>('OleCreatePropertyFrame');
// hwndOwner : HWND -> Pointer<Void>
// x : DWORD -> Uint32
// y : DWORD -> Uint32
// lpszCaption : LPCWSTR -> Pointer<Utf16>
// cObjects : DWORD -> Uint32
// ppUnk : IUnknown** -> Pointer<Void>
// cPages : DWORD -> Uint32
// pPageClsID : GUID* -> Pointer<Void>
// lcid : DWORD -> Uint32
// dwReserved : DWORD -> Uint32
// pvReserved : void* -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function OleCreatePropertyFrame(
  hwndOwner: THandle;   // HWND
  x: DWORD;   // DWORD
  y: DWORD;   // DWORD
  lpszCaption: PWideChar;   // LPCWSTR
  cObjects: DWORD;   // DWORD
  ppUnk: Pointer;   // IUnknown**
  cPages: DWORD;   // DWORD
  pPageClsID: PGUID;   // GUID*
  lcid: DWORD;   // DWORD
  dwReserved: DWORD;   // DWORD
  pvReserved: Pointer   // void*
): Integer; stdcall;
  external 'OLEAUT32.dll' name 'OleCreatePropertyFrame';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "OleCreatePropertyFrame"
  c_OleCreatePropertyFrame :: Ptr () -> Word32 -> Word32 -> CWString -> Word32 -> Ptr () -> Word32 -> Ptr () -> Word32 -> Word32 -> Ptr () -> IO Int32
-- hwndOwner : HWND -> Ptr ()
-- x : DWORD -> Word32
-- y : DWORD -> Word32
-- lpszCaption : LPCWSTR -> CWString
-- cObjects : DWORD -> Word32
-- ppUnk : IUnknown** -> Ptr ()
-- cPages : DWORD -> Word32
-- pPageClsID : GUID* -> Ptr ()
-- lcid : DWORD -> Word32
-- dwReserved : DWORD -> Word32
-- pvReserved : void* -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let olecreatepropertyframe =
  foreign "OleCreatePropertyFrame"
    ((ptr void) @-> uint32_t @-> uint32_t @-> (ptr uint16_t) @-> uint32_t @-> (ptr void) @-> uint32_t @-> (ptr void) @-> uint32_t @-> uint32_t @-> (ptr void) @-> returning int32_t)
(* hwndOwner : HWND -> (ptr void) *)
(* x : DWORD -> uint32_t *)
(* y : DWORD -> uint32_t *)
(* lpszCaption : LPCWSTR -> (ptr uint16_t) *)
(* cObjects : DWORD -> uint32_t *)
(* ppUnk : IUnknown** -> (ptr void) *)
(* cPages : DWORD -> uint32_t *)
(* pPageClsID : GUID* -> (ptr void) *)
(* lcid : DWORD -> uint32_t *)
(* dwReserved : DWORD -> uint32_t *)
(* pvReserved : void* -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library oleaut32 (t "OLEAUT32.dll"))
(cffi:use-foreign-library oleaut32)

(cffi:defcfun ("OleCreatePropertyFrame" ole-create-property-frame :convention :stdcall) :int32
  (hwnd-owner :pointer)   ; HWND
  (x :uint32)   ; DWORD
  (y :uint32)   ; DWORD
  (lpsz-caption (:string :encoding :utf-16le))   ; LPCWSTR
  (c-objects :uint32)   ; DWORD
  (pp-unk :pointer)   ; IUnknown**
  (c-pages :uint32)   ; DWORD
  (p-page-cls-id :pointer)   ; GUID*
  (lcid :uint32)   ; DWORD
  (dw-reserved :uint32)   ; DWORD
  (pv-reserved :pointer))   ; void*
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $OleCreatePropertyFrame = Win32::API::More->new('OLEAUT32',
    'int OleCreatePropertyFrame(HANDLE hwndOwner, DWORD x, DWORD y, LPCWSTR lpszCaption, DWORD cObjects, LPVOID ppUnk, DWORD cPages, LPVOID pPageClsID, DWORD lcid, DWORD dwReserved, LPVOID pvReserved)');
# my $ret = $OleCreatePropertyFrame->Call($hwndOwner, $x, $y, $lpszCaption, $cObjects, $ppUnk, $cPages, $pPageClsID, $lcid, $dwReserved, $pvReserved);
# hwndOwner : HWND -> HANDLE
# x : DWORD -> DWORD
# y : DWORD -> DWORD
# lpszCaption : LPCWSTR -> LPCWSTR
# cObjects : DWORD -> DWORD
# ppUnk : IUnknown** -> LPVOID
# cPages : DWORD -> DWORD
# pPageClsID : GUID* -> LPVOID
# lcid : DWORD -> DWORD
# dwReserved : DWORD -> DWORD
# pvReserved : void* -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

使用する型