Comments (10)
We use structs for each unique handle type to give added type safety, similar to that enjoyed by C developers. HWND as a parameter type immediately gives an idea on its content and where you might come by a value to fit, whereas IntPtr tells nearly nothing.
Our structs that serve as IntPtr substitutes are implicitly convertable to IntPtr, so you can use them without casts anywhere that an IntPtr is expected.
You can also explicitly cast any IntPtr to one of these structs, making it nearly as convenient to go the other way as well.
from cswin32.
Yes, you can cast them. If Process APIs use IntPtr instead of handle struct types, can you please file a bug at https://github.com/microsoft/win32metadata/issues giving specific APIs as examples?
from cswin32.
I'm sorry for misdirecting you.
.NET has a convention that we use implicit conversion operators for lossy or base type conversions, and explicit conversion operators for derived types. In this case every HWND is an IntPtr, but not every IntPtr is an HWND. This is why we have the HWND conversion operators set up like this:
public static implicit operator nint(HWND value) => value.Value;
public static explicit operator HWND(nint value) => new HWND(value);
Note that nint
is equivalent to IntPtr
for our purposes here (although it actually should be an IntPtr
... that's a regression #312).
from cswin32.
@michael-hawker Did you mean the regression Andrew mentioned as already being tracked at #312?
from cswin32.
I understand, thank you.
from cswin32.
@AArnott is this documented somewhere? You get an IntPtr
from the Process APIs, so it's not clear compared to the old manual way of doing PInvoke how to pass those into the generated methods (e.g. SetForegroundWindow
).
It sounds like you can just do:
PInvoke.SetForegroundWindow((HWD)process.MainWindowHandle);
from cswin32.
If Process APIs use IntPtr instead of handle struct types, can you please file a bug at https://github.com/microsoft/win32metadata/issues giving specific APIs as examples?
I believe his example was showing the BCL Process API https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.mainwindowhandle.
from cswin32.
Thanks @AArnott, should we re-open this issue for tracking the regression then?
from cswin32.
@michael-hawker What is the regression? Per my last comment, the behavior of requiring an explicit cast to "upgrade" an IntPtr
to an HWND
is by design with strong precedent in the .NET community. And it's also by design that the metadata and generated code use HWND
as a more concrete type than IntPtr
.
from cswin32.
@michael-hawker Did you mean the regression Andrew mentioned as already being tracked at #312?
Yup, sorry. Didn't connect the dots that that issue was tracking the regression itself.
from cswin32.
Related Issues (20)
- SetupDiGetDeviceInterfaceDetail() throws MashalDirectiveException "Pointers cannot reference marshaled structures" HOT 7
- COM Out arguments in DXGI/D3D11 are suddenly unmanaged HOT 4
- Publish WPF Desktop App not possible HOT 15
- IShellItemImageFactory.GetImage should return HRESULT HOT 1
- Add support for MAKEPOINTS, GET_X_LPARAM, GET_Y_LPARAM macros HOT 1
- APPBARDATA should compile on AnyCPU HOT 2
- CsWin32 should avoid Unsafe.SkipInit when it doesn't exist in the compilation HOT 1
- WlanOpenHandle doesn't support SafeHandle HOT 1
- The API "Gdi32" is ambiguous HOT 4
- Add `GET_WHEEL_DELTA_WPARAM` macro
- `TASKDIALOGCONFIG.pfCallback` should use associated enum for `msg` parameter
- Broken `VariableLengthInlineArray<T>` after upgrade from 0.3.49-beta to 0.3.106 HOT 8
- NetFramework - Unsafe.SkipInit(out T value) unavailable HOT 3
- Inconsistent const in parameters of RmRegisterResources HOT 9
- LocalExternFunctions should use `DefaultDllImportSearchPaths`
- Code Quality: Use `WinMdRoot` instead of `winmdroot` to supress CS8981 (type name is ASCII lowercase only) HOT 5
- `PCWSTR` is not marked with `[GeneratedCode]`
- Many Win32 structs (HDC, HMONITOR, etc.) lack the IntPtr conversion operator.
- "Pointers cannot reference marshaled structures. Use ByRef instead" caused by VariableLengthInlineArray
- Latest WDK metadata fails to create DEVPKEY field
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cswin32.