C#中调用C DLL 传递结构体数组问题

贪玩的老鼠 2012-05-10 10:52:30
C++结构体
struct BarcodeInfo //条码结构信息
{
char ShowContent[16] ;//条码显示内容
char BarcodeContent[16];//条码内容
};
//动态库LabelPrint.dll,接口如下
int PrintBarCode(BarcodeInfo* pBatchInfo,
BarcodeInfo* pBarcodeinfoArray,//条型码数组
int nSize)//数组大小

// 在C#中如果调用PrintBarCode
...全文
472 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2012-05-11
  • 打赏
  • 举报
回复
完整解决:

1、结构体声明:

[StructLayout(LayoutKind.Sequential)]
public struct BarcodeInfo
{

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string ShowContent;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string BarcodeContent;

};


2、函数声明:

[DllImport("LabelPrint.dll", CharSet = CharSet.Ansi]
public static extern int PrintBarCode(ref BarcodeInfo pBatchInfo,[In,Out]BarcodeInfo[] pBarcodeinfoArray,int size);
abclovbeien 2012-05-10
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)]
public struct BarcodeInfo
{

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] ShowContent;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] BarcodeContent;

};


[DllImport("LabelPrint.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int PrintBarCode(IntPtr pBatchInfo,IntPtr pBarcodeinfoArray);

用的时候先定义你的结构体,将数据传送进去如m_DataTransInfo

IntPtr m_DataTransInfo1 = Marshal.AllocHGlobal(Marshal.SizeOf(m_DataTransInfo));

Marshal.StructureToPtr(m_DataTransInfo, m_DataTransInfo1, true);

上面2个函数是将结构体转为IntPtr的形式,
之后你应该知道怎么做了吧!!

希望有用啦

EnForGrass 2012-05-10
  • 打赏
  • 举报
回复
贪玩的老鼠 2012-05-10
  • 打赏
  • 举报
回复
是传结构体数组
EnForGrass 2012-05-10
  • 打赏
  • 举报
回复
参考,看看DLL 传递结构 那部分
http://blog.csdn.net/sunboyljp/article/details/5110639
VB 超强的API浏览器,带源码。   在VB.net、C#, 使用 DllImport 属性调用 Windows API, 请先使用 Imports 或 using 导入 System.Runtime.InteropServices 以简化声明的引用。 对于Any类型的转换,VB.NET/C# 不支持Any类型。如果你要把VB6式的API声明添加为VB.NET/C#支持的声明方式, 请使用特定的类型。在本软件对于有Any类型的函数添加时会提示你选择一种类型。在 Visual Basic 6.0 , Any类型的变量通常用于传递是字符串或 Null 的变量, 您可以通过声明两种(一种使用长型,一种使用字符串)来替换这种 Visual Basic 6.0 的用法。 易语言的函数、类型、常数声明是放在不同的地方的,不用分别复制, 只需全部复制, 任意粘贴到Dll命令、常量表、自定义数据类型声明处, 易语言会自动分开几种类型。 在声明C#结构体时如果结果体有数值数组类型, 结构体的这个成员会被声明成不安全代码, 若要正确编译代码 ,请在单击VS.net“项目”菜单“属性”菜单项, 在出来的选项卡上选择“生成”, 选那个选项卡的“允许不安全代码”项复选项, 这样才能正确编译。 VB.net与C#不支持类型(结构体)的某个变量同时是定长字符串与数组, 两者只能选其一。请自行计算出数组大小或用代码处理定长字符串的方式进行改写。   VB.net与C#的类型(结构体)如果有数组那么这个类型不能声明为类。

110,538

社区成员

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

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

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