C#调用Delphi的DLL问题

请教一个困扰我三天的问题哦我现在想在C#中调用一个有Delphi写的DLL文件,它的调用说明文档是这样描述的:... 请教一个困扰我三天的问题哦我现在想在C#中调用一个有Delphi写的DLL文件,它的调用说明文档是这样描述的: 展开
 我来答
FoolRabbit编程
推荐于2016-05-07 · 知道合伙人数码行家
FoolRabbit编程
知道合伙人数码行家
采纳数:619 获赞数:3805
毕业于苏州大学,4年编程经验,对WPF有研究。

向TA提问 私信TA
展开全部

首先贴出我的测试代码:

delphi:(Delphi指针不太会,还请大神们指点)

unit Unit1;
interface
uses
  SysUtils;
function SajetTransData(f_iCommandNo:Integer;f_pData,f_pLen:Pointer):Boolean;stdcall;
implementation
function SajetTransData(f_iCommandNo:Integer;f_pData,f_pLen:Pointer):Boolean;
var
  str,strlen:string;
  len:Integer;
  pstr:PChar;
  plen,i:Integer;
begin
  Result:=False;
  if f_iCommandNo=1 then
  begin
    str:='';
    strlen:='';
    while Char(f_pData^) <> #0 do
    begin
      str := str +string(Char(f_pData^));
      inc(Integer(f_pData));
    end;
    while Char(f_pLen^) <> #0 do
    begin
      strlen := strlen +string(Char(f_pLen^));
      inc(Integer(f_pLen));
    end;
    len:=StrToInt(strlen);
    str:=#13+'原始字符串:'+str+#13+
      '有效长度:'+IntToStr(len);
    pstr:=PChar(str);
    plen:=Length(str);
    for i:=0 to plen do
    begin
      Char(f_pData^):=pstr[i];
      inc(Integer(f_pData));
    end;
    Char(f_pData^):=#0;
  end;
  Result:=True;
end;
end.

C#代码

private void button2_Click(object sender, EventArgs e)
        {
            int f_iCommandNo;
            StringBuilder f_pData=new StringBuilder(256);
            StringBuilder f_pLen = new StringBuilder(256);
            f_iCommandNo = 1;
            f_pData.Append("123");
            f_pData.Append("45");
            int len = f_pData.Length;
            f_pLen.Append(len.ToString());
            CallDelphi.SajetTransData(f_iCommandNo,f_pData,f_pLen);
            MessageBox.Show(f_pData.ToString());
        }
        private class CallDelphi
        {
            const string path = "CsharpTest.dll";
            [DllImport(path, EntryPoint = "SajetTransData", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
            public static extern Boolean SajetTransData(int f_iCommandNo, StringBuilder f_pData, StringBuilder f_pLen);
        }

两个指针都用StringBuild去操作。f_pLen传入int型的即可。

测试结果(第一行为原数据,后面为delphi处理后在原指针上加的内容):

 

博客园也有该提问:http://q.cnblogs.com/q/53303/

RedBaronVIP
2013-08-12 · TA获得超过1147个赞
知道小有建树答主
回答量:655
采纳率:0%
帮助的人:239万
展开全部
在C#中,你必须开辟一块内存空间,里面放上所谓的“字串资料”,然后把这块内存的首地址作为f_pData参数传给函数...
至于C#中如何开辟内存,如何调用函数虾米的,就不要问我了。我不懂,也不想懂...
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式