2

我正在替换一个旧的 DLL,它有一个函数,通过引用传递一个 LPWSTR。这些函数应该创建一个新的 wchar 缓冲区并返回新创建的 LPWSTR 指针。我找到了一个解决方案,但我认为它可以更好地解决!?

通过主程序调用 DLL 函数,如下所示:

LPWSTR data = null;
funcA(&data);

该函数应该创建一个新的 wchar 缓冲区并返回地址。

所以这就是我所做的(它有效):

void funcA(LPWSTR szData)
{
  LPWSTR newData = L"DEMODATA";
  LPWSTR newBuffer = new TCHAR[9];
  wmemcpy(newBuffer, newData, 9);

  memcpy(szData, (LPWSTR)&newBuffer , sizeof(LPWSTR));  
}

写最后一行可读性更好吗?我试图分配新的指针,但这不起作用:

szData = (LPWSTR)&newBuffer; // not working!
4

3 回答 3

2

通过引用传递 LPWSTR

但你不这样做...

void funcA(wchar_t* data); // LPWSTR resolved to what it actually is
                           // using correct pointers illustrates better
                           // than Microsoft's (valueless?) pointer typedefs...

您传递的原始指针被复制到函数参数中,然后对该副本进行赋值。

您实际上需要能够分配给外部地址,因此您需要执行您已经描述的操作:

void funcA(wchar_t*& data); // reference to pointer
//                 ^ (!)
{
    wchar_t const* newData = L"DEMODATA"; // literals are const!
    data = new wchar_t[9]; // you can assign directly (especially: no need for memcpy)
    wmemcpy(data, newData, 9);
}

只是为了进一步说明,可能有助于更好地理解: C style pointer to pointer:

void funcA(wchar_t** data); // pointer to pointer
//                 ^
{
    wchar_t* newData = new wchar_t[9];
    wmemcpy(newData, L"DEMODATA", 9);
    *data = newData;
//  ^ (!)
};

此变体的用法:

wchar_t* text;
funcA(&text);
//    ^ (!)
于 2019-01-29T14:25:51.997 回答
1

该函数应该创建一个新的 wchar 缓冲区并返回地址。

然后这样做:

LPWSTR funcA() {
  LPWSTR newData = L"DEMODATA";
  LPWSTR newBuffer = new TCHAR[9];
  wmemcpy(newBuffer, newData, 9);

  return newBuffer;
}

LPWSTR data = funcA();

话虽如此,请考虑使用unique_ptr来存储拥有的指针。这会起作用,但这是不好的做法。更好的是,用于std::string处理数据并仅在必要时转换为 WinAPI 指针。

于 2019-01-29T14:01:56.043 回答
0
memcpy(szData, (LPWSTR)&newBuffer , sizeof(LPWSTR));  

相当于

*(LPWSTR*)szData = newBuffer; //this copies into the address pointed to by szData

szData = (LPWSTR)&newBuffer; // this copies into szData
于 2019-01-29T14:13:17.993 回答