I don't know if I've ever gone that method. We do something more like this:
ATE::DocumentTextResourcesRef textResourcesRef = 0
auto error = sDocument->GetDocumentTextResources(&textResourcesRef);
// check error
IDocumentTextResources textResources(textResourcesRef);
const auto charStyle = textResources.GetCharStyle(localStyleName.au_str());
assert(!charStyle.IsNull());
const ICharFeatures charFeatures = charStyle.GetFeatures();
const AIArtHandle handle = GetHandle();
ATE::TextRangeRef textRangeRef = 0;
error = sAITextFrame->GetATETextRange(handle, &textRangeRef);
// check error
ATE::ITextRange textRange(textRangeRef);
textRange.ReplaceOrAddLocalCharFeatures(charFeatures);