我有一个函数,得到一个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()所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)