Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
<PackageVersion Include="Vanara.Windows.Extensions" Version="4.0.1" />
<PackageVersion Include="Vanara.Windows.Shell" Version="4.0.1" />
<PackageVersion Include="Microsoft.Windows.CsWinRT" Version="2.2.0" />
<PackageVersion Include="Microsoft.Windows.CsWin32" Version="0.3.264" />
<PackageVersion Include="Microsoft.Windows.CsWin32" Version="0.3.298" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="5.6.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="5.3.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="5.6.0" />
Expand Down
39 changes: 39 additions & 0 deletions src/Files.App.CsWin32/ComHelpers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Copyright (c) Files Community
// SPDX-License-Identifier: MPL-2.0

using System;
using Windows.Win32.Foundation;
using Windows.Win32.System.Com;
using Windows.Win32.UI.Shell;

namespace Windows.Win32;

public static class ComHelpers
{
public static HRESULT TryCast<TInterface>(object nativeObject, out TInterface? instance)
where TInterface : class
{
try
{
instance = (TInterface)nativeObject; // QueryInterface is done by IDynamicInterfaceCastable
return HRESULT.S_OK;
}
catch (InvalidCastException)
{
instance = null;
return HRESULT.E_NOINTERFACE;
}
}

public static HRESULT CoCreateInstance<TInterface>(Guid classId, CLSCTX classContext, out TInterface? instance)
where TInterface : class
{
return PInvoke.CoCreateInstance(classId, null!, classContext, out instance);
}

public static HRESULT BindToHandler<TInterface>(this IShellItem shellItem, Guid bindHandlerId, out TInterface? result)
where TInterface : class
{
return shellItem.BindToHandler(null!, bindHandlerId, out result);
}
}
96 changes: 0 additions & 96 deletions src/Files.App.CsWin32/ComPtr`1.cs

This file was deleted.

24 changes: 10 additions & 14 deletions src/Files.App.CsWin32/Extras.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,15 @@
// Copyright (c) Files Community
// Copyright (c) Files Community
// Licensed under the MIT License.

using System.Runtime.InteropServices;
using System.Runtime.InteropServices.Marshalling;
using Windows.Win32.Foundation;
using Windows.Win32.Graphics.DirectComposition;
using Windows.Win32.Graphics.Gdi;
using Windows.Win32.UI.WindowsAndMessaging;

namespace Windows.Win32
{
namespace Graphics.Gdi
{
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
public unsafe delegate BOOL MONITORENUMPROC([In] HMONITOR param0, [In] HDC param1, [In][Out] RECT* param2, [In] LPARAM param3);
}

namespace UI.WindowsAndMessaging
{
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
public delegate LRESULT WNDPROC(HWND hWnd, uint msg, WPARAM wParam, LPARAM lParam);
}

public static partial class PInvoke
{
[LibraryImport("User32", EntryPoint = "SetWindowLongW")]
Expand All @@ -46,11 +36,17 @@ public static unsafe nint SetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nInd

namespace Extras
{
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
public unsafe delegate BOOL ManagedMONITORENUMPROC([In] HMONITOR param0, [In] HDC param1, [In][Out] RECT* param2, [In] LPARAM param3);

[UnmanagedFunctionPointer(CallingConvention.Winapi)]
public delegate LRESULT ManagedWNDPROC(HWND hWnd, uint msg, WPARAM wParam, LPARAM lParam);

[GeneratedComInterface, Guid("EACDD04C-117E-4E17-88F4-D1B12B0E3D89"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public partial interface IDCompositionTarget
{
[PreserveSig]
int SetRoot(nint visual);
int SetRoot(IDCompositionVisual visual);
}
}
}
1 change: 1 addition & 0 deletions src/Files.App.CsWin32/Files.App.CsWin32.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
<IsAotCompatible>true</IsAotCompatible>
<DisableRuntimeMarshalling>true</DisableRuntimeMarshalling>
<CsWin32RunAsBuildTask>true</CsWin32RunAsBuildTask>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

Expand Down
122 changes: 122 additions & 0 deletions src/Files.App.CsWin32/HStringStringMarshaller.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
// Copyright (c) Files Community
// SPDX-License-Identifier: MPL-2.0

using System.Runtime.InteropServices;
using System.Runtime.InteropServices.Marshalling;
using Windows.Win32.Foundation;
using Windows.Win32.System.WinRT;

namespace Windows.Win32;

[CustomMarshaller(typeof(string), MarshalMode.ManagedToUnmanagedIn, typeof(HStringStringMarshaller.ManagedToUnmanagedIn))]
[CustomMarshaller(typeof(string), MarshalMode.ManagedToUnmanagedOut, typeof(HStringStringMarshaller.ManagedToUnmanagedOut))]
[CustomMarshaller(typeof(string), MarshalMode.UnmanagedToManagedIn, typeof(HStringStringMarshaller.UnmanagedToManagedIn))]
[CustomMarshaller(typeof(string), MarshalMode.UnmanagedToManagedOut, typeof(HStringStringMarshaller.UnmanagedToManagedOut))]
internal static unsafe class HStringStringMarshaller
{
public ref struct ManagedToUnmanagedIn
{
private nint _hstring;

public void FromManaged(string? managed)
{
_hstring = CreateHString(managed);
}

public nint ToUnmanaged()
=> _hstring;

public void Free()
{
DeleteHString(_hstring);
}
}

public ref struct UnmanagedToManagedOut
{
private nint _hstring;

public void FromManaged(string? managed)
{
_hstring = CreateHString(managed);
}

public nint ToUnmanaged()
=> _hstring;

public void Free()
{
}
}

public ref struct UnmanagedToManagedIn
{
private nint _hstring;

public void FromUnmanaged(nint unmanaged)
{
_hstring = unmanaged;
}

public string? ToManaged()
{
return ToManagedString(_hstring);
}

public void Free()
{
}
}

public ref struct ManagedToUnmanagedOut
{
private nint _hstring;

public void FromUnmanaged(nint unmanaged)
{
_hstring = unmanaged;
}

public string? ToManaged()
{
return ToManagedString(_hstring);
}

public void Free()
{
DeleteHString(_hstring);
}
}

private static nint CreateHString(string? managed)
{
if (managed is null)
return 0;

HSTRING hstring;
fixed (char* sourceString = managed)
{
HRESULT hr = PInvoke.WindowsCreateString(new(sourceString), checked((uint)managed.Length), &hstring);
if (hr.Failed)
Marshal.ThrowExceptionForHR(hr.Value);
}

return hstring;
}

private static string? ToManagedString(nint hstring)
{
if (hstring == 0)
return null;

uint length;
PCWSTR buffer = PInvoke.WindowsGetStringRawBuffer(new HSTRING(hstring), &length);
return new string((char*)buffer.Value, 0, checked((int)length));
}

private static void DeleteHString(nint hstring)
{
if (hstring != 0)
PInvoke.WindowsDeleteString(new HSTRING(hstring));
}
}
64 changes: 37 additions & 27 deletions src/Files.App.CsWin32/IDetectionAndSharing.cs
Original file line number Diff line number Diff line change
@@ -1,35 +1,45 @@
// Copyright (c) Files Community
// SPDX-License-Identifier: MPL-2.0

using Files.Shared.Attributes;
using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.Marshalling;
using Windows.Win32.Foundation;

namespace Windows.Win32.UI.Shell
namespace Windows.Win32.UI.Shell;

[GeneratedComInterface, Guid("1FDA955C-61FF-11DA-978C-0008744FAAB7"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public partial interface IDetectionAndSharing
{
[PreserveSig]
HRESULT GetStatus(DTSH_TYPE type, out DTSH_STATE state, out DTSH_ACTION action);

[PreserveSig]
int TurnOn(nint hwnd, DTSH_TYPE type, int value);

[PreserveSig]
int GetCurrentFwProfile(out /*NetFwProfileType2*/ int profile);

[PreserveSig]
int GetStatusForProfile(/*NetFwProfileType2*/ int profile, DTSH_TYPE type, out DTSH_STATE state, out DTSH_ACTION action);

[PreserveSig]
int TurnOnForProfile(nint hwnd, /*NetFwProfileType2*/ int profile, DTSH_TYPE type, int value);
}

public enum DTSH_TYPE
{
DTSH_NETWORK_DISCOVERY = 0,
DTSH_FILE_SHARING = 1,
}

public enum DTSH_STATE
{
DTSH_OFF = 0,
DTSH_ON = 1,
}

public enum DTSH_ACTION
{
public unsafe partial struct IDetectionAndSharing : IComIID
{
[GeneratedVTableFunction(Index = 3)]
public partial HRESULT GetStatus(DTSH_TYPE type, DTSH_STATE* state, DTSH_ACTION* action);

[GuidRVAGen.Guid("1FDA955C-61FF-11DA-978C-0008744FAAB7")]
public static partial ref readonly Guid Guid { get; }
}

public enum DTSH_TYPE
{
DTSH_NETWORK_DISCOVERY = 0,
DTSH_FILE_SHARING = 1,
}

public enum DTSH_STATE
{
DTSH_OFF = 0,
DTSH_ON = 1,
}

public enum DTSH_ACTION
{
DTSH_NONE = 0,
}
DTSH_NONE = 0,
}
Loading
Loading