| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1915 人关注过本帖
标题:请教c#如何定义DLL的入口参数
只看楼主 加入收藏
sailormo
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-8-3
收藏
 问题点数:0 回复次数:0 
请教c#如何定义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:
DEVICE_TYPE_COM: 通讯设备为RS-232
DEVICE_TYPE_UDP: 通讯设备为UDP
DEVICE_TYPE_485; 定义为半双工485通讯
(注意vsa卡为全双工485可以直接使用DEV_COM)
Speed:
仅对RS-232和485 有效,一般情况下主板的速度为 SBR_57600
UDP模式为自适应 最大3.5MBPS
locPort:
对RS-232设备和半双工485设备,该参数为串口号

对UDP设备,该参数为本地端口号,一般该值为大于1024的数字或者0,由系统自动分配
Remote:
仅对UDP方式有效,主板的固定端口为: 6666 不可以更改
reserved:
系统保留

Notify:
是否产生通知消息
1=产生通知消息
0=不产生通知消息
window:
接收通知消息的窗口句柄
Message:
消息标识 有如下常量:
LM_TX_COMPLETE 发送完成!
LM_RESPOND: 显示屏状态应答正常!
PKC_GET_POWER
Notify.Status==LED_POWER_ON 电源已打开
Else 电源已关闭
PKC_SET_POWER:
Notify.Result==99)处于自动开关屏模式,不能进行电源操作
else
Notify.Status==LED_POWER_ON)电源已打开
else电源已关闭
PKC_GET_BRIGHT:
显示屏亮度为: %d", Notify.Status);
PKC_SET_BRIGHT:
if (Notify.Result==99)处于自动亮度调节模式,不能进行亮度调节");
else
显示屏亮度为: %d", Notify.Status);
PKC_ADJUST_TIME:
时间已校正"
LM_TIMEOUT:
传送超时!

注:DLL用DELPHI所写

c# 如下定义代码:
private struct Device
{
public int deviceType;//设备类型
public int Speed;//速度
public int locPort;//本地端口号,串口为口串口号,UDP为通讯的本地端口
public int rmtPort;//远程端口号
//public string rmtHost;//远程主机IP
public int[] reserved;//系统保留

}
[DllImport("LEDSender.dll")]//打开通讯信道
private static extern int LED_Open(ref Device PDeviceParam, long Notify, int Window, int Message);

Device myLEDDevie = new Device();
myLEDDevie.deviceType = deviceType;
myLEDDevie.locPort = localPort;
myLEDDevie.reserved = new int[8];
for (int c = 0; c < 8; c++)
{

myLEDDevie.reserved[c] = c;
}
//myLEDDevie.rmtHost = remoteHost;
myLEDDevie.rmtPort = remotePort;
myLEDDevie.Speed = Speed;
PopMessage myPopMessage = new PopMessage();
b = myPopMessage.Handle.ToInt32();
DevHw = LED_Open(ref myLEDDevie, 0, b, b);

当执行LED_Open函数就报:
检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“LEDTest!LEDTest.LEDSender::LED_Open”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
请问如何解决这个问题。谢谢!!

搜索更多相关主题的帖子: DLL 定义 入口 参数 
2007-08-24 15:03
快速回复:请教c#如何定义DLL的入口参数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019216 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved