如何设置通过引用函数提供的LPWSTR指针?

时间:2019-01-29 13:51:22

标签: c++ dll lpwstr

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

通过主要程序,DLL函数的调用方式如下:

public class E{

    private int cont;

    private static int replace(String cad){
        StringBuilder sb = new StringBuilder(cad);

        if(sb.indexOf("RAV") > -1){
            sb.replace(sb.indexOf("RAV"), sb.indexOf("RAV") + 3, "");
            cont++;
            return replace(sb.toString())}
        else{
            return cont; 
        }
    }

    public static void main(String[] args) {
        cont = 0;
        String[] arr = new String[]{"RARAVV", "VAR", "RAVV"};
        for (int i = 0; i < arr.length; i++) {
            System.out.println(replace(arr[i]));
        }
    }
}

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

这就是我的工作(有效):

LPWSTR data = null;
funcA(&data);

是否有可能写出更好可读的最后一行? 我试图分配新的指针,但这不起作用:

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

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

3 个答案:

答案 0 :(得分: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风格的指针:

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);
//    ^ (!)

答案 1 :(得分: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指针。

答案 2 :(得分: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