麻烦各位帮个忙啊,关于C#调用C动态库的问题,急啊!!!!!

lenovoboy 2009-04-24 04:10:42
调用总是报错。快急死了啊~~~~。附件里有我写的调用程序,里面有那个DLL文件
这是那个函数的说明:
---------------------------------------------------------------------------------------------------------------------------------
long LEDAPI LED_Open(const PDeviceParam param, long Notify, long Window, long Message);
该函数打开一个指定的通讯设备
参数:
param:
一个设备参数指针,该结构如下定义:
typedef struct DEVICEPARAM{
long devType; //device type
long speed; //speed only use for rs232
long locPort; //rs232: COM port UDP: local port
long rmtPort; //remote port only use for UDP
long reserved[8];
}TDeviceParam;
typedef TDeviceParam * PDeviceParam;

devType:
0: 通讯设备为RS-232
1: 通讯设备为UDP
Speed:
仅对RS-232有效,一般情况下主板的速度为 SBR_57600
locPort:
对RS-232设备,该参数为串口号
对UDP设备,该参数为本地端口号,一般该值为大于1024的数字
Remote:
仅对UDP方式有效,主板的固定端口为: 6666
reserved:
系统保留

Notify:
是否产生通知消息
1=产生通知消息
0=不产生通知消息
window:
接收通知消息的窗口句柄
Message:
消息标识
------------------------------------------------------------------------------------------------------------------------------

我是这样调用的
-------------------------------------------------------------------------------------------------------------------------------
public struct LEDDevice //数据结构
{
public long devType; //设备类型:0(通讯设备为RS-232);1(通讯设备为UDP)
public long speed; //波特率:仅对RS-232有效,一般情况下主板的速度为 57600
public long locPort; //端口号:对RS-232设备,该参数为串口号;对UDP设备,该参数为本地端口号,一般该值为大于1024的数字
public long rmtPort; //仅对UDP方式有效,主板的固定端口为: 6666
[MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 5)]
public long[] reserved; //系统保留
}

/////////////////////////////函数声明
[DllImport("LEDSender.dll", EntryPoint = "LED_Open", CharSet = CharSet.Unicode)]
public static extern int LED_Open(LEDDevice param, long Notify, long Window, long Message);



private void Form1_Load(object sender, EventArgs e)
{
LEDDevice param;
//初始化设备类型参数
param.devType = 1;//COM方式
param.speed = 57600;//波特率
param.locPort = 5;//串口号
param.rmtPort = 6666;
param.reserved = new long[] { };

int result = LED_Open(param, 1, 1, 1);/////调用
}
-------------------------------------------------------------------------------------------------------------------------------

请问函数中的各个变量该如何来赋值呢?

万分感谢啊!!!
...全文
177 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lenovoboy 2009-04-25
  • 打赏
  • 举报
回复
.........看来是没戏了~~~
陌上花花 2009-04-24
  • 打赏
  • 举报
回复
帮顶下啦
lenovoboy 2009-04-24
  • 打赏
  • 举报
回复
麻烦哪位兄弟给个详细的代码可否啊?急死我啦~~~~~
sushou2009 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 windchenhonglong 的回复:]
应该是参数的传递问题,可把获取相应结构与窗口地址转换为整型参数进行调用
[/Quote]
好像是这个原因~
lenovoboy 2009-04-24
  • 打赏
  • 举报
回复
LS的方法还是不行啊~~~
风龙-3 2009-04-24
  • 打赏
  • 举报
回复
应该是参数的传递问题,可把获取相应结构与窗口地址转换为整型参数进行调用
tonny_123 2009-04-24
  • 打赏
  • 举报
回复
感觉你调用的参数有些问题吧。
lenovoboy 2009-04-24
  • 打赏
  • 举报
回复
请问是那个头文件啊
KKND2006 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lenovoboy 的回复:]
DLL需要放在SYSTEM32里面么?
报异常:
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
[/Quote]

你要用marshal,读一下相关资料

参数范围,应该在头文件里面有
比如那个message,应该在头文件中定义有:

#define msg_ok 10000 + 24
lenovoboy 2009-04-24
  • 打赏
  • 举报
回复
这个不太清楚啊,有什么方法可以得到么?
wanabe 2009-04-24
  • 打赏
  • 举报
回复
调用是没错的,输入的参数范围什么你问问给你dll的人吧,
lenovoboy 2009-04-24
  • 打赏
  • 举报
回复
DLL需要放在SYSTEM32里面么?
报异常:
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
wanabe 2009-04-24
  • 打赏
  • 举报
回复
dll放在system32(xp)了吗
你报的什么错都没说。。。
lenovoboy 2009-04-24
  • 打赏
  • 举报
回复
哪位能否给个调用成功的代码啊,谢谢了
KKND2006 2009-04-24
  • 打赏
  • 举报
回复
public static extern int LED_Open(LEDDevice param, long Notify, long Window, long Message);

第一个传结构,第二个传数字,第三个传窗口句柄即Handle,最后一个是它自定义的Message,整数,去找相应的数值,应该在预编译文件里面

111,126

社区成员

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

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

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