我有一个回调函数,其参数为const unsigned char *pData
。每次我点击回调函数时,我都需要将pData
值存储到我的本地unsigned char*
变量中。有没有复制数据的功能?
修改:以下是代码示例:
void Callbackfun(int x, const unsigned char* pData, const UINT cbData) {
switch(x) {
case 0:
// ptr is a global variable of structure containg name and number
ptr.name = (unsigned char*)pData;
break;
case 1:
ptr.number = (unsigned char*)pData;
break;
}
}
现在每次调用此函数时,我都希望将pData
值存储在我的本地结构中(如ptr.name
所示)。
答案 0 :(得分:2)
在回调函数中,您必须为“数据”分配本地内存。这样,当调用函数离开作用域时,您可以保留它。如果你知道数据的长度,并且长度是一致的,你有两个选择。动态分配,或在堆栈上分配。代码示例未经测试。
这是动态分配和复制。
unsigned char* localData = new unsigned char[42];
memcpy( localData, pData, 42 );
这是堆栈分配版本
unsigned char localData[42];
memcpy( &localData, pData, 42 );
我假设您没有传递字符串数据,因为您使用的是unsigned char。由于您只处理指针,因此您必须知道用于分配的缓冲区大小。
如果您没有恒定的数据长度,那么您需要将其作为第二个参数传递给回调函数。
答案 1 :(得分:1)
如果您可以更改struct
似乎是ptr
的实例,我建议您这样做:
#include <string>
struct ptr_type {
std::string name;
std::string number;
};
ptr_type ptr;
对于回调,假设cbData
告诉我们pData
指向的缓冲区的大小:
void Callbackfun(int x, const unsigned char* pData, const UINT cbData) {
// The following line will copy the buffer pointed to by
// pData into an std::string object:
std::string data(pData, cbData);
switch(x) {
case 0:
// Simple assignment of std::string objects copies the
// entire buffer:
ptr.name = data;
break;
case 1:
ptr.number = data;
break;
}
}