我正在替换具有功能的旧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));
}
答案 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