当前位置:编程学习 > C#/ASP.NET >>

C#调用Delphi的DLL问题

请教一个困扰我三天的问题哦
我现在想在C#中调用一个有Delphi写的DLL文件,它的调用说明文档是这样描述的:

我再C#是这样调用的:
       [DllImport(@"SajetConnect.dll",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern Boolean SajetTransData(int f_iCommandNo, byte[] f_pData,IntPtr f_pLen);
可就是报错!

C# Delphi 文档 boolean --------------------编程问答-------------------- f_pData 应该是个结构体,不过你的文档没有提及

姑且认为是文档说滴byte[]

public static extern Boolean SajetTransData(int f_iCommandNo,ref byte[] f_pData,int f_pLen);

调用的时候需要先定义byte的长度
比如 byte[50] --------------------编程问答-------------------- 后两个参数类型一个是字节指针,一个是整数指针,C#中加个*试试。
baidu一下C#中的指针。 --------------------编程问答-------------------- 用C#的指针,代码前加unsafe --------------------编程问答-------------------- 目测一下
public static extern Boolean SajetTransData(int f_iCommandNo, byte[] f_pData,IntPtr f_pLen);
应该是不可以...
问题应该是出在 byte[] f_pData, ,

正常的情况,声明时,你还是应该:
public static extern Boolean SajetTransData(int f_iCommandNo, IntPtr f_pData,IntPtr f_pLen);
f_pData 初始地址,根据f_pLen来取数值,再放到数组中...但这种方式一般是不可能的。

所以,估计最可能的情况是这样:
public static extern Boolean SajetTransData(int f_iCommandNo, DATAINFO_STRUCT  f_pData,IntPtr f_pLen);

public struct  DATAINFO_STRUCT
{
int x;
int y;
}

台式写法在嵌入式硬件也比较喜欢使用将数据存在struct 中,该截图也说了 f_pData 是一个记忆空间,如果你有delphi 的demo ,可以参照delphi 协议一个struct  就OK 了.. --------------------编程问答-------------------- 我的QQ是550948440,能否Q上聊一下,此问题弄了好长时间了 --------------------编程问答-------------------- 后两个参数在DLL中一样的类型,为什么你在 C#中写成不一样的了? --------------------编程问答--------------------
引用 6 楼 tcmakebest 的回复:
后两个参数在DLL中一样的类型,为什么你在 C#中写成不一样的了?

修改成下面的了
 [DllImport(@"SajetConnect.dll", EntryPoint = "SajetTransData", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern Boolean SajetTransData(int f_iCommandNo,   IntPtr f_pData,  IntPtr f_pLen);

调用方式:
string s1 = "SAJET001;";
byte[] bArray = new byte[500];
bArray = Encoding.Default.GetBytes(s1);
byte[] bbb = ReadBytesFromPtr(firstAdd, 500);
IntPtr inpPtrTest = new IntPtr();
WriteBytesToPtr(inpPtrTest, bArray);
var sss = SajetTransData(iCommand,  inpPtrTest, (IntPtr)f_pLen);还是不对 --------------------编程问答-------------------- IntPtr只有一个整数的空间,如何写字节进去啊
f_pLen 要接收指针,你强制转换肯定不行,改成 ref int f_pLen 试试 --------------------编程问答--------------------
引用 8 楼 tcmakebest 的回复:
IntPtr只有一个整数的空间,如何写字节进去啊
f_pLen 要接收指针,你强制转换肯定不行,改成 ref int f_pLen 试试

一直这样:
--------------------编程问答--------------------
引用 8 楼 tcmakebest 的回复:
IntPtr只有一个整数的空间,如何写字节进去啊
f_pLen 要接收指针,你强制转换肯定不行,改成 ref int f_pLen 试试

能否给个邮箱,我把问题发个你,你帮我看一下,这是我接的个外单,现在问题就卡这了,如果你到工厂接外单的话,相信也一定会遇到这个问题,所以对你可能会有帮助 --------------------编程问答-------------------- 截图上的错误原因应该是你的 f_pData 没有指向可写入的有效空间,DLL 将返回数据写入失败了。 --------------------编程问答-------------------- 先用delphi创建个指针给调用方,C#调用方指收到指针往里面写入内容,delphi接收到再解析这个指针。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,