C# 调用 delphi dll 问题
///////delphiDLLfunctionss(num:PChar):Integerstdcall;varp:string;beginp:='aaa';StrCop...
///////delphi DLL
function ss( num:PChar):Integer stdcall ;
var p:string;
begin
p:='aaa';
StrCopy(num,PChar(p));
Result:=1;
end;
///////C# exe
[DllImport("test.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int ss(StringBuilder str);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
StringBuilder strb = new StringBuilder(200);
ss(strb);
t2.Text = strb.ToString();
}
为什么strb.tostring()的值是“a”,而不是“aaa” 展开
function ss( num:PChar):Integer stdcall ;
var p:string;
begin
p:='aaa';
StrCopy(num,PChar(p));
Result:=1;
end;
///////C# exe
[DllImport("test.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int ss(StringBuilder str);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
StringBuilder strb = new StringBuilder(200);
ss(strb);
t2.Text = strb.ToString();
}
为什么strb.tostring()的值是“a”,而不是“aaa” 展开
3个回答
2016-01-25 · 知道合伙人软件行家
关注
展开全部
参数定义改一下。
function ss(var num:PChar):Integer stdcall ;
var p:string;
begin
p:='aaa';
StrCopy(@num,@p);
Result:=1;
end;
function ss(var num:PChar):Integer stdcall ;
var p:string;
begin
p:='aaa';
StrCopy(@num,@p);
Result:=1;
end;
更多追问追答
追问
都是乱码。。这是把引用地址传过来吗?
追答
//C#部分。
public partial class Form1 : Form
{
[DllImport("Project1.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int ss( ref string str);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string strb = "1234";
ss( ref strb);
MessageBox.Show(strb); ;
}
}
//delphi部分
function ss( var num:PChar):Integer stdcall ;
var p:string;
begin
p:='aaa';
num := pchar(p);
Result:=1;
end;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看错
更多追问追答
追问
什么看错
追答
pchar 是指针,指向连续的内存块。C#不是太熟,但明显StringBuilder是引用类型,里面东西都在托管堆上。内存分部是不是三个a 放一起,以及你传StringBuilder过去的话,传的应该是StringBuilder的引用地址,而这个引用地址是不是就放他内在元素(即三个a)的地址,就不得而知了。因为StringBuilder除了里面装了他的元素,还有他的类方法地址,放置顺序也未知。
你在c#可以加上unsafe关键字来用指针来读吧。申请一个连续的内存来取PCHAR类型
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询