Marshalling
- Option Strict On
- Imports System.Runtime.InteropServices
- Module Program
- Declare Unicode Sub BeginTest Lib ".\..\..\..\..\..\x64\Debug\Dll_ForMarshalling.dll" (
- str As String, FunSelector As Int32)
- Declare Unicode Sub Get_TestData Lib ".\..\..\..\..\..\x64\Debug\Dll_ForMarshalling.dll" (
- <InAttribute(), OutAttribute(), MarshalAs(UnmanagedType.LPWStr)> ByRef str As Text.StringBuilder, nMAxCount As Int32)
- Sub Main(args As String())
- For ii As Int32 = 1 To 1
- Known_Folder_Desktop()
- If (ii <= 1) Then Console.ReadKey()
- Dim stringbuilder As New Text.StringBuilder(4 << 20)
- BeginTest(" Desktop ", 1)
- Get_TestData(stringbuilder, stringbuilder.Capacity)
- OUTPUT2(stringbuilder.ToString)
- If (ii <= 1) Then Console.ReadKey()
- Console.WriteLine("=== KnownFolderManager ===")
- KnownFolderManager()
- Console.WriteLine("=== KnownFolderManager ====")
- If (ii <= 1) Then Console.ReadKey()
- Dim stringbuilder2 As New Text.StringBuilder(4 << 20)
- BeginTest(" KnownFolder_Manager ", 2)
- Get_TestData(stringbuilder2, stringbuilder2.Capacity)
- OUTPUT2(stringbuilder2.ToString)
- If (ii <= 1) Then Console.ReadKey()
- Next ii
- Console.Write("Press any key to exit") : Console.ReadKey()
- End Sub
- Public ReadOnly FolderId_Desktop_guid As New Guid(FolderId_Desktop)
- Sub Known_Folder_Desktop()
- Try
- Dim Hresult As Int32
- Hresult = SHGetKnownFolderPath(FolderId_Desktop_guid,
- 0, Null,
- KnownFolderPath)
- If Hresult <> S_OK Then
- OUTPUT2($"error: SHGetKnownFolderPath == {FolderId_Desktop_guid} {Hresult:X} ")
- Else
- OUTPUT2("SHGetKnownFolderPath ==> " & KnownFolderPath)
- End If
- Dim ptr_IDList As IntPtr
- Hresult = SHGetKnownFolderIDList(FolderId_Desktop_guid,
- 0, Null,
- ptr_IDList)
- If Hresult <> S_OK Then
- OUTPUT2($"error1: SHGetKnownFolderIDList {Hresult:x}")
- Else
- Hresult = SHGetNameFromIDList(ptr_IDList, SIGDN.SIGDN_URL, URL_Path)
- If Hresult <> S_OK Then
- OUTPUT2($"error2: SHGetNameFromIDList {Hresult:x}")
- Else
- ILFree(ptr_IDList)
- OUTPUT2("URL_Path ======> " & URL_Path)
- End If
- End If
- Hresult = SHGetKnownFolderItem(FolderId_Desktop_guid, 0, Null,
- New Guid(IID_IShellItem), pIShellItem_Obj)
- Dim pIShellItem As IShellItem = CType(pIShellItem_Obj, IShellItem)
- pIShellItem.GetDisplayName(SIGDN.SIGDN_NORMALDISPLAY, pName_NormalDisplay)
- pIShellItem.GetDisplayName(SIGDN.SIGDN_FILESYSPATH, pName_FileSysPATH)
- OUTPUT2($"Name : {pName_NormalDisplay}")
- OUTPUT2($"Name : {pName_FileSysPATH}")
- Dim pIShellItem2 As IShellItem2 = CType(pIShellItem, IShellItem2)
- pIShellItem2.GetDisplayName(SIGDN.SIGDN_NORMALDISPLAY, pName2_NormalDisplay)
- pIShellItem2.GetDisplayName(SIGDN.SIGDN_FILESYSPATH, pName2_FileSysPATH)
- OUTPUT2($"Name2 : {pName2_NormalDisplay}")
- OUTPUT2($"Name2 : {pName2_FileSysPATH}")
- Catch ex As Exception
- Console.WriteLine($"Exception:{ex.Message}(hr={ex.HResult:x})")
- Console.Beep() : Console.ReadKey()
- End Try
- End Sub
- Sub KnownFolderManager()
- Dim CLSCTX_INPROC_SERVER As UInt32 = &H1
- Dim pIUnknown As IUnKnown = Nothing
- Dim pManager As IKnownFolderManager = Nothing
- Dim hr As Int32 = CoCreateInstance(New Guid(CLSID_KnownFolderManager), Null,
- CLSCTX_INPROC_SERVER, New Guid(IID_IKnownFolderManager),
- pIUnknown)
- If hr = S_OK Then
- pManager = CType(pIUnknown, IKnownFolderManager)
- Dim CountOfFolderIds As UInteger = 0
- Dim ptr_kfids As IntPtr
- pManager.GetFolderIds(ptr_kfids, CountOfFolderIds)
- For ii As Int32 = 0 To CInt(CountOfFolderIds - 1)
- Dim pIKnownFolder_obj As Object = Nothing
- Dim pIKnownFolder As IKnownFolder
- Dim pIShellItem_Obj As Object = Nothing
- Dim pIShellItem As IShellItem
- Try
- Dim KnownFolderId As Guid = Marshal.PtrToStructure(Of Guid)(
- ptr_kfids + (ii * Marshal.SizeOf(Of Guid)()))
- pManager.GetFolder(KnownFolderId, pIKnownFolder_obj)
- pIKnownFolder = CType(pIKnownFolder_obj, IKnownFolder)
- Console.Write("{0,3:d}:", ii + 1)
- pIKnownFolder.GetShellItem(0, New Guid(IID_IShellItem), pIShellItem_Obj)
- pIShellItem = CType(pIShellItem_Obj, IShellItem)
- Dim pwstr As String = Nothing
- pIShellItem.GetDisplayName(SIGDN.SIGDN_NORMALDISPLAY, pwstr)
- If pwstr IsNot Nothing Then
- Console.Write("{0} ===>", pwstr)
- End If
- Dim pwstr2 As String = Nothing
- pIShellItem.GetDisplayName(SIGDN.SIGDN_FILESYSPATH, pwstr2)
- Console.Write(" {0:123,S}", pwstr2)
- Catch ex As Exception
- 'Console.Write(ex.HResult.ToString("x") & " " & ex.Message)
- End Try
- Console.WriteLine()
- Next ii
- CoTaskMemFree(ptr_kfids)
- End If
- End Sub
- Sub OUTPUT2(str As String)
- Console.WriteLine("{0}", str)
- End Sub
- Dim pIShellItem_Obj As Object
- Dim pIShellItem2_Obj As Object
- Dim URL_Path As String
- Dim KnownFolderPath As String
- Dim pName_NormalDisplay As String
- Dim pName_FileSysPATH As String
- Dim pName2_NormalDisplay As String
- Dim pName2_FileSysPATH As String
- Declare Unicode Function SHGetKnownFolderItem Lib "Shell32" (
- <InAttribute(), MarshalAs(UnmanagedType.LPStruct)> REF_KNOWN_FOLDER_ID As Guid,
- _In_KNOWN_FOLDER_FLAG_flags As UInt32,
- _In_opt_HANDLE_hToken As IntPtr,
- <MarshalAs(UnmanagedType.LPStruct)> REF_IID_riid As Guid,
- <Out(), MarshalAs(UnmanagedType.Interface)> ByRef _Outptr_void_ppv As Object) As Int32
- Declare Unicode Function SHGetKnownFolderIDList Lib "Shell32.dll" (
- <MarshalAs(UnmanagedType.LPStruct)> REF_KNOWN_FOLDER_ID_As_Guid As Guid,
- KNOWN_FOLDER_FLAG As UInt32,
- In_opt_hToken As IntPtr,
- <Out()> ByRef ABSOLUTE_ppidl As IntPtr) As Int32
- Declare Unicode Function SHGetNameFromIDList Lib "Shell32.dll" (
- In_PCIDLIST_ABSOLUTE_pidl As IntPtr,
- _In_SIGDN As SIGDN,
- <Out()> ByRef _Outptr_PWSTR_ppszName As String) As Int32
- Declare Unicode Function SHGetKnownFolderPath Lib "Shell32.dll" (
- <MarshalAs(UnmanagedType.LPStruct)> REF_KNOWN_FOLDER_ID_As_Guid As Guid,
- KNOWN_FOLDER_FLAG As UInt32,
- In_opt_hToken As IntPtr,
- <Out> ByRef Outptr_ppszPath As String) As Int32
- Declare Unicode Function GetConsoleCP Lib "Kernel32.dll" () As UInt32
- Declare Sub CoTaskMemFree Lib "Ole32" (_Frees_ptr_opt_LPVOID_pv As IntPtr)
- Declare Sub ILFree Lib "shell32" (_In_opt_PIDLIST_RELATIVE_pidl As IntPtr)
- Declare Unicode Function CoInitializeEx Lib "Ole32" (
- _In_opt_LPVOID_pvReserved As IntPtr,
- _In_DWORD_dwCoInit As UInt32) As Int32
- Declare Sub CoUninitialize Lib "Ole32" ()
- Declare Function OleInitialize Lib "Ole32" (In_LPVOID_pvReserved As IntPtr) As Int32
- Declare Sub OleUninitialize Lib "Ole32" ()
- Declare Unicode Function CoCreateInstance Lib "Ole32" (
- <MarshalAs(UnmanagedType.LPStruct)> _In_REFCLSID_rclsid As Guid,
- _In_opt_LPUNKNOWN_pUnkOuter As IntPtr,
- _In_DWORD_dwClsContext As UInt32,
- <MarshalAs(UnmanagedType.LPStruct)> _In_REFIID_riid As Guid,
- <Out, MarshalAs(UnmanagedType.Interface)> ByRef COM_Outptr As IUnKnown) As Int32
- '_Check_return_ WINOLEAPI CoCreateInstance(
- '_In_ REFCLSID rclsid,
- '_In_opt_ LPUNKNOWN pUnkOuter,
- '_In_ DWORD dwClsContext,
- '_In_ REFIID riid,
- '_COM_Outptr_ _At_(* ppv, _Post_readable_size_(_Inexpressible_(varies))) LPVOID FAR * ppv);
- Public Const IID_IUnknown As String = "00000000-0000-0000-C000-000000000046"
- <ComImport,
- InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
- Guid(IID_IUnknown)>
- Public Interface IUnKnown
- Sub QueryInterface(
- ByRef REFIID_riid As Guid,
- <Out, MarshalAs(UnmanagedType.Interface)> ByRef COM_Outptr_ As Object)
- Function AddRef() As UInt32
- Function Release() As UInt32
- End Interface
- Public Const IID_IShellItem As String = "43826d1e-e718-42ee-bc55-a1e261c37bfe"
- <ComImport,
- Guid(IID_IShellItem),
- InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
- >
- Public Interface IShellItem : Inherits IUnKnown
- Sub BindToHandler()
- ' virtual HRESULT STDMETHODCALLTYPE BindToHandler(
- ' /* [unique][in] */ __RPC__in_opt IBindCtx *pbc,
- ' /* [in] */ __RPC__in REFGUID bhid,
- ' /* [in] */ __RPC__in REFIID riid,
- ' /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;
- Sub GetParent()
- ' virtual HRESULT STDMETHODCALLTYPE GetParent(
- ' /* [out] */ __RPC__deref_out_opt IShellItem **ppsi) = 0;
- Sub GetDisplayName(sigdn As SIGDN,
- <MarshalAs(UnmanagedType.LPWStr)> ByRef ppszName As String)
- ' virtual HRESULT STDMETHODCALLTYPE GetDisplayName(
- ' /* [in] */ SIGDN sigdnName,
- ' /* [annotation][string][out] */
- ' _Outptr_result_nullonfailure_ LPWSTR *ppszName) = 0;
- Sub GetAttributes()
- ' virtual HRESULT STDMETHODCALLTYPE GetAttributes(
- ' /* [in] */ SFGAOF sfgaoMask,
- ' /* [out] */ __RPC__out SFGAOF *psfgaoAttribs) = 0;
- Sub Compare()
- 'virtual HRESULT STDMETHODCALLTYPE Compare(
- ' /* [in] */ __RPC__in_opt IShellItem *psi,
- ' /* [in] */ SICHINTF hint,
- ' /* [out] */ __RPC__out int *piOrder) = 0;
- End Interface
- Public Const IID_IShellItem2 As String = "7e9fb0d3-919f-4307-ab2e-9b1860310c93"
- <ComImport,
- InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
- Guid(IID_IShellItem2)>
- Interface IShellItem2 : Inherits IShellItem
- Sub GetPropertyStore()
- ' /* [in] */ GETPROPERTYSTOREFLAGS flags,
- ' /* [in] */ __RPC__in REFIID riid,
- ' /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;
- Sub GetPropertyStoreWithCreateObject()
- ' /* [in] */ GETPROPERTYSTOREFLAGS flags,
- ' /* [in] */ __RPC__in_opt IUnknown *punkCreateObject,
- ' /* [in] */ __RPC__in REFIID riid,
- ' /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;
- Sub GetPropertyStoreForKeys()
- ' /* [size_is][in] */ __RPC__in_ecount_full(cKeys) const PROPERTYKEY *rgKeys,
- ' /* [in] */ UINT cKeys,
- ' /* [in] */ GETPROPERTYSTOREFLAGS flags,
- ' /* [in] */ __RPC__in REFIID riid,
- ' /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;
- Sub GetPropertyDescriptionList()
- '/* [in] */ __RPC__in REFPROPERTYKEY keyType,
- '/* [in] */ __RPC__in REFIID riid,
- '/* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;
- Sub Update()
- '/* [unique][in] */ __RPC__in_opt IBindCtx *pbc) = 0;
- Sub GetProperty()
- '/* [in] */ __RPC__in REFPROPERTYKEY key,
- '/* [out] */ __RPC__out PROPVARIANT *ppropvar) = 0;
- Sub GetCLSID()
- '/* [in] */ __RPC__in REFPROPERTYKEY key,
- '/* [out] */ __RPC__out CLSID *pclsid) = 0;
- Sub GetFileTime()
- '/* [in] */ __RPC__in REFPROPERTYKEY key,
- '/* [out] */ __RPC__out FILETIME *pft) = 0;
- Sub GetInt32()
- '/* [in] */ __RPC__in REFPROPERTYKEY key,
- '/* [out] */ __RPC__out int *pi) = 0;
- Sub GetString()
- '/* [in] */ __RPC__in REFPROPERTYKEY key,
- '/* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppsz) = 0;
- Sub GetUInt32()
- '/* [in] */ __RPC__in REFPROPERTYKEY key,
- '/* [out] */ __RPC__out ULONG *pui) = 0;
- Sub GetUInt64()
- '/* [in] */ __RPC__in REFPROPERTYKEY key,
- '/* [out] */ __RPC__out ULONGLONG *pull) = 0;
- Sub GetBool()
- '/* [in] */ __RPC__in REFPROPERTYKEY key,
- '/* [out] */ __RPC__out BOOL *pf) = 0;
- End Interface
- Enum SIGDN As Int32
- SIGDN_NORMALDISPLAY = 0
- SIGDN_PARENTRELATIVEPARSING = CType(&H80018001, Int32)
- SIGDN_DESKTOPABSOLUTEPARSING = CType(&H80028000, Int32)
- SIGDN_PARENTRELATIVEEDITING = CType(&H80031001, Int32)
- SIGDN_DESKTOPABSOLUTEEDITING = CType(&H8004C000, Int32)
- SIGDN_FILESYSPATH = CType(&H80058000, Int32)
- SIGDN_URL = CType(&H80068000, Int32)
- SIGDN_PARENTRELATIVEFORADDRESSBAR = CType(&H8007C001, Int32)
- SIGDN_PARENTRELATIVE = CType(&H80080001, Int32)
- SIGDN_PARENTRELATIVEFORUI = CType(&H80094001, Int32)
- End Enum
- Public Const FolderId_Desktop As String = "B4BFCC3A-DB2C-424C-B029-7FE99A87C641"
- Public Const FolderId_RoamingAppData As String = "3EB685DB-65F9-4CF6-A03A-E3EF65729F3D"
- Public Const FolderId_LocalAppData As String = "F1B32785-6FBA-4FCF-9D55-7B8E7F157091"
- Public Const FolderId_LocalAppDataLow As String = "A520A1A4-1780-4FF6-BD18-167343C5AF16"
- Public Const FolderId_NetworkFolder As String = "D20BEEC4-5CA8-4905-AE3B-BF251EA09B53"
- Public Const FolderId_ComputerFolder As String = "0AC0837C-BBF8-452A-850D-79D08E667CA7"
- Public Const FolderId_InternetFolder As String = "4D9F7874-4E0C-4904-967B-40B0D20C3E4B"
- Public Const FolderId_System As String = "1AC14E77-02E7-4E5D-B744-2EB1AE5198B7"
- Public Const FolderId_Documents As String = "FDD39AD0-238F-46AF-ADB4-6C85480369C7"
- Public Const FolderId_Windows As String = "F38BF404-1D43-42F2-9305-67DE0B28FC23"
- Public Const FolderId_Downloads As String = "374DE290-123F-4565-9164-39C4925E467B"
- Public Const CLSID_ShellWindows As String = "9BA05972-F6A8-11CF-A442-00A0C90A8F39"
- Public Const IID_IShellWindows As String = "85CB6900-4D95-11CF-960C-0080C7F4EE85"
- Public Const CLSID_ShellItem As String = "9ac9fbe1-e0a2-4ad6-b4ee-e212013ea917"
- Public Const IID_IExplorerBrowser As String = "dfd3b6b5-c10c-4be9-85f6-a66969f402f6"
- Public ReadOnly Null As IntPtr = IntPtr.Zero
- Public Const S_OK As Int32 = 0
- Public Const S_FALSE As Int32 = 1
- Public Const E_NOINTERFACE As Int32 = &H80004002I
- Enum COINITBASE As UInt32
- COINITBASE_MULTITHREADED = 0 ' // OLE calls objects On any thread.
- End Enum
- Enum COINIT As UInt32
- COINIT_APARTMENTTHREADED = 2 ' // Apartment model
- COINIT_MULTITHREADED = COINITBASE.COINITBASE_MULTITHREADED
- COINIT_DISABLE_OLE1DDE = 4
- COINIT_SPEED_OVER_MEMORY = 8
- End Enum
- Public Const CLSID_KnownFolderManager As String = "4df0c730-df9d-4ae3-9153-aa6b82e9795a"
- Public Const IID_IKnownFolderManager As String = "8BE2D872-86AA-4d47-B776-32CCA40C7018"
- <ComImport,
- InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
- Guid(IID_IKnownFolderManager)>
- Interface IKnownFolderManager : Inherits IUnKnown
- Sub FolderIdFromCsidl()
- ' /* [in] */ int nCsidl,
- ' /* [out] */ __RPC__out KNOWNFOLDERID *pfid) = 0;
- Sub FolderIdToCsidl()
- ' virtual HRESULT STDMETHODCALLTYPE FolderIdToCsidl(
- ' /* [in] */ __RPC__in REFKNOWNFOLDERID rfid,
- ' /* [out] */ __RPC__out int *pnCsidl) = 0;
- Sub GetFolderIds(
- <Out> ByRef pKnownFolderId As IntPtr,
- <InAttribute> <Out> ByRef count As UInt32)
- ' virtual HRESULT STDMETHODCALLTYPE GetFolderIds(
- ' /* [size_is][size_is][out] */ __RPC__deref_out_ecount_full_opt(*pCount) KNOWNFOLDERID **ppKFId,
- ' /* [out][in] */ __RPC__inout UINT *pCount) = 0;
- Sub GetFolder(
- <MarshalAs(UnmanagedType.LPStruct)> REFKNOWNFOLDERID As Guid,
- <Out, MarshalAs(UnmanagedType.Interface)> ByRef pIKnownFolder As Object)
- ' virtual HRESULT STDMETHODCALLTYPE GetFolder(
- ' /* [in] */ __RPC__in REFKNOWNFOLDERID rfid,
- ' /* [out] */ __RPC__deref_out_opt IKnownFolder **ppkf) = 0;
- Sub GetFolderByName()
- ' /* [string][in] */ __RPC__in_string LPCWSTR pszCanonicalName,
- ' /* [out] */ __RPC__deref_out_opt IKnownFolder **ppkf) = 0;
- Sub RegisterFolder()
- ' virtual HRESULT STDMETHODCALLTYPE RegisterFolder(
- ' /* [in] */ __RPC__in REFKNOWNFOLDERID rfid,
- ' /* [in] */ __RPC__in const KNOWNFOLDER_DEFINITION *pKFD) = 0;
- Sub UnregisterFolder()
- ' /* [in] */ __RPC__in REFKNOWNFOLDERID rfid) = 0;
- Sub FindFolderFromPath()
- ' /* [string][in] */ __RPC__in_string LPCWSTR pszPath,
- ' /* [in] */ FFFP_MODE mode,
- ' /* [out] */ __RPC__deref_out_opt IKnownFolder **ppkf) = 0;
- Sub FindFolderFromIDList()
- ' /* [in] */ __RPC__in PCIDLIST_ABSOLUTE pidl,
- ' /* [out] */ __RPC__deref_out_opt IKnownFolder **ppkf) = 0;
- Sub Redirect()
- ' virtual /* [local] */ HRESULT STDMETHODCALLTYPE Redirect(
- ' /* [annotation][in] */
- ' _In_ REFKNOWNFOLDERID rfid,
- ' /* [annotation][unique][in] */
- ' _In_opt_ HWND hwnd,
- ' /* [annotation][in] */
- ' _In_ KF_REDIRECT_FLAGS flags,
- ' /* [annotation][string][unique][in] */
- ' _In_opt_ LPCWSTR pszTargetPath,
- ' /* [annotation][in] */
- ' _In_ UINT cFolders,
- ' /* [annotation][unique][size_is][in] */
- ' _In_reads_opt_(cFolders) const KNOWNFOLDERID *pExclusion,
- ' /* [annotation][string][out] */
- ' _Outptr_opt_result_maybenull_ LPWSTR *ppszError) = 0;
- End Interface
- Public Const IID_IKnownFolder As String = "3AA7AF7E-9B36-420c-A8E3-F77D4674A488"
- <ComImport,
- InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
- Guid(IID_IKnownFolder)>
- Public Interface IKnownFolder : Inherits IUnKnown
- Sub GetId()
- 'virtual HRESULT STDMETHODCALLTYPE GetId(
- ' /* [out] */ __RPC__out KNOWNFOLDERID *pkfid) = 0;
- Sub GetCategory()
- 'virtual HRESULT STDMETHODCALLTYPE GetCategory(
- ' /* [out] */ __RPC__out KF_CATEGORY *pCategory) = 0;
- Sub GetShellItem(
- dwFlags As UInt32,
- <MarshalAs(UnmanagedType.LPStruct)> REFIID_iid As Guid,
- <Out, MarshalAs(UnmanagedType.Interface)> ByRef _Com_OutPtr As Object)
- 'virtual HRESULT STDMETHODCALLTYPE GetShellItem(
- ' /* [in] */ DWORD dwFlags,
- ' /* [in] */ __RPC__in REFIID riid,
- ' /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;
- Sub GetPath()
- 'virtual HRESULT STDMETHODCALLTYPE GetPath(
- ' /* [in] */ DWORD dwFlags,
- ' /* [string][out] */ __RPC__deref_out_opt_string LPWSTR *ppszPath) = 0;
- Sub SetPath()
- 'virtual HRESULT STDMETHODCALLTYPE SetPath(
- ' /* [in] */ DWORD dwFlags,
- ' /* [string][in] */ __RPC__in_string LPCWSTR pszPath) = 0;
- Sub GetIDList()
- 'virtual HRESULT STDMETHODCALLTYPE GetIDList(
- ' /* [in] */ DWORD dwFlags,
- ' /* [out] */ __RPC__deref_out_opt PIDLIST_ABSOLUTE *ppidl) = 0;
- Sub GetFolderType()
- 'virtual HRESULT STDMETHODCALLTYPE GetFolderType(
- ' /* [out] */ __RPC__out FOLDERTYPEID *pftid) = 0;
- Sub GetRedirectionCapabilities()
- 'virtual HRESULT STDMETHODCALLTYPE GetRedirectionCapabilities(
- ' /* [out] */ __RPC__out KF_REDIRECTION_CAPABILITIES *pCapabilities) = 0;
- Sub GetFolderDefinition()
- ' virtual HRESULT STDMETHODCALLTYPE GetFolderDefinition(
- ' /* [out] */ __RPC__out KNOWNFOLDER_DEFINITION *pKFD) = 0;
- End Interface
- End Module
- #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier
- #include <Windows.h>
- #include <strsafe.h>
- #include <math.h>
- #include <ShlObj_core.h>
- extern "C" {
- __declspec(dllexport) void BeginTest(LPCWSTR p, INT32 FunSelector);
- __declspec(dllexport) void Get_TestData(LPWSTR* p, INT32 MaxCount);
- }
- HRESULT hr;
- const size_t Str_Buffer_size = 4 << 20;
- wchar_t Str_Value[Str_Buffer_size];
- wchar_t* pStart;
- size_t RemainedLength;
- auto WriteText = [&](const wchar_t* fmt, ...) {
- va_list args;
- va_start(args, fmt);
- StringCchVPrintfExW(pStart, RemainedLength, &pStart, &RemainedLength, 0,
- fmt, args);
- va_end(args);
- };
- void BeginTest(LPCWSTR p1, INT32 FunSelector) {
- const wchar_t* Comment = L"= <-- Marshalling DLL -->";
- RemainedLength = ARRAYSIZE(Str_Value);
- pStart = Str_Value;
- WriteText(L"%s %s 1\n", p1, Comment);
- if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)) &&
- SUCCEEDED(OleInitialize(NULL))) {
- void KnownFolder_Desktop();
- void KnownFolder_Manager();
- if (FunSelector == 1) KnownFolder_Desktop();
- else if (FunSelector == 2) KnownFolder_Manager();
- OleUninitialize();
- CoUninitialize();
- }
- WriteText(L"%s %s 2\n", p1, Comment);
- }
- void Get_TestData(LPWSTR* p, INT32 nMaxCount) {
- StringCchCopyNW(*p, nMaxCount, Str_Value, pStart - Str_Value + 1);
- }
- void KnownFolder_Desktop() {
- LPWSTR pwszPath = NULL;
- SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &pwszPath);
- WriteText(L"SHGetKnownFolderPath ==> %s\n", pwszPath);
- CoTaskMemFree(pwszPath);
- PIDLIST_ABSOLUTE ppidl;
- SHGetKnownFolderIDList(FOLDERID_Desktop, 0, NULL, &ppidl);
- SHGetNameFromIDList(ppidl, SIGDN::SIGDN_URL, &pwszPath);
- WriteText(L"URL_Path ======> %s\n", pwszPath);
- ILFree(ppidl); CoTaskMemFree(pwszPath);
- IShellItem* pIShellItem;
- IShellItem2* pIShellItem2;
- hr = SHGetKnownFolderItem(FOLDERID_Desktop, KF_FLAG_DEFAULT, NULL,
- IID_IShellItem, IID_PPV_ARGS_Helper(&pIShellItem));
- if (SUCCEEDED(hr)) {
- pIShellItem->GetDisplayName(SIGDN_NORMALDISPLAY, &pwszPath);
- WriteText(L"name : %s\n", pwszPath);
- CoTaskMemFree(pwszPath);
- pIShellItem->GetDisplayName(SIGDN_FILESYSPATH, &pwszPath);
- WriteText(L"name : %s\n", pwszPath);
- CoTaskMemFree(pwszPath);
- pIShellItem->QueryInterface(IID_IShellItem2, IID_PPV_ARGS_Helper(&pIShellItem2));
- pIShellItem2->GetDisplayName(SIGDN_NORMALDISPLAY, &pwszPath);
- WriteText(L"name2 : %s\n", pwszPath);
- CoTaskMemFree(pwszPath);
- pIShellItem2->GetDisplayName(SIGDN_FILESYSPATH, &pwszPath);
- WriteText(L"name2 : %s\n", pwszPath);
- CoTaskMemFree(pwszPath);
- WriteText(L"pIShellItem->Release = (%i)\n", pIShellItem->Release());
- WriteText(L"pIShellItem2->Release = (%i)\n", pIShellItem2->Release());
- }
- }
- void KnownFolder_Manager() {
- IKnownFolderManager* pManager;
- hr = CoCreateInstance(CLSID_KnownFolderManager, NULL,
- CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pManager));
- if (SUCCEEDED(hr)) {
- KNOWNFOLDERID* pKnownFolderIDs = NULL;
- UINT cCount = 0;
- hr = pManager->GetFolderIds(&pKnownFolderIDs, &cCount);
- if (SUCCEEDED(hr) && pKnownFolderIDs) {
- for (UINT ii = 0; ii < cCount; ii++) {
- IKnownFolder* pKnownFolder;
- hr = pManager->GetFolder(*(pKnownFolderIDs + ii), &pKnownFolder);
- if (SUCCEEDED(hr)) {
- WriteText(L"%3i:", ii + 1);
- IShellItem* psi;
- hr = pKnownFolder->GetShellItem(0, IID_PPV_ARGS(&psi));
- if (SUCCEEDED(hr)) {
- LPWSTR pwstr1, pwstr2;
- psi->GetDisplayName(SIGDN_NORMALDISPLAY, &pwstr1);
- WriteText(L"%s ===> ", pwstr1);
- CoTaskMemFree(pwstr1);
- psi->GetDisplayName(SIGDN_FILESYSPATH, &pwstr2);
- WriteText(L"%s", pwstr2);
- CoTaskMemFree(pwstr2);
- psi->Release();
- }
- pKnownFolder->Release();
- WriteText(L"\n");
- }
- }
- CoTaskMemFree(pKnownFolderIDs);
- }
- pManager->Release();
- }
- }





















留言
張貼留言