Вы пытаетесь объединить PWideChar со строковым литералом и вернуть его как другой PWideChar. Это не будет работать как есть. Вы не должны возвращать PWideChar в любом случае. Это приводит к кошмарам управления памятью. Лучшее решение - позволить вызывающей стороне передать буфер в DLL для заполнения, например:
library testdll;
uses
System.Classes,
Winapi.Windows,
System.SysUtils;
{$R *.res}
function hello(name, buffer : PWideChar; buflen: Integer): Integer; stdcall;
var
rs: UnicodeString;
begin
rs := 'Hello '+UnicodeString(name);
if buffer = nil then
begin
Result := Length(rs) + 1;
end else
begin
Result := Min(buflen, Length(rs));
Move(rs[1], buffer^, Result * SizeOf(WideChar));
end;
end;
exports
hello;
begin
end.
Тогда, учитывая это объявление C ++ ::
int __stdcall hello(wchar_t* name, wchar_t* buffer, int buflen);
Вы можете называть это разными способами, в зависимости от ваших потребностей:
wchar_t str[256];
int len = hello(L"joe", str, 255);
str[len] = 0;
...
int len = hello(L"joe", NULL, 0);
wchar_t *str = new wchar_t[len];
len = hello(L"joe", str, len);
str[len] = 0;
...
delete[] str;
int len = hello(L"joe", NULL, 0);
std::wstring str(len-1);
str.resize(hello(L"joe", &str[0], len));
...
int len = hello(L"joe", NULL, 0);
UnicodeString str;
str.SetLength(len-1);
str.SetLength(hello(L"joe", str.c_str(), len));
...
Код того же типа можно очень легко перевести на Pascal, если вам когда-либо понадобится использовать ту же DLL в Delphi:
function hello(name, buffer: PWideChar, buflen: Integer): Integer; stdcall; extern 'testdll.dll';
var
str: array[0..255] of WideChar;
len: Integer;
begin
len := hello('joe', str, 255);
str[len] := #0;
...
end;
var
str; PWideChar
len; Integer;
begin
len := hello('joe', nil, 0);
GetMem(str, len];
len := hello('joe', str, len);
str[len] := #0;
...
FreeMem(str);
end;
var
str; UnicodeString;
len; Integer;
begin
len := hello('joe', nil, 0);
SetLength(str, len-1);
SetLength(str, hello('joe', PWideChar(str), len));
...
end;