Type mismatch with Regex match in C++ Windows API

Expected result: print the regex match text in a Window

Tools: Visual Studio 2019

Language: C++, Windows API

Error message: Usually I get weird characters (as with the example below), which I understand is probably a Unicode conversion problem. Sometimes I also get various messages, depending on what method I use to corrupt the language. usually though it is a type mismatch problem as far as I can tell.

Debugger: in the debugger, I see that the variables have human readable values (that the IDE understood) but they just don't make it to the window looking like that.

Things I have tried: googled and read for hours. various type conversions. Also variations on MultiByteToWideChar, different s/m/ws match types, etc.

I have tried about 6 variations. I can definitely post more of those if you want! This version produces weird characters in the window:

const char mystr[] = "SoftwareTestingHelp";
cmatch cm;      // match results for string literals

regex str_expr("(soft)(.*)");
regex_match(mystr, cm, str_expr, regex_constants::match_default);
sendToReportWindow(L"%s\n", cm[1]);

This version gives a type mismatch error for cm to LPCCH and will not compile:

TCHAR buffer[500] = { 0 };
const char mystr[] = "SoftwareTestingHelp";
cmatch cm;      // match results for string literals
    
regex str_expr("(soft)(.*)");
regex_match(mystr, cm, str_expr, regex_constants::match_default);
MultiByteToWideChar(CP_ACP, MB_COMPOSITE, cm[1], -1, buffer, 500);
sendToReportWindow(L"%s\n", buffer);

The function I use to print to the GUI:

void sendToReportWindow(const TCHAR format[], ...)                        // overloaded function. this version accepts printf style
{
    va_list(arglist);
    va_start(arglist, format);
    wchar_t text_buffer[256] = { 0 };                                     // temporary buffer. change to dynamically sized based on size of inputs? memory is cheap.        
    vswprintf(text_buffer, 256, format, arglist);                         // convert using printf. vsw version can handle wide, va_lists from parent function arguments

    SendMessage(Report, EM_SETSEL, -1, -1);
    SendMessage(Report, EM_REPLACESEL, 0, (LPARAM)text_buffer);
}

I could add more error reporting but the IDE and the program output are telling me it is a Unicode conversion problem.

Thank you for your time and consideration.