我用.net调用delphi写的动态链接库返回值是pchar
.net调用代码
[DllImport("QBSqlData.dll", CharSet = CharSet.Ansi, PreserveSig = false)]
public static extern string SelectSqlData(ref StringBuilder sbStr);
//public static extern StringBuilder SelectSqlData();
protected void Page_Load(object sender, EventArgs e)
{
StringBuilder sbStr = new StringBuilder(102400);
string s = SelectSqlData(ref sbStr);
Div1.InnerText = sbStr.ToString();
}delphi动态库函数
function SelectSqlData(var sbStr:PChar):string;stdcall; HotelConNet.ReadDataset('SELECT top 50 * FROM feeitem ',cdsData);
GetMem(SS,102400);
GetMem(sbStr,102400);
SS:=PChar(cdsData.XMLData+char(#0));
sbStr:=SS;
str:='1';
Result:=str;返回值sbStr是一个大容量xml数据集。如果只返回一两条记录则是成功的,返回10条以上就被截断了。
delphi动态库.net调用delphiPcharstringbuilder
.net调用代码
[DllImport("QBSqlData.dll", CharSet = CharSet.Ansi, PreserveSig = false)]
public static extern string SelectSqlData(ref StringBuilder sbStr);
//public static extern StringBuilder SelectSqlData();
protected void Page_Load(object sender, EventArgs e)
{
StringBuilder sbStr = new StringBuilder(102400);
string s = SelectSqlData(ref sbStr);
Div1.InnerText = sbStr.ToString();
}delphi动态库函数
function SelectSqlData(var sbStr:PChar):string;stdcall; HotelConNet.ReadDataset('SELECT top 50 * FROM feeitem ',cdsData);
GetMem(SS,102400);
GetMem(sbStr,102400);
SS:=PChar(cdsData.XMLData+char(#0));
sbStr:=SS;
str:='1';
Result:=str;返回值sbStr是一个大容量xml数据集。如果只返回一两条记录则是成功的,返回10条以上就被截断了。
delphi动态库.net调用delphiPcharstringbuilder
sbStr在调用前已经分配了内存空间,为何在 Delphi 中又重新分配?
返回数据为何用赋值操作,我认为要用复制到 sbStr 的操作吧。
其实你也可以用widestring这个是COM所支持的.
这不需要这样义
而是:
function SelectSqlData(sbStr:PChar):string;stdcall; 这个sbStr是外面分配好的传进来的在函数内部不能重新分配
GetMem(sbStr,102400);这个是多余的,并且也不对下面这句 sbStr:=SS;也是不对的
而是应该COPY,怎么能直接把指针地址赋值呢CopyMemory(sbStr,SS,102400);这样才把数据真的给了sbStr
CopyMemory(sbStr,SS,102400);会报错 [错误] SqlData.pas(78): Undeclared identifier: 'CopyMemory'
CopyMemory是在Windows中定义的
明白了,不好意思,我的delphi只接触了两天。非常感谢您的帮助,经过测试,.net已经能够顺利接收到值了。