convertir std::string const BYTE* pour RegSetValueEx()
J'ai une fonction qui récupère un std::string. Que les appels de fonction
le 5ème paramètre est la valeur de la valeur de registre et s'attend à une variable de type const BYTE*.
Donc, je dois convertir le std::string const BYTE* et aussi donner la longueur de la matrice résultante comme le 6e paramètre.
J'ai trouvé une façon de le faire, mais il se sent moche et je ne comprends pas vraiment ce qui se passe. Ici est une version allégée de cette fonction:
void function(const std::string& newValue)
{
HKEY keyHandle;
if(RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("some key"),0,KEY_ALL_ACCESS,&keyHandle) == ERROR_SUCCESS)
{
std::wstring wNewValue;
wNewValue.assign(newValue.begin(),newValue.end());
if (RegSetValueEx(keyHandle, TEXT("some value"), NULL, REG_SZ, (const BYTE*)(LPCTSTR)(wNewValue.c_str()), wNewValue.size()*2)==ERROR_SUCCESS)
{
//do something
}
RegCloseKey(keyHandle);
}
}
Comme vous pouvez le voir, j'ai d'abord faire une grande chaîne de caractères (UNICODE est défini), puis d'utiliser un double jeté, et pour la longueur j'ai à faire *2, sinon il sera seulement mis la moitié de la chaîne d'entrée.
Est cette forme de fonte de la normale, la meilleure façon de le faire?
Pourquoi l' * 2, ce serait une meilleure façon?
OriginalL'auteur Emile Vrijdags | 2009-05-11
Vous devez vous connecter pour publier un commentaire.
J'ai enlevé la partie où vous convertir votre chaîne à une wstring, au lieu de cela, vous allez utiliser la version ANSI de RegSetValueEx explicitement.
citation de RegSetValueEx remarques dans MSDN:
Également noter que le paramètre cbData devrait inclure la taille de la terminaison null aswell.
copier coller le dos de tir! supprimé, merci.
Donc, tant que je n'utilise pas de caractères non-ANSI-je suis juste très bien avec les versions ANSI de winapi fonctions? (ce qui paraît logique, mais je n'avais pas pensé à ça)
le Win32API des fonctions qui s'attendent texte sont divisés à la norme ANSI (se termine par Un dans le nom de la fonction) et Unicode (qui se termine avec un "W"), la plupart d'entre eux de toute façon. vous pouvez utiliser std::string avec l'Un et std::wstring avec le W de.
votre exemple n'aurait pas fonctionné si votre entrée a les caractères en dehors de (probablement) ASCII de toute façon puisque vous faisiez un bit à bit d'extension avec
wNewValue.assign(newValue.begin(), newValue.end())
. Rappelez-vous que wNewValue est une séquence de caractères UNICODE si le bit à bit d'affectation ne fonctionne que si tous les caractères de points dans newValue sont valables points de code UNICODE. En d'autres termes, newValue ne contient que de l'ISO-8859-1 caractères.OriginalL'auteur Idan K
L' * 2 est parce que
RegSetValueEx
veut connaître le nombre d'octets à écrire und chaque char (wchar_t) dans un wstring est de deux octets. De sorte que le montant de tableau d'octets a deux fois la taille!Donc, il serait mieux d'écrire wNewValue.size()*sizeof(wchar_t) pour le rendre clair ce qui se passe.
OriginalL'auteur Dario
Ne devrait-elle pas être
wNewValue.size()*2+2
? +2 pour le caractère null?MSDN dit: La taille de l'information, pointé par le lpData paramètre, en octets. Si les données sont de type REG_SZ, REG_EXPAND_SZ, ou REG_MULTI_SZ, cbData doit inclure la taille du caractère de fin null ou de caractères.
OriginalL'auteur Oded S
Vous pouvez également copier la chaîne unicode dans un tableau d'octets:
Si vous avez eu le malheur d'être de l'écriture de code pour WINCE 5.0 appareil et il manquait une partie de l'regedit API.
OriginalL'auteur david