La première chose à noter est que le tampon de chaîne interne de PUNICODE_STRING pourrait ne pas se terminer par. Donc, il serait préférable de passer par une chaîne large standard terminée par un zéro, qui peut ensuite être passée directement à SysAllocString.
Essayez ceci:
BSTR PUNICODEToBSTR(PUNICODE_STRING pStr)
{
// create a null-terminated version of the input string
wchar_t* nullTerminatedString = new wchar_t[pStr->Length + 1];
memset(nullTerminatedString, 0, sizeof(wchar_t) * (pStr->Length + 1)];
wcsncpy(nullTerminatedString, pStr->Buffer, pStr->Length);
// create a BSTR
BSTR bstrString = ::SysAllocString(nullTerminatedString);
// tidy-up and return the BSTR
delete [] nullTerminatedString;
return bstrString;
}
Il y a aussi 'SysAllocStringLen' pour éviter la copie zéro terminal – Rup
Merci pour votre réponse. Mais je ne l'ai pas comme une variable de pointeur. Je l'ai comme PUNICODE_STRING _variable. Comment le convertir maintenant? Pardonnez-moi si c'est une question stupide. Je suis entièrement nouveau à VC++ et Win32 API. – NLV
Remplacez la première ligne par '(PUNICODE_STRING pStr)' - pas d'étoile - et remplacez tout 'pStr.' par' pStr-> '- cela devrait fonctionner. Peut-être aussi changer 'BSTR * bstrString' en juste' BSTR bstrString'. Alternativement, le doubleur 'BSTR bstrString = :: SysAllocStringLen (pStr-> Buffer, pStr-> Length)' devrait fonctionner aussi. – Rup