web-dev-qa-db-fra.com

Comment convertir char * en LPCWSTR?

Je sais que cela a déjà été discuté dans plusieurs questions sur les SO, mais aucune de ces solutions n'a fonctionné pour moi.

Je commence par un char* Car il s'agit d'un DLL qui sera appelé depuis VBA, et char* Est nécessaire pour que VBA passe une chaîne à la DLL .

Je dois renvoyer un LPCWSTR parce que c'est le paramètre d'entrée pour la fonction API que j'essaie d'appeler, et je ne peux pas activer la conversion en passant d'Unicode au jeu de caractères multi-octets dans la fenêtre Propriétés, car l'API a ce code:

#if !defined(UNICODE) && !defined(NOUNICODE)
#error UNICODE is not defined. UNICODE must be defined for correct API arguments.
#endif

J'ai essayé ceci:

LPCWSTR convertCharArrayToLPCWSTR(char* charArray)
    {
        const char* cs=charArray;
        wchar_t filename[4096] = {0};
        MultiByteToWideChar(0, 0, cs[1], strlen(cs[1]), filename, strlen(cs[1]));
    }

qui a donné ces erreurs:

error C2664: 'strlen' : cannot convert parameter 1 from 'const char' to 'const char *'
error C2664: 'MultiByteToWideChar' : cannot convert parameter 3 from 'const char' to 'LPCCH'

J'ai essayé ceci (même en-tête de fonction), librement adapté de ce post :

size_t retVal;
const char * cs = charArray;    
size_t length=strlen(cs);
wchar_t * buf = new wchar_t[length]();  // value-initialize to 0 (see below)
size_t wn = mbsrtowcs_s(&retVal,buf,20, &cs, length + 1, NULL);
return buf;

Cela a compilé ok, mais quand je lui ai passé un exemple de chaîne de "xyz.xlsx", mbsrtowcs_s() définissez buf sur une chaîne vide: L""

Alors, comment puis-je faire cette conversion?

10
sigil

Puisque cs est un const char*, cs[1] est un const char. C++ ne le convertira pas en un pointeur pour vous, car dans la plupart des cas cela n'a pas de sens.

Vous pourriez plutôt dire &cs[1] ou cs+1 si l'intention est de sauter le premier caractère. (C'est ce que vous faites lorsque vous passez un pointeur sur le 1er élément; en C++, les index commencent à 0.) Si l'intention est de passer la chaîne entière, passez simplement cs.

5
cHao

En suivant les conseils de Hans Passant concernant les pointeurs vers les variables locales, j'ai élaboré cette approche, qui semble bien fonctionner:

wchar_t *convertCharArrayToLPCWSTR(const char* charArray)
{
    wchar_t* wString=new wchar_t[4096];
    MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096);
    return wString;
}

Je suis conscient que l'utilisation de new nécessite une gestion de la mémoire, que j'exécute dans la fonction qui appelle celle-ci.

16
sigil