将std :: string转换为const BYTE *(对于RegSetValueEx()

将std :: string转换为const BYTE *(对于RegSetValueEx(),第1张

概述将std :: string转换为const BYTE *(对于RegSetValueEx()

我有一个函数,得到一个std ::string。 该函数调用

函数RegSetValueEx

第五个参数是registry值的值,并且需要const BYTE *types的variables。 所以我必须将std :: string转换为const BYTE *,并将结果数组的长度作为第6个参数。

我已经find了一个方法来做到这一点,但它感觉很难看,我真的不明白是怎么回事。 这是一个减肥版本的function:

在内核空间中,如何获得与ext4格式磁盘上的文件对应的物理地址

Xamarin Studio,GTK 2.0 C#应用程序,运行时错误,无法加载libglib-2.0-0.dll

如何将PC(ARMv5)地址映射到源代码?

释放从char *创build的_bstr_t

如何将数据从C导出到MATLAB(在不同的机器上)

voID function(const std::string& newValue) { HKEY keyHandle; if(RegOpenKeyEx(HKEY_CLASSES_ROOT,TEXT("some key"),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); } }

正如你所看到的,我首先做一个宽string(UNICODE被定义),然后使用双重强制转换,并且长度必须做* 2,否则它只会设置inputstring的一半。

这种forms是否正常/最好的方式来做到这一点?

为什么* 2,有什么更好的办法?

linux UDP数据包丢失的原因

在linux上篡改C ++名称时,什么是符号?

windows上的wxWidgets:如何从应用程序资源编号创builDWxCursor?

C ++中带有_Tmacros的string文字

C# – 方法必须有返回types

voID function(const std::string& newValue) { HKEY keyHandle; if(RegOpenKeyEx(HKEY_CLASSES_ROOT,&keyHandle) == ERROR_SUCCESS) { if (RegSetValueExA(keyHandle,"some value",(const BYTE*)newValue.c_str(),newValue.size() + 1)==ERROR_SUCCESS) { //do something } RegCloseKey(keyHandle); } }

我删除了将字符串转换为字符串的部分,而不是显式使用ANSI版本的RegSetValueEx。

来自RegSetValueEx在MSDN中的评论:

如果DWType是REG_SZ,REG_MulTI_SZ或REG_EXPAND_SZ类型,则使用此函数的ANSI版本(通过显式调用RegSetValueExA或在包含windows.h文件之前未定义UNICODE),lpData参数指向的数据必须是一个ANSI字符串。 该字符串在存储在注册表中之前被转换为Unicode。

还要注意,cbData参数应该包含空终止的大小。

* 2是因为RegSetValueEx想要知道要写入的字节数,并且每个字符(wchar_t)在一个wstring中是两个字节宽。 所以得到的字节数组有两倍的大小!

不应该是wNewValue.size()*2+2吗? 空字符的+2? MSDN说:由lpData参数指向的信息的大小,以字节为单位。 如果数据类型为REG_SZ,REG_EXPAND_SZ或REG_MulTI_SZ,则cbData必须包含终止空字符的大小。

您也可以将unicode字符串复制到一个字节数组中:

LPWSTR pData = L"samplegrabber"; int DWSize = wcslen(pData)*sizeof(TCHAR); BYTE slump[256]; memset((voID*) slump,256*sizeof(BYTE)); memcpy((voID*) slump,(const voID *) pData,DWSize*sizeof(BYTE)); globit = RegSetValueEx(hKey,(const BYTE*) slump,DWSize);

如果你不幸的是正在为WINCE 5.0设备编写代码,并且它缺少一部分regedit API。

总结

以上是内存溢出为你收集整理的将std :: string转换为const BYTE *(对于RegSetValueEx()全部内容,希望文章能够帮你解决将std :: string转换为const BYTE *(对于RegSetValueEx()所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1267040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存