C 中的DLL C#中如何调用?

JAMESNET 2009-02-25 12:08:03
C :

int PubStrToIso ( char * pcSourceStr, int nStrLen, ISODataStru * TargetIsoStru, int *pnPosition)

C#:
结构定义:

private delegate int FIELD_PACKAGER_PACK (ISO_FIELD_DEF pthis, byte pfieldbuf, short fieldlen, byte poutdata);
private delegate int FIELD_PACKAGER_UNPACK(ISO_FIELD_DEF pthis, byte pfieldbuf, short fieldlen, byte poutdata);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct ISO_FIELD_DEF
{
short len; /* 数据域最大长度 */
LENGTH_TYPE lentype; /* 数据域长度类型: 1--LLVAR型 2--LLLVAR型 */
ALIGN_TYPE align; /* 对齐类型 */
char padchar; /* 补齐字符 */
FIELD_PACKAGER_PACK pack; /* 打包函数指针 */
FIELD_PACKAGER_UNPACK unpack; /* 解包函数指针 */
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct ISO_FIELD
{
short len;
short off; /* 指向iso->databuf缓冲区的偏移,数据中不含长度类型的几个字节 */
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct ISODataStru
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2560)]
ISO_FIELD []fld;
char []bitmap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_MSG_LEN+MAX_MSG_LEN)]
byte []databuf; /* 多留一个域的长度,防止溢出 */
short used;
};


如何定义、使用 以上函数? ( PubStrToIso ) ?
万分感谢!



...全文
84 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
JAMESNET 2009-02-25
  • 打赏
  • 举报
回复
目前调用方式:
[DllImport("lib56X0.dll", EntryPoint = "PubStrToIso")]//, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int PubStrToIso(string[] pcSourceStr, int nStrLen, ISODataStru TargetIsoStru, int pnPosition);




string[] pcSourceStr = { "08", "00", "00", "20", "00", "00", "00", "00", "00", "00", "01", "44", "66" };
int nStrLen = 0, pnPosiotion = -1;
ISODataStru TargetIsoStru = new ISODataStru() ;
nStrLen = 26;
PubStrToIso(pcSourceStr, nStrLen, TargetIsoStru, pnPosiotion);
但报错???
xstong1982 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 JAMESNET 的回复:]
目前调用方式:
[DllImport("lib56X0.dll", EntryPoint = "PubStrToIso")]//, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int PubStrToIso(string[] pcSourceStr, int nStrLen, ISODataStru TargetIsoStru, int pnPosition);


string[] pcSourceStr = { "08", "00", "00", "20", "00", "00", "00", "00", "00", "00", "01", "44", "66" };
int nStrLen = 0, pnPosi…
[/Quote]

改成这样
public static extern int PubStrToIso(IntPtr pcSourceStr, int nStrLen, IntPtr TargetIsoStru, ref int pnPosition);

IntPtr pntStru = Marshal.AllocHGlobal(sizeof(ISODataStru));
Marshal.StructureToPtr(TargetIsoStru, pntStru, false);

IntPtr就相当于非托管内存中的指针。

楼主用string[]往char *传有点奇怪了,string[]中有好多结束符,c那边只能认第一个"08"吧。
实在传这些数据的话用string pcSourceStr = "08,00,..."形式比较好,c那边自己再根据逗号分割一下。
调用时就这样PubStrToIso(Marshal.StringToHGlobalAnsi(pcSourceStr),nStrLen, pntStru, ref int pnPosition);

pcjbird 2009-02-25
  • 打赏
  • 举报
回复
StringBuilder
TaoXiaobing 2009-02-25
  • 打赏
  • 举报
回复
学习
zgke 2009-02-25
  • 打赏
  • 举报
回复
DllImport("lib56X0.dll", EntryPoint = "PubStrToIso")]//, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int PubStrToIso(ref StringBuilder pcSourceStr, int nStrLen, ref ISODataStru TargetIsoStru, ref int pnPosition);

*的换成引用类... char* 用 StringBuilder 看看
哈哈潜伏哥 2009-02-25
  • 打赏
  • 举报
回复
报错的原因是楼主传入参数的类型不对。
string[] pcSourceStr,这个参数有问题。char*在c#里面应该对应的int16的数据类型。楼主用string那肯定是不对的。具体情况请楼主搜索C C#数据类型对应。
JAMESNET 2009-02-25
  • 打赏
  • 举报
回复
08 00 00 20 00 00 00 00
C中代码地址值 ! 不是字符串!

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧