Try using reinterpret_cast. So:
unsigned char * dirNameA = reinterpret_cast<unsigned char *>(dirName.c_str());
This may not work because c_str returns const wchar_t *, so you can also try:
unsigned char * dirNameA = reinterpret_cast<unsigned char *>( const_cast<wchar_t *>(dirName.c_str()) );
This works because hmac_sha256_init should accept binary blob as its input, so the unicode string contained in dirName is a valid hash input.
But there is an error in your code - the length returned by dirName.length () is the number of characters, not the number of bytes. This means passing too many bytes to hmac_sha256_init, since you are passing the unicode string as a binary blob, so you need to multiply (dirName.length ()) by 2.
source share