How can I make this work?
Jack
jckj33 at gmail.com
Tue Mar 16 06:24:31 UTC 2021
On Sunday, 28 February 2021 at 13:15:47 UTC, Adam D. Ruppe wrote:
> On Sunday, 28 February 2021 at 07:05:27 UTC, Jack wrote:
>> I'm using a windows callback function where the user-defined
>> value is passed thought a LPARAM argument type. I'd like to
>> pass my D array then access it from that callback function.
>> How is the casting from LPARAM to my type array done in that
>> case?
>
> The best way to do this is to put the array inside a struct and
> pass the address of the struct instead. This way both length
> and pointer are passed, and you have the option to add more
> things if you ended up needing it later, and there's fewer
> weird things to worry about.
>
> int[] arr = [1, 2, 3];
>
> struct MyMessage {
> int[] arr;
> }
>
> // this far is easy enough
> MyMessage* messagePointer = new MyMessage(arr);
>
> // but we do need to tell the GC we intend to pass this to the
> outside world
> // failure to do this MIGHT lead to random crashes as the GC
> can't see it (it can't look inside the Windows message queue),
> assumes it is unused, and frees it out from under you.
> import core.memory;
> GC.addRoot(messagePointer);
>
> // when the GC has a root, it will consider that pointer live
> until further notice and not collect it nor its member
> variables.
>
> // so it is now cool to do this
> PostMessage(hwnd, MSG_WHATEVER, 0, cast(LPARAM) messagePointer);
>
>
> /* then on the other side */
>
> switch(iMsg) {
> case MSG_WHATEVER:
> MyMessage* messagePointer = cast(MyMessage*) lParam;
>
> // need to tell the GC the pointer can be automatically
> managed normally again. failure to do this will lead to a
> memory leak
> import core.memory;
> GC.removeRoot(messagePointer);
>
> // now can use it
> foreach(item; messagePointer.arr) {
> // yada yada yada
> }
> }
>
>
>
> And it is the simplest thing, no missing length, no weird
> property casting. The GC handled with two simple add/remove
> calls.
This is what I ended up using. using a single pointer such as
MyMessage makes things much simpler. Thanks for the rememinder of
GC.removeRoot()
Everyone else in this theread, thank you guys. Always helpful
More information about the Digitalmars-d-learn
mailing list