Comment convertir char * en LPCWSTR?
Je sais que cela a déjà été discuté à plusieurs questions, mais aucune de ces solutions ont travaillé pour moi.
Je commence avec un char*
parce que c'est une DLL qui va être appelé à partir de VBA, et char*
est nécessaire pour VBA pour passer d'une chaîne à la DLL.
J'ai besoin de revenir un LPCWSTR
parce que c'est le paramètre d'entrée pour la fonction de l'API, je suis en train de l'appeler, et je ne peux pas activer la coulée par le passage de l'Unicode pour les caractères multi-octets définir dans la fenêtre Propriétés, parce que 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;
Ce compilé ok, mais quand j'en ai donné un exemple de chaîne de "xyz.xlsx", mbsrtowcs_s()
ensemble buf
à une chaîne vide: L""
Alors, comment puis-je faire cette conversion?
source d'informationauteur sigil
Vous devez vous connecter pour publier un commentaire.
Depuis
cs
est unconst char*
cs[1]
est unconst char
. C++ ne sera pas converti en un pointeur pour vous, parce que dans la plupart des cas, qui n'a pas de sens.Vous pourriez dire
&cs[1]
oucs+1
si l'intention est de passer le premier char. (Qu'est ce que vous faites lorsque vous passez un pointeur vers le 1er élément; en C++, les indices commencent à 0.) Si l'intention est de transmettre à l'ensemble de la chaîne, puis il suffit de passercs
.Suivantes Hans Passant de conseils sur des pointeurs vers des variables locales, j'ai travaillé sur cette approche, qui semble bien fonctionner:
Je suis conscient que l'utilisation de
new
nécessite la gestion de la mémoire, qui je joue dans la fonction qui appelle celui-ci.