2010-06-28 6 views
0

J'appelle une fonction qui se trouve dans une DLL gérée ComVisible à partir d'un code VC++. Dans la DLL dll, le type de paramètre de la fonction est string.Comment convertir un PUNICODE_STRING en bstr?

Dans le code VC++ j'ai la variable comme PUNICODE_STRING. Comment puis-je le transmettre à la fonction? Comment puis-je le convertir en BSTR?

Merci.

VSN

Répondre

1

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; 
} 
+2

Il y a aussi 'SysAllocStringLen' pour éviter la copie zéro terminal – Rup

+0

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

+1

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

Questions connexes