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

OleCreateEx

関数
複数フォーマットやアドバイズを指定して埋め込みOLEオブジェクトを作成する。
DLLOLE32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

HRESULT OleCreateEx(
    const GUID* rclsid,
    const GUID* riid,
    OLECREATE dwFlags,
    DWORD renderopt,
    DWORD cFormats,
    DWORD* rgAdvf,
    FORMATETC* rgFormatEtc,
    IAdviseSink* lpAdviseSink,
    DWORD* rgdwConnection,
    IOleClientSite* pClientSite,
    IStorage* pStg,
    void** ppvObj
);

パラメーター

名前方向説明
rclsidGUID*in作成するオブジェクトのクラスを識別します。
riidGUID*in返すオブジェクトのインターフェイスの識別子への参照です。
dwFlagsOLECREATEinこの値は 0 または OLECREATE_LEAVERUNNING (0x00000001) を指定できます。
renderoptDWORDinOLERENDER 列挙体から取得される値です。
cFormatsDWORDinrenderopt が OLERENDER_FORMAT の場合、rgFormatEtc 配列内の FORMATETC 構造体の数を示します。1 以上である必要があります。それ以外の場合、このパラメーターは 0 でなければなりません。
rgAdvfDWORD*inrenderopt が OLERENDER_FORMAT の場合、cFormats 個の DWORD 要素からなる配列を指します。各要素は ADVF 列挙体の値の組み合わせです。この配列の各要素は、pAdviseSinkNULL か非 NULL かに応じて、IOleCache::Cache または IDataObject::DAdvise の呼び出しに advf パラメーターとして渡されます (後述参照)。それ以外の場合、このパラメーターは NULL でなければなりません。
rgFormatEtcFORMATETC*inrenderopt が OLERENDER_FORMAT の場合、cFormats 個の FORMATETC 構造体からなる配列を指します。pAdviseSinkNULL の場合、この配列の各要素はオブジェクトの IOleCache::Cache の呼び出しに pFormatEtc パラメーターとして渡されます。これにより、オブジェクトのインプロセスハンドラー (通常は既定のハンドラー) が管理するデータおよびプレゼンテーションキャッシュに、プレゼンテーションやその他のキャッシュ可能なデータが格納されます。pAdviseSink が非 NULL の場合、この配列の各要素は IDataObject::DAdvise の呼び出しに pFormatEtc パラメーターとして渡されます。これにより、呼び出し元 (通常は OLE コンテナー) は、オブジェクトから受け取ったデータの独自のキャッシュや処理を行うことができます。それ以外の場合、このパラメーターは NULL でなければなりません。
lpAdviseSinkIAdviseSink*inrenderoptOLERENDER_FORMAT の場合、データアドバイスのカスタムキャッシュや処理を示す有効な IAdviseSink ポインター、またはデータ形式の既定のキャッシュを示す NULL のいずれかを指定できます。それ以外の場合、このパラメーターは NULL でなければなりません。
rgdwConnectionDWORD*out各アドバイザリ接続に対して IDataObject::DAdvise を使用して pAdviseSink インターフェイスを登録した際に返される dwConnection 値の配列を返す場所です。返されるアドバイザリ接続が不要な場合は NULL を指定します。pAdviseSinkNULL の場合は、NULL でなければなりません。
pClientSiteIOleClientSite*inオブジェクトがコンテナーにサービスを要求する際の主たるインターフェイスへのポインターです。このパラメーターは NULL でもかまいませんが、その場合は呼び出し元が IOleObject::SetClientSite を使用してできるだけ早くクライアントサイトを確立する責任を負います。
pStgIStorage*inオブジェクトと、そのために確立される既定のデータまたはプレゼンテーションキャッシュに使用するストレージへのポインターです。このパラメーターを NULL にすることはできません。
ppvObjvoid**outriid で要求されたインターフェイスポインターを受け取る出力ポインター変数のアドレスです。正常に返された場合、*ppvObj には新しく作成されたオブジェクト上の要求されたインターフェイスポインターが格納されます。

戻り値の型: HRESULT

公式ドキュメント

OleCreate がサポートする単一形式に代わり、複数のプレゼンテーション形式やデータのキャッシュを必要とするコンテナーにおいて、オブジェクトをより効率的にインスタンス化できるように OleCreate の機能を拡張します。

戻り値

この関数は成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。

戻り値 説明
E_NOINTERFACE
指定されたインターフェイス識別子が無効です。

解説(Remarks)

次の OleCreate の呼び出しは:

OleCreate(rclsid, riid, renderopt, pFormatEtc, pClientSite, pStg, ppvObj);

次の OleCreateEx の呼び出しと等価です:

DWORD    advf = ADVF_PRIMEFIRST;
    OleCreateEx(rclsid, riid, renderopt, 1, &advf, pFormatEtc, NULL, pClientSite, pStg, ppvObj);

既存のインスタンス化関数 (OleCreateOleCreateFromFileOleCreateFromDataOleCreateLinkOleCreateLinkToFileOleCreateLinkFromData) は、インスタンス化の際に、既定のキャッシュ場所 (渡された IStorage の '\001OlePresXXX' ストリーム内) に単一のプレゼンテーションまたはデータ形式のキャッシュのみを作成します。さらに、これらのキャッシュはオブジェクトが次に実行状態に入ったときに作成される必要があります。ほとんどのアプリケーションは少なくとも 2 つのプレゼンテーション (画面用とプリンター用) のキャッシュを必要とし、ハンドラーとは異なる形式や場所でのデータのキャッシュを必要とする場合もあるため、アプリケーションは通常、オブジェクト作成時 (Insert Object、Insert Object from File、Paste Object) にデータキャッシュをプライミングするために、オブジェクトサーバーの起動と終了を複数回行う必要があります。

これらの作成関数の拡張版はこの問題を解決します。OleCreateExOleCreateFromFileExOleCreateFromDataExOleCreateLinkExOleCreateLinkToFileExOleCreateLinkFromDataEx には、次の新しいパラメーターが含まれます。追加オプションを指定する dwFlags、キャッシュする形式の数を示す cFormats、キャッシュする各形式のアドバイズフラグを ADVF 列挙体から指定する rgAdvf、プレゼンテーション (既定ハンドラー) かデータ (非既定ハンドラー) のいずれのキャッシュが必要かを示す pAdviseSinkIDataObject::DAdvise のクッキーを返す rgdwConnection、そして単一形式ではなく形式の配列である pFormatEtc です。

複数のプレゼンテーションをオブジェクトのハンドラーによってキャッシュさせる必要のあるコンテナーは、単にこれらの関数を呼び出し、cFormats に形式の数、rgAdvf に各形式の ADVF フラグ、pFormatEtc に形式のセットを指定するだけで済みます。これらのコンテナーは pAdviseSinkNULL を渡します。

独自のデータまたはプレゼンテーションキャッシュをすべて自身で行うコンテナーも同じ手順を実行しますが、非 NULLpAdviseSink を渡します。これらのコンテナーは IAdviseSink::OnDataChange の際にオブジェクトやデータの独自のキャッシュや操作を行います。通常、このようなコンテナーは ADVF_NODATA でアドバイザリ接続を確立することはありませんが、そうすることが禁止されているわけではありません。

これらの新しい関数は OLE 複合ドキュメント向けです。これらの関数を使用することで、アプリケーションは現行の関数で必要とされる繰り返しの起動および初期化の手順を回避できます。これらは、既定のデータおよびプレゼンテーションキャッシュを使用する OLE 複合ドキュメントコンテナーアプリケーション、ならびに基盤となる IDataObject::DAdvise のサポートから独自のキャッシュおよびデータ転送を提供するアプリケーションを対象としています。

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

各言語での呼び出し定義

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

HRESULT OleCreateEx(
    const GUID* rclsid,
    const GUID* riid,
    OLECREATE dwFlags,
    DWORD renderopt,
    DWORD cFormats,
    DWORD* rgAdvf,
    FORMATETC* rgFormatEtc,
    IAdviseSink* lpAdviseSink,
    DWORD* rgdwConnection,
    IOleClientSite* pClientSite,
    IStorage* pStg,
    void** ppvObj
);
[DllImport("OLE32.dll", ExactSpelling = true)]
static extern int OleCreateEx(
    ref Guid rclsid,   // GUID*
    ref Guid riid,   // GUID*
    uint dwFlags,   // OLECREATE
    uint renderopt,   // DWORD
    uint cFormats,   // DWORD
    ref uint rgAdvf,   // DWORD*
    IntPtr rgFormatEtc,   // FORMATETC*
    IntPtr lpAdviseSink,   // IAdviseSink*
    out uint rgdwConnection,   // DWORD* out
    IntPtr pClientSite,   // IOleClientSite*
    IntPtr pStg,   // IStorage*
    IntPtr ppvObj   // void** out
);
<DllImport("OLE32.dll", ExactSpelling:=True)>
Public Shared Function OleCreateEx(
    ByRef rclsid As Guid,   ' GUID*
    ByRef riid As Guid,   ' GUID*
    dwFlags As UInteger,   ' OLECREATE
    renderopt As UInteger,   ' DWORD
    cFormats As UInteger,   ' DWORD
    ByRef rgAdvf As UInteger,   ' DWORD*
    rgFormatEtc As IntPtr,   ' FORMATETC*
    lpAdviseSink As IntPtr,   ' IAdviseSink*
    <Out> ByRef rgdwConnection As UInteger,   ' DWORD* out
    pClientSite As IntPtr,   ' IOleClientSite*
    pStg As IntPtr,   ' IStorage*
    ppvObj As IntPtr   ' void** out
) As Integer
End Function
' rclsid : GUID*
' riid : GUID*
' dwFlags : OLECREATE
' renderopt : DWORD
' cFormats : DWORD
' rgAdvf : DWORD*
' rgFormatEtc : FORMATETC*
' lpAdviseSink : IAdviseSink*
' rgdwConnection : DWORD* out
' pClientSite : IOleClientSite*
' pStg : IStorage*
' ppvObj : void** out
Declare PtrSafe Function OleCreateEx Lib "ole32" ( _
    ByVal rclsid As LongPtr, _
    ByVal riid As LongPtr, _
    ByVal dwFlags As Long, _
    ByVal renderopt As Long, _
    ByVal cFormats As Long, _
    ByRef rgAdvf As Long, _
    ByVal rgFormatEtc As LongPtr, _
    ByVal lpAdviseSink As LongPtr, _
    ByRef rgdwConnection As Long, _
    ByVal pClientSite As LongPtr, _
    ByVal pStg As LongPtr, _
    ByVal ppvObj As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

OleCreateEx = ctypes.windll.ole32.OleCreateEx
OleCreateEx.restype = ctypes.c_int
OleCreateEx.argtypes = [
    ctypes.c_void_p,  # rclsid : GUID*
    ctypes.c_void_p,  # riid : GUID*
    wintypes.DWORD,  # dwFlags : OLECREATE
    wintypes.DWORD,  # renderopt : DWORD
    wintypes.DWORD,  # cFormats : DWORD
    ctypes.POINTER(wintypes.DWORD),  # rgAdvf : DWORD*
    ctypes.c_void_p,  # rgFormatEtc : FORMATETC*
    ctypes.c_void_p,  # lpAdviseSink : IAdviseSink*
    ctypes.POINTER(wintypes.DWORD),  # rgdwConnection : DWORD* out
    ctypes.c_void_p,  # pClientSite : IOleClientSite*
    ctypes.c_void_p,  # pStg : IStorage*
    ctypes.c_void_p,  # ppvObj : void** out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('OLE32.dll')
OleCreateEx = Fiddle::Function.new(
  lib['OleCreateEx'],
  [
    Fiddle::TYPE_VOIDP,  # rclsid : GUID*
    Fiddle::TYPE_VOIDP,  # riid : GUID*
    -Fiddle::TYPE_INT,  # dwFlags : OLECREATE
    -Fiddle::TYPE_INT,  # renderopt : DWORD
    -Fiddle::TYPE_INT,  # cFormats : DWORD
    Fiddle::TYPE_VOIDP,  # rgAdvf : DWORD*
    Fiddle::TYPE_VOIDP,  # rgFormatEtc : FORMATETC*
    Fiddle::TYPE_VOIDP,  # lpAdviseSink : IAdviseSink*
    Fiddle::TYPE_VOIDP,  # rgdwConnection : DWORD* out
    Fiddle::TYPE_VOIDP,  # pClientSite : IOleClientSite*
    Fiddle::TYPE_VOIDP,  # pStg : IStorage*
    Fiddle::TYPE_VOIDP,  # ppvObj : void** out
  ],
  Fiddle::TYPE_INT)
#[link(name = "ole32")]
extern "system" {
    fn OleCreateEx(
        rclsid: *const GUID,  // GUID*
        riid: *const GUID,  // GUID*
        dwFlags: u32,  // OLECREATE
        renderopt: u32,  // DWORD
        cFormats: u32,  // DWORD
        rgAdvf: *mut u32,  // DWORD*
        rgFormatEtc: *mut FORMATETC,  // FORMATETC*
        lpAdviseSink: *mut core::ffi::c_void,  // IAdviseSink*
        rgdwConnection: *mut u32,  // DWORD* out
        pClientSite: *mut core::ffi::c_void,  // IOleClientSite*
        pStg: *mut core::ffi::c_void,  // IStorage*
        ppvObj: *mut *mut ()  // void** out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("OLE32.dll")]
public static extern int OleCreateEx(ref Guid rclsid, ref Guid riid, uint dwFlags, uint renderopt, uint cFormats, ref uint rgAdvf, IntPtr rgFormatEtc, IntPtr lpAdviseSink, out uint rgdwConnection, IntPtr pClientSite, IntPtr pStg, IntPtr ppvObj);
"@
$api = Add-Type -MemberDefinition $sig -Name 'OLE32_OleCreateEx' -Namespace Win32 -PassThru
# $api::OleCreateEx(rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
#uselib "OLE32.dll"
#func global OleCreateEx "OleCreateEx" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; OleCreateEx varptr(rclsid), varptr(riid), dwFlags, renderopt, cFormats, varptr(rgAdvf), varptr(rgFormatEtc), lpAdviseSink, varptr(rgdwConnection), pClientSite, pStg, ppvObj   ; 戻り値は stat
; rclsid : GUID* -> "sptr"
; riid : GUID* -> "sptr"
; dwFlags : OLECREATE -> "sptr"
; renderopt : DWORD -> "sptr"
; cFormats : DWORD -> "sptr"
; rgAdvf : DWORD* -> "sptr"
; rgFormatEtc : FORMATETC* -> "sptr"
; lpAdviseSink : IAdviseSink* -> "sptr"
; rgdwConnection : DWORD* out -> "sptr"
; pClientSite : IOleClientSite* -> "sptr"
; pStg : IStorage* -> "sptr"
; ppvObj : void** out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "OLE32.dll"
#cfunc global OleCreateEx "OleCreateEx" var, var, int, int, int, var, var, sptr, var, sptr, sptr, sptr
; res = OleCreateEx(rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
; rclsid : GUID* -> "var"
; riid : GUID* -> "var"
; dwFlags : OLECREATE -> "int"
; renderopt : DWORD -> "int"
; cFormats : DWORD -> "int"
; rgAdvf : DWORD* -> "var"
; rgFormatEtc : FORMATETC* -> "var"
; lpAdviseSink : IAdviseSink* -> "sptr"
; rgdwConnection : DWORD* out -> "var"
; pClientSite : IOleClientSite* -> "sptr"
; pStg : IStorage* -> "sptr"
; ppvObj : void** out -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HRESULT OleCreateEx(GUID* rclsid, GUID* riid, OLECREATE dwFlags, DWORD renderopt, DWORD cFormats, DWORD* rgAdvf, FORMATETC* rgFormatEtc, IAdviseSink* lpAdviseSink, DWORD* rgdwConnection, IOleClientSite* pClientSite, IStorage* pStg, void** ppvObj)
#uselib "OLE32.dll"
#cfunc global OleCreateEx "OleCreateEx" var, var, int, int, int, var, var, intptr, var, intptr, intptr, intptr
; res = OleCreateEx(rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
; rclsid : GUID* -> "var"
; riid : GUID* -> "var"
; dwFlags : OLECREATE -> "int"
; renderopt : DWORD -> "int"
; cFormats : DWORD -> "int"
; rgAdvf : DWORD* -> "var"
; rgFormatEtc : FORMATETC* -> "var"
; lpAdviseSink : IAdviseSink* -> "intptr"
; rgdwConnection : DWORD* out -> "var"
; pClientSite : IOleClientSite* -> "intptr"
; pStg : IStorage* -> "intptr"
; ppvObj : void** out -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ole32 = windows.NewLazySystemDLL("OLE32.dll")
	procOleCreateEx = ole32.NewProc("OleCreateEx")
)

// rclsid (GUID*), riid (GUID*), dwFlags (OLECREATE), renderopt (DWORD), cFormats (DWORD), rgAdvf (DWORD*), rgFormatEtc (FORMATETC*), lpAdviseSink (IAdviseSink*), rgdwConnection (DWORD* out), pClientSite (IOleClientSite*), pStg (IStorage*), ppvObj (void** out)
r1, _, err := procOleCreateEx.Call(
	uintptr(rclsid),
	uintptr(riid),
	uintptr(dwFlags),
	uintptr(renderopt),
	uintptr(cFormats),
	uintptr(rgAdvf),
	uintptr(rgFormatEtc),
	uintptr(lpAdviseSink),
	uintptr(rgdwConnection),
	uintptr(pClientSite),
	uintptr(pStg),
	uintptr(ppvObj),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function OleCreateEx(
  rclsid: PGUID;   // GUID*
  riid: PGUID;   // GUID*
  dwFlags: DWORD;   // OLECREATE
  renderopt: DWORD;   // DWORD
  cFormats: DWORD;   // DWORD
  rgAdvf: Pointer;   // DWORD*
  rgFormatEtc: Pointer;   // FORMATETC*
  lpAdviseSink: Pointer;   // IAdviseSink*
  rgdwConnection: Pointer;   // DWORD* out
  pClientSite: Pointer;   // IOleClientSite*
  pStg: Pointer;   // IStorage*
  ppvObj: Pointer   // void** out
): Integer; stdcall;
  external 'OLE32.dll' name 'OleCreateEx';
result := DllCall("OLE32\OleCreateEx"
    , "Ptr", rclsid   ; GUID*
    , "Ptr", riid   ; GUID*
    , "UInt", dwFlags   ; OLECREATE
    , "UInt", renderopt   ; DWORD
    , "UInt", cFormats   ; DWORD
    , "Ptr", rgAdvf   ; DWORD*
    , "Ptr", rgFormatEtc   ; FORMATETC*
    , "Ptr", lpAdviseSink   ; IAdviseSink*
    , "Ptr", rgdwConnection   ; DWORD* out
    , "Ptr", pClientSite   ; IOleClientSite*
    , "Ptr", pStg   ; IStorage*
    , "Ptr", ppvObj   ; void** out
    , "Int")   ; return: HRESULT
●OleCreateEx(rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj) = DLL("OLE32.dll", "int OleCreateEx(void*, void*, dword, dword, dword, void*, void*, void*, void*, void*, void*, void*)")
# 呼び出し: OleCreateEx(rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
# rclsid : GUID* -> "void*"
# riid : GUID* -> "void*"
# dwFlags : OLECREATE -> "dword"
# renderopt : DWORD -> "dword"
# cFormats : DWORD -> "dword"
# rgAdvf : DWORD* -> "void*"
# rgFormatEtc : FORMATETC* -> "void*"
# lpAdviseSink : IAdviseSink* -> "void*"
# rgdwConnection : DWORD* out -> "void*"
# pClientSite : IOleClientSite* -> "void*"
# pStg : IStorage* -> "void*"
# ppvObj : void** out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "ole32" fn OleCreateEx(
    rclsid: [*c]GUID, // GUID*
    riid: [*c]GUID, // GUID*
    dwFlags: u32, // OLECREATE
    renderopt: u32, // DWORD
    cFormats: u32, // DWORD
    rgAdvf: [*c]u32, // DWORD*
    rgFormatEtc: [*c]FORMATETC, // FORMATETC*
    lpAdviseSink: ?*anyopaque, // IAdviseSink*
    rgdwConnection: [*c]u32, // DWORD* out
    pClientSite: ?*anyopaque, // IOleClientSite*
    pStg: ?*anyopaque, // IStorage*
    ppvObj: ?*anyopaque // void** out
) callconv(std.os.windows.WINAPI) i32;
proc OleCreateEx(
    rclsid: ptr GUID,  # GUID*
    riid: ptr GUID,  # GUID*
    dwFlags: uint32,  # OLECREATE
    renderopt: uint32,  # DWORD
    cFormats: uint32,  # DWORD
    rgAdvf: ptr uint32,  # DWORD*
    rgFormatEtc: ptr FORMATETC,  # FORMATETC*
    lpAdviseSink: pointer,  # IAdviseSink*
    rgdwConnection: ptr uint32,  # DWORD* out
    pClientSite: pointer,  # IOleClientSite*
    pStg: pointer,  # IStorage*
    ppvObj: pointer  # void** out
): int32 {.importc: "OleCreateEx", stdcall, dynlib: "OLE32.dll".}
pragma(lib, "ole32");
extern(Windows)
int OleCreateEx(
    GUID* rclsid,   // GUID*
    GUID* riid,   // GUID*
    uint dwFlags,   // OLECREATE
    uint renderopt,   // DWORD
    uint cFormats,   // DWORD
    uint* rgAdvf,   // DWORD*
    FORMATETC* rgFormatEtc,   // FORMATETC*
    void* lpAdviseSink,   // IAdviseSink*
    uint* rgdwConnection,   // DWORD* out
    void* pClientSite,   // IOleClientSite*
    void* pStg,   // IStorage*
    void** ppvObj   // void** out
);
ccall((:OleCreateEx, "OLE32.dll"), stdcall, Int32,
      (Ptr{GUID}, Ptr{GUID}, UInt32, UInt32, UInt32, Ptr{UInt32}, Ptr{FORMATETC}, Ptr{Cvoid}, Ptr{UInt32}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}),
      rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
# rclsid : GUID* -> Ptr{GUID}
# riid : GUID* -> Ptr{GUID}
# dwFlags : OLECREATE -> UInt32
# renderopt : DWORD -> UInt32
# cFormats : DWORD -> UInt32
# rgAdvf : DWORD* -> Ptr{UInt32}
# rgFormatEtc : FORMATETC* -> Ptr{FORMATETC}
# lpAdviseSink : IAdviseSink* -> Ptr{Cvoid}
# rgdwConnection : DWORD* out -> Ptr{UInt32}
# pClientSite : IOleClientSite* -> Ptr{Cvoid}
# pStg : IStorage* -> Ptr{Cvoid}
# ppvObj : void** out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t OleCreateEx(
    void* rclsid,
    void* riid,
    uint32_t dwFlags,
    uint32_t renderopt,
    uint32_t cFormats,
    uint32_t* rgAdvf,
    void* rgFormatEtc,
    void* lpAdviseSink,
    uint32_t* rgdwConnection,
    void* pClientSite,
    void* pStg,
    void** ppvObj);
]]
local ole32 = ffi.load("ole32")
-- ole32.OleCreateEx(rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
-- rclsid : GUID*
-- riid : GUID*
-- dwFlags : OLECREATE
-- renderopt : DWORD
-- cFormats : DWORD
-- rgAdvf : DWORD*
-- rgFormatEtc : FORMATETC*
-- lpAdviseSink : IAdviseSink*
-- rgdwConnection : DWORD* out
-- pClientSite : IOleClientSite*
-- pStg : IStorage*
-- ppvObj : void** out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('OLE32.dll');
const OleCreateEx = lib.func('__stdcall', 'OleCreateEx', 'int32_t', ['void *', 'void *', 'uint32_t', 'uint32_t', 'uint32_t', 'uint32_t *', 'void *', 'void *', 'uint32_t *', 'void *', 'void *', 'void *']);
// OleCreateEx(rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
// rclsid : GUID* -> 'void *'
// riid : GUID* -> 'void *'
// dwFlags : OLECREATE -> 'uint32_t'
// renderopt : DWORD -> 'uint32_t'
// cFormats : DWORD -> 'uint32_t'
// rgAdvf : DWORD* -> 'uint32_t *'
// rgFormatEtc : FORMATETC* -> 'void *'
// lpAdviseSink : IAdviseSink* -> 'void *'
// rgdwConnection : DWORD* out -> 'uint32_t *'
// pClientSite : IOleClientSite* -> 'void *'
// pStg : IStorage* -> 'void *'
// ppvObj : void** out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("OLE32.dll", {
  OleCreateEx: { parameters: ["pointer", "pointer", "u32", "u32", "u32", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.OleCreateEx(rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
// rclsid : GUID* -> "pointer"
// riid : GUID* -> "pointer"
// dwFlags : OLECREATE -> "u32"
// renderopt : DWORD -> "u32"
// cFormats : DWORD -> "u32"
// rgAdvf : DWORD* -> "pointer"
// rgFormatEtc : FORMATETC* -> "pointer"
// lpAdviseSink : IAdviseSink* -> "pointer"
// rgdwConnection : DWORD* out -> "pointer"
// pClientSite : IOleClientSite* -> "pointer"
// pStg : IStorage* -> "pointer"
// ppvObj : void** out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t OleCreateEx(
    void* rclsid,
    void* riid,
    uint32_t dwFlags,
    uint32_t renderopt,
    uint32_t cFormats,
    uint32_t* rgAdvf,
    void* rgFormatEtc,
    void* lpAdviseSink,
    uint32_t* rgdwConnection,
    void* pClientSite,
    void* pStg,
    void** ppvObj);
C, "OLE32.dll");
// $ffi->OleCreateEx(rclsid, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj);
// rclsid : GUID*
// riid : GUID*
// dwFlags : OLECREATE
// renderopt : DWORD
// cFormats : DWORD
// rgAdvf : DWORD*
// rgFormatEtc : FORMATETC*
// lpAdviseSink : IAdviseSink*
// rgdwConnection : DWORD* out
// pClientSite : IOleClientSite*
// pStg : IStorage*
// ppvObj : 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 Ole32 extends StdCallLibrary {
    Ole32 INSTANCE = Native.load("ole32", Ole32.class);
    int OleCreateEx(
        Pointer rclsid,   // GUID*
        Pointer riid,   // GUID*
        int dwFlags,   // OLECREATE
        int renderopt,   // DWORD
        int cFormats,   // DWORD
        IntByReference rgAdvf,   // DWORD*
        Pointer rgFormatEtc,   // FORMATETC*
        Pointer lpAdviseSink,   // IAdviseSink*
        IntByReference rgdwConnection,   // DWORD* out
        Pointer pClientSite,   // IOleClientSite*
        Pointer pStg,   // IStorage*
        Pointer ppvObj   // void** out
    );
}
@[Link("ole32")]
lib LibOLE32
  fun OleCreateEx = OleCreateEx(
    rclsid : GUID*,   # GUID*
    riid : GUID*,   # GUID*
    dwFlags : UInt32,   # OLECREATE
    renderopt : UInt32,   # DWORD
    cFormats : UInt32,   # DWORD
    rgAdvf : UInt32*,   # DWORD*
    rgFormatEtc : FORMATETC*,   # FORMATETC*
    lpAdviseSink : Void*,   # IAdviseSink*
    rgdwConnection : UInt32*,   # DWORD* out
    pClientSite : Void*,   # IOleClientSite*
    pStg : Void*,   # IStorage*
    ppvObj : 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 OleCreateExNative = Int32 Function(Pointer<Void>, Pointer<Void>, Uint32, Uint32, Uint32, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef OleCreateExDart = int Function(Pointer<Void>, Pointer<Void>, int, int, int, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final OleCreateEx = DynamicLibrary.open('OLE32.dll')
    .lookupFunction<OleCreateExNative, OleCreateExDart>('OleCreateEx');
// rclsid : GUID* -> Pointer<Void>
// riid : GUID* -> Pointer<Void>
// dwFlags : OLECREATE -> Uint32
// renderopt : DWORD -> Uint32
// cFormats : DWORD -> Uint32
// rgAdvf : DWORD* -> Pointer<Uint32>
// rgFormatEtc : FORMATETC* -> Pointer<Void>
// lpAdviseSink : IAdviseSink* -> Pointer<Void>
// rgdwConnection : DWORD* out -> Pointer<Uint32>
// pClientSite : IOleClientSite* -> Pointer<Void>
// pStg : IStorage* -> Pointer<Void>
// ppvObj : void** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function OleCreateEx(
  rclsid: PGUID;   // GUID*
  riid: PGUID;   // GUID*
  dwFlags: DWORD;   // OLECREATE
  renderopt: DWORD;   // DWORD
  cFormats: DWORD;   // DWORD
  rgAdvf: Pointer;   // DWORD*
  rgFormatEtc: Pointer;   // FORMATETC*
  lpAdviseSink: Pointer;   // IAdviseSink*
  rgdwConnection: Pointer;   // DWORD* out
  pClientSite: Pointer;   // IOleClientSite*
  pStg: Pointer;   // IStorage*
  ppvObj: Pointer   // void** out
): Integer; stdcall;
  external 'OLE32.dll' name 'OleCreateEx';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "OleCreateEx"
  c_OleCreateEx :: Ptr () -> Ptr () -> Word32 -> Word32 -> Word32 -> Ptr Word32 -> Ptr () -> Ptr () -> Ptr Word32 -> Ptr () -> Ptr () -> Ptr () -> IO Int32
-- rclsid : GUID* -> Ptr ()
-- riid : GUID* -> Ptr ()
-- dwFlags : OLECREATE -> Word32
-- renderopt : DWORD -> Word32
-- cFormats : DWORD -> Word32
-- rgAdvf : DWORD* -> Ptr Word32
-- rgFormatEtc : FORMATETC* -> Ptr ()
-- lpAdviseSink : IAdviseSink* -> Ptr ()
-- rgdwConnection : DWORD* out -> Ptr Word32
-- pClientSite : IOleClientSite* -> Ptr ()
-- pStg : IStorage* -> Ptr ()
-- ppvObj : void** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let olecreateex =
  foreign "OleCreateEx"
    ((ptr void) @-> (ptr void) @-> uint32_t @-> uint32_t @-> uint32_t @-> (ptr uint32_t) @-> (ptr void) @-> (ptr void) @-> (ptr uint32_t) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* rclsid : GUID* -> (ptr void) *)
(* riid : GUID* -> (ptr void) *)
(* dwFlags : OLECREATE -> uint32_t *)
(* renderopt : DWORD -> uint32_t *)
(* cFormats : DWORD -> uint32_t *)
(* rgAdvf : DWORD* -> (ptr uint32_t) *)
(* rgFormatEtc : FORMATETC* -> (ptr void) *)
(* lpAdviseSink : IAdviseSink* -> (ptr void) *)
(* rgdwConnection : DWORD* out -> (ptr uint32_t) *)
(* pClientSite : IOleClientSite* -> (ptr void) *)
(* pStg : IStorage* -> (ptr void) *)
(* ppvObj : void** out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library ole32 (t "OLE32.dll"))
(cffi:use-foreign-library ole32)

(cffi:defcfun ("OleCreateEx" ole-create-ex :convention :stdcall) :int32
  (rclsid :pointer)   ; GUID*
  (riid :pointer)   ; GUID*
  (dw-flags :uint32)   ; OLECREATE
  (renderopt :uint32)   ; DWORD
  (c-formats :uint32)   ; DWORD
  (rg-advf :pointer)   ; DWORD*
  (rg-format-etc :pointer)   ; FORMATETC*
  (lp-advise-sink :pointer)   ; IAdviseSink*
  (rgdw-connection :pointer)   ; DWORD* out
  (p-client-site :pointer)   ; IOleClientSite*
  (p-stg :pointer)   ; IStorage*
  (ppv-obj :pointer))   ; void** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $OleCreateEx = Win32::API::More->new('OLE32',
    'int OleCreateEx(LPVOID rclsid, LPVOID riid, DWORD dwFlags, DWORD renderopt, DWORD cFormats, LPVOID rgAdvf, LPVOID rgFormatEtc, LPVOID lpAdviseSink, LPVOID rgdwConnection, LPVOID pClientSite, LPVOID pStg, LPVOID ppvObj)');
# my $ret = $OleCreateEx->Call($rclsid, $riid, $dwFlags, $renderopt, $cFormats, $rgAdvf, $rgFormatEtc, $lpAdviseSink, $rgdwConnection, $pClientSite, $pStg, $ppvObj);
# rclsid : GUID* -> LPVOID
# riid : GUID* -> LPVOID
# dwFlags : OLECREATE -> DWORD
# renderopt : DWORD -> DWORD
# cFormats : DWORD -> DWORD
# rgAdvf : DWORD* -> LPVOID
# rgFormatEtc : FORMATETC* -> LPVOID
# lpAdviseSink : IAdviseSink* -> LPVOID
# rgdwConnection : DWORD* out -> LPVOID
# pClientSite : IOleClientSite* -> LPVOID
# pStg : IStorage* -> LPVOID
# ppvObj : void** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

類似 API
公式の関連項目
使用する型