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”
展开
 我来答
泡影果果616
2016-01-25 · 知道合伙人软件行家
泡影果果616
知道合伙人软件行家
采纳数:2005 获赞数:71335
软件技术从上学的时候就在研究,虽没最强大脑那般无敌,但依靠后天的勤奋学习,相信可以很专业的帮助更多人

向TA提问 私信TA
展开全部

  除了看出导入的时候没写明CallingConvention=CallingConvention.Cdecl 以外,暂时没看到更多问题。

  有条件最好自己调试一下,就是把DLL那个工程属性里,调试那一栏,启动程序设成C#的exe,然后启动项目设成DLL那个工程,开跑,这样DLL的代码里可以断点啥的(因为是C++工程,所以用这个工程启动调试的话可以调试C++代码),更容易找到错误的地方。

renzhumin2
推荐于2016-05-04 · TA获得超过163个赞
知道小有建树答主
回答量:173
采纳率:0%
帮助的人:272万
展开全部
参数定义改一下。
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;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友09d4ae1
2012-04-06 · TA获得超过267个赞
知道小有建树答主
回答量:169
采纳率:0%
帮助的人:202万
展开全部
看错
更多追问追答
追问
什么看错
追答
pchar 是指针,指向连续的内存块。C#不是太熟,但明显StringBuilder是引用类型,里面东西都在托管堆上。内存分部是不是三个a 放一起,以及你传StringBuilder过去的话,传的应该是StringBuilder的引用地址,而这个引用地址是不是就放他内在元素(即三个a)的地址,就不得而知了。因为StringBuilder除了里面装了他的元素,还有他的类方法地址,放置顺序也未知。

你在c#可以加上unsafe关键字来用指针来读吧。申请一个连续的内存来取PCHAR类型
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式