A BSTR is different from a null-terminated Unicode string (wchar_t *) in that a char count precedes the beginning of the string. When you pass L"...." to a COM method expecting a BSTR, you don't know what bytes will be preceding the literal string in memory so it will either crash the program or the length of the string will be wrong.
The correct code is:
long lSuccess;
CComBSTR bstr (L"UnlockCode");
spChilkatMHT->UnlockComponent (bstr, &lSuccess);