Win32 API 日本語リファレンス
ホーム › UI.Shell.PropertiesSystem › PSGetPropertyDescriptionByName

PSGetPropertyDescriptionByName

関数
正規名からプロパティの説明情報を取得する。
DLLPROPSYS.dll呼出規約winapi対応OSWindows XP 以降

シグネチャ

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

HRESULT PSGetPropertyDescriptionByName(
    LPCWSTR pszCanonicalName,
    const GUID* riid,
    void** ppv
);

パラメーター

名前型方向説明
pszCanonicalNameLPCWSTRinプロパティを識別する、null で終わる Unicode 文字列へのポインター。
riidGUID*in要求するプロパティのインターフェイス ID への参照。
ppvvoid**outこの関数から制御が戻るとき、riid で要求したインターフェイスポインターが格納されます。通常は IPropertyDescription、IPropertyDescriptionAliasInfo、または IPropertyDescriptionSearchInfo です。

戻り値の型: HRESULT

公式ドキュメント

指定したプロパティ名に対するプロパティ記述 (property description) インターフェイスのインスタンスを取得します。

戻り値

型: PSSTDAPI

次のいずれかの値を返します。

戻り値 説明
S_OK
インターフェイスが取得されました。
E_INVALIDARG
pszCanonicalName パラメーターが NULL です。
TYPE_E_ELEMENTNOTFOUND
指定された正規名がスキーマサブシステムのキャッシュに存在しません。

解説(Remarks)

riid パラメーターと ppv パラメーターの指定には、objbase.h で定義されている IID_PPV_ARGS マクロを使用することをお勧めします。このマクロは ppv の値が指すインターフェイスに基づいて正しい IID を提供するため、コーディングエラーの可能性を排除できます。

pszCanonicalName には、プロパティの正規名 (canonical name) を指すようにすることをお勧めします (例: L"System.Keywords")。正規名は大文字と小文字が区別されます。

新しい正規名に加えて、呼び出し元はプロパティの従来の名前 (レガシー名) を渡すこともできます。次の表に、サポートされるレガシー名と、それらに対応する正規名の完全な一覧を示します。

プロパティ名 対応するプロパティ
Access System.DateAccessed
Album System.Music.AlbumTitle
AllocSize System.FileAllocationSize
Aperture System.Photo.Aperture
Artist System.Music.Artist
Attrib System.FileAttributes
Attributes System.FileAttributes
AttributesDescription System.FileAttributesDisplay
Audio Format System.Audio.Format
Audio Sample Size System.Audio.SampleSize
BitDepth System.Image.BitDepth
Bitrate System.Audio.EncodingBitrate
CameraModel System.Photo.CameraModel
Capacity System.Capacity
Channels System.Audio.ChannelCount
ColorSpace System.Image.ColorSpace
Company System.Company
Compression System.Video.Compression
Compression System.Video.Compression
Copyright System.Copyright
Copyright System.Copyright
Copyright System.Image.Copyright
Create System.DateCreated
CSCStatus System.OfflineStatus
Data Rate System.Video.EncodingBitrate
DateDeleted System.Recycle.DateDeleted
DeletedFrom System.Recycle.DeletedFrom
Dimensions System.Image.Dimensions
Directory System.ItemFolderNameDisplay
Distance System.Photo.SubjectDistance
DocAppName System.ApplicationName
DocAuthor System.Author
DocByteCount System.Document.ByteCount
DocCategory System.Category
DocCharCount System.Document.CharacterCount
DocComments System.Comment
DocCompany System.Company
DocCreatedTm System.Document.DateCreated
DocEditTime System.Document.TotalEditingTime
DocHiddenCount System.Document.HiddenSlideCount
DocKeywords System.Keywords
DocLastAuthor System.Document.LastAuthor
DocLastPrinted System.Document.DatePrinted
DocLastSavedTm System.Document.DateSaved
DocLineCount System.Document.LineCount
DocManager System.Document.Manager
DocNoteCount System.Document.NoteCount
DocPageCount System.Document.PageCount
DocParaCount System.Document.ParagraphCount
DocPresentationTarget System.Document.PresentationFormat
DocRevNumber System.Document.RevisionNumber
DocSlideCount System.Document.SlideCount
DocSubject System.Subject
DocTemplate System.Document.Template
DocTitle System.Title
DocWordCount System.Document.WordCount
DRM Description System.DRM.Description
Duration System.Media.Duration
EquipMake System.Photo.CameraManufacturer
ExposureBias System.Photo.ExposureBias
ExposureProg System.Photo.ExposureProgram
ExposureTime System.Photo.ExposureTime
FaxCallerID System.Fax.CallerID
FaxCSID System.Fax.CSID
FaxRecipientName System.Fax.RecipientName
FaxRecipientNumber System.Fax.RecipientNumber
FaxRouting System.Fax.Routing
FaxSenderName System.Fax.SenderName
FaxTime System.Fax.Time
FaxTSID System.Fax.TSID
FileDescription System.FileDescription
FileSystem System.Volume.FileSystem
FileType System.Image.FileType
FileVersion System.FileVersion
Flash System.Photo.Flash
FlashEnergy System.Photo.FlashEnergy
FNumber System.Photo.FNumber
FocalLength System.Photo.FocalLength
Frame Rate System.Video.FrameRate
FrameCount System.Media.FrameCount
FreeSpace System.FreeSpace
Genre System.Music.Genre
ImageX System.Image.HorizontalSize
ImageY System.Image.VerticalSize
ISOSpeed System.Photo.ISOSpeed
LightSource System.Photo.LightSource
LinksUpToDate System.Document.LinksDirty
LinkTarget System.Link.TargetParsingPath
Lyrics System.Music.Lyrics
Manager System.Document.Manager
MeteringMode System.Photo.MeteringMode
MMClipCount System.Document.MultimediaClipCount
Name System.ItemNameDisplay
Owner System.FileOwner
Play Count System.DRM.PlayCount
Play Expires System.DRM.DatePlayExpires
Play Starts System.DRM.DatePlayStarts
PresentationTarget System.Document.PresentationFormat
ProductName System.Software.ProductName
ProductVersion System.Software.ProductVersion
Project System.Media.Project
Protected System.DRM.IsProtected
Rank System.Search.Rank
Rating System.Rating
ResolutionX System.Image.HorizontalResolution
ResolutionY System.Image.VerticalResolution
Sample Rate System.Audio.SampleRate
Scale System.Document.Scale
ShutterSpeed System.Photo.ShutterSpeed
Size System.Size
Software System.SoftwareUsed
Status System.Media.Status
Status System.Status
Stream Name System.Video.StreamName
SyncCopyIn System.Sync.CopyIn
Track System.Music.TrackNumber
Type System.ItemTypeText
Video Sample Size System.Video.SampleSize
WhenTaken System.Photo.DateTaken
Write System.DateModified
Year System.Media.Year
 

例

次の例は、より大きなプログラムの一部として組み込むもので、PSGetPropertyDescriptionByName を使用して評価 (rating) プロパティの記述を取得する方法を示します。

IPropertyDescription *pPropDesc;

HRESULT hr = PSGetPropertyDescriptionByName(L"System.Rating", IID_PPV_ARGS(&pPropDesc))

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

各言語での呼び出し定義

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

HRESULT PSGetPropertyDescriptionByName(
    LPCWSTR pszCanonicalName,
    const GUID* riid,
    void** ppv
);
[DllImport("PROPSYS.dll", ExactSpelling = true)]
static extern int PSGetPropertyDescriptionByName(
    [MarshalAs(UnmanagedType.LPWStr)] string pszCanonicalName,   // LPCWSTR
    ref Guid riid,   // GUID*
    IntPtr ppv   // void** out
);
<DllImport("PROPSYS.dll", ExactSpelling:=True)>
Public Shared Function PSGetPropertyDescriptionByName(
    <MarshalAs(UnmanagedType.LPWStr)> pszCanonicalName As String,   ' LPCWSTR
    ByRef riid As Guid,   ' GUID*
    ppv As IntPtr   ' void** out
) As Integer
End Function
' pszCanonicalName : LPCWSTR
' riid : GUID*
' ppv : void** out
Declare PtrSafe Function PSGetPropertyDescriptionByName Lib "propsys" ( _
    ByVal pszCanonicalName As LongPtr, _
    ByVal riid As LongPtr, _
    ByVal ppv As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

PSGetPropertyDescriptionByName = ctypes.windll.propsys.PSGetPropertyDescriptionByName
PSGetPropertyDescriptionByName.restype = ctypes.c_int
PSGetPropertyDescriptionByName.argtypes = [
    wintypes.LPCWSTR,  # pszCanonicalName : LPCWSTR
    ctypes.c_void_p,  # riid : GUID*
    ctypes.c_void_p,  # ppv : void** out
]
require 'fiddle'
require 'fiddle/import'

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

var (
	propsys = windows.NewLazySystemDLL("PROPSYS.dll")
	procPSGetPropertyDescriptionByName = propsys.NewProc("PSGetPropertyDescriptionByName")
)

// pszCanonicalName (LPCWSTR), riid (GUID*), ppv (void** out)
r1, _, err := procPSGetPropertyDescriptionByName.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pszCanonicalName))),
	uintptr(riid),
	uintptr(ppv),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function PSGetPropertyDescriptionByName(
  pszCanonicalName: PWideChar;   // LPCWSTR
  riid: PGUID;   // GUID*
  ppv: Pointer   // void** out
): Integer; stdcall;
  external 'PROPSYS.dll' name 'PSGetPropertyDescriptionByName';
result := DllCall("PROPSYS\PSGetPropertyDescriptionByName"
    , "WStr", pszCanonicalName   ; LPCWSTR
    , "Ptr", riid   ; GUID*
    , "Ptr", ppv   ; void** out
    , "Int")   ; return: HRESULT
●PSGetPropertyDescriptionByName(pszCanonicalName, riid, ppv) = DLL("PROPSYS.dll", "int PSGetPropertyDescriptionByName(char*, void*, void*)")
# 呼び出し: PSGetPropertyDescriptionByName(pszCanonicalName, riid, ppv)
# pszCanonicalName : LPCWSTR -> "char*"
# riid : GUID* -> "void*"
# ppv : void** out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "propsys" fn PSGetPropertyDescriptionByName(
    pszCanonicalName: [*c]const u16, // LPCWSTR
    riid: [*c]GUID, // GUID*
    ppv: ?*anyopaque // void** out
) callconv(std.os.windows.WINAPI) i32;
proc PSGetPropertyDescriptionByName(
    pszCanonicalName: WideCString,  # LPCWSTR
    riid: ptr GUID,  # GUID*
    ppv: pointer  # void** out
): int32 {.importc: "PSGetPropertyDescriptionByName", stdcall, dynlib: "PROPSYS.dll".}
pragma(lib, "propsys");
extern(Windows)
int PSGetPropertyDescriptionByName(
    const(wchar)* pszCanonicalName,   // LPCWSTR
    GUID* riid,   // GUID*
    void** ppv   // void** out
);
ccall((:PSGetPropertyDescriptionByName, "PROPSYS.dll"), stdcall, Int32,
      (Cwstring, Ptr{GUID}, Ptr{Cvoid}),
      pszCanonicalName, riid, ppv)
# pszCanonicalName : LPCWSTR -> Cwstring
# riid : GUID* -> Ptr{GUID}
# ppv : void** out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t PSGetPropertyDescriptionByName(
    const uint16_t* pszCanonicalName,
    void* riid,
    void** ppv);
]]
local propsys = ffi.load("propsys")
-- propsys.PSGetPropertyDescriptionByName(pszCanonicalName, riid, ppv)
-- pszCanonicalName : LPCWSTR
-- riid : GUID*
-- ppv : void** out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('PROPSYS.dll');
const PSGetPropertyDescriptionByName = lib.func('__stdcall', 'PSGetPropertyDescriptionByName', 'int32_t', ['str16', 'void *', 'void *']);
// PSGetPropertyDescriptionByName(pszCanonicalName, riid, ppv)
// pszCanonicalName : LPCWSTR -> 'str16'
// riid : GUID* -> 'void *'
// ppv : void** out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("PROPSYS.dll", {
  PSGetPropertyDescriptionByName: { parameters: ["buffer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.PSGetPropertyDescriptionByName(pszCanonicalName, riid, ppv)
// pszCanonicalName : LPCWSTR -> "buffer"
// riid : GUID* -> "pointer"
// ppv : void** out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t PSGetPropertyDescriptionByName(
    const uint16_t* pszCanonicalName,
    void* riid,
    void** ppv);
C, "PROPSYS.dll");
// $ffi->PSGetPropertyDescriptionByName(pszCanonicalName, riid, ppv);
// pszCanonicalName : LPCWSTR
// riid : GUID*
// ppv : 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 Propsys extends StdCallLibrary {
    Propsys INSTANCE = Native.load("propsys", Propsys.class);
    int PSGetPropertyDescriptionByName(
        WString pszCanonicalName,   // LPCWSTR
        Pointer riid,   // GUID*
        Pointer ppv   // void** out
    );
}
@[Link("propsys")]
lib LibPROPSYS
  fun PSGetPropertyDescriptionByName = PSGetPropertyDescriptionByName(
    pszCanonicalName : UInt16*,   # LPCWSTR
    riid : GUID*,   # GUID*
    ppv : 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 PSGetPropertyDescriptionByNameNative = Int32 Function(Pointer<Utf16>, Pointer<Void>, Pointer<Void>);
typedef PSGetPropertyDescriptionByNameDart = int Function(Pointer<Utf16>, Pointer<Void>, Pointer<Void>);
final PSGetPropertyDescriptionByName = DynamicLibrary.open('PROPSYS.dll')
    .lookupFunction<PSGetPropertyDescriptionByNameNative, PSGetPropertyDescriptionByNameDart>('PSGetPropertyDescriptionByName');
// pszCanonicalName : LPCWSTR -> Pointer<Utf16>
// riid : GUID* -> Pointer<Void>
// ppv : void** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function PSGetPropertyDescriptionByName(
  pszCanonicalName: PWideChar;   // LPCWSTR
  riid: PGUID;   // GUID*
  ppv: Pointer   // void** out
): Integer; stdcall;
  external 'PROPSYS.dll' name 'PSGetPropertyDescriptionByName';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "PSGetPropertyDescriptionByName"
  c_PSGetPropertyDescriptionByName :: CWString -> Ptr () -> Ptr () -> IO Int32
-- pszCanonicalName : LPCWSTR -> CWString
-- riid : GUID* -> Ptr ()
-- ppv : void** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let psgetpropertydescriptionbyname =
  foreign "PSGetPropertyDescriptionByName"
    ((ptr uint16_t) @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* pszCanonicalName : LPCWSTR -> (ptr uint16_t) *)
(* riid : GUID* -> (ptr void) *)
(* ppv : void** out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library propsys (t "PROPSYS.dll"))
(cffi:use-foreign-library propsys)

(cffi:defcfun ("PSGetPropertyDescriptionByName" psget-property-description-by-name :convention :stdcall) :int32
  (psz-canonical-name (:string :encoding :utf-16le))   ; LPCWSTR
  (riid :pointer)   ; GUID*
  (ppv :pointer))   ; void** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $PSGetPropertyDescriptionByName = Win32::API::More->new('PROPSYS',
    'int PSGetPropertyDescriptionByName(LPCWSTR pszCanonicalName, LPVOID riid, LPVOID ppv)');
# my $ret = $PSGetPropertyDescriptionByName->Call($pszCanonicalName, $riid, $ppv);
# pszCanonicalName : LPCWSTR -> LPCWSTR
# riid : GUID* -> LPVOID
# ppv : void** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目