EG this https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexa?redirectedfrom=MSDN
On Tue, Nov 26, 2019, 12:35 mike smith <[email protected]> wrote: > Or one 'old world' technique some win APIs use > Pass in a null and the call tells you what size buffer you need, create it > and pass it in on a second call. > > > Mike > > On Tue, Nov 26, 2019, 11:53 Tony McGee <[email protected]> wrote: > >> You could return a BSTR and let the interop marshaling do clean up for >> you: >> >> >> https://www.codeproject.com/Articles/1189085/Passing-strings-between-managed-and-unmanaged-code >> >> >> >> On Tue, 26 Nov. 2019, 11:09 Greg Keogh, <[email protected]> wrote: >> >>> >>> msg is a stack variable, you can't return it iirc. Either create a var >>>> on the heap, or pass msg in as a parameter. >>>> >>> >>> D'oh! You're right. I changed the code to the following and it's >>> working. Notice use of CoTaskMemAlloc, which I think is the least worst >>> choice of heap allocation functions according to the MSDN docs. >>> >>> Notice that I've completely forgotten what the lengths are supposed to >>> be for string lengths, is it x2 for wchar? is it correct to allocate 200 >>> bytes for 100 wchars? The compiler is giving me an overrun warning. You're >>> supposed to use sizeof or something like that, but my brain has gone mushy >>> on all those rules now (which is part of the reason I never want to code >>> this assembler crap again!). >>> >>> Even worse … what about the memory leak in CoTaskMemAlloc? I make the >>> buffer, copy in the string and return it, but it's now leaked. Should I use >>> a global static buffer that can be released later? When? >>> >>> *GK* >>> >>> [image: image.png] >>> >>> >>>
