因为要做工控,购买了北京科瑞的KPCI-847八路板卡(同时提供了名为:kpci800.dll的动态链接库),由于厂家只提供了C++和VB的示例代码,而本人只会C#,想请教各位有否懂这两门的帮帮忙转换一下,如:打开指定设备函数
Visual C++ & C++Builder:
BOOL WINAPI OpenmDevice(ULONG iIndex,ULONG boardtype)
Visual Basic:
Declare Function OpenDevice Lib "kpci800.dll" (ByVal iIndex As Long,ByVal boardtype)
As Boolean
功能: 该函数负责打开指定板卡型号的设备对象
参数: iIndex 指定KPCI板卡的设备序号,0对应第一个设备
boardtype 指定KPCI板卡的型号,这里只能是840、843、844、845、846、847、848。
返回值:“1”表示成功,“0”代表失败。从I/O端口读入一个字节
Visual C++ & C++Builder:
UCHAR WINAPI ReadByte(ULONG iIndex ,UCHAR dich)
Visual Basic:
Declare Function ReadByte Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal dich As Byte)
As Byte
功能: 从端口读入一个字节
参数: iIndex 与OpenDevice中的相同
dich 为开关量输入的地址
返回值:读取的单字节数据
关于打开指定设备函数,我自己试着用以下的C#语句但会报错:[DllImport("kpci800.dll")]
private static extern bool winapi OpenmDevice(Int32 iIndex, Int32 boardtype);  //此句报错:"应输入;"我已经将厂家提供的kpci800.dll文件放在了项目的bin/debug文件夹内了。请懂行者将上面两个VC++的声明语句帮我转成C#形式的好吗?谢谢了!

解决方案 »

  1.   

    [DllImport("kpci800.dll",EntryPoint = "OpenmDevice")]
    private static extern bool OpenmDevice(Int32 iIndex, Int32 boardtype); 
      

  2.   

    BOOL WINAPI OpenmDevice(ULONG iIndex,ULONG boardtype)
    先分析这个函数:
    参数1:ULONG iIndex,一个unsigned long(无符号长整数),传入参数,用于指定设备序号
    参数2:ULONG boardtype,一个unsigned long(无符号长整数),传入参数,用于指定设备型号,这里应该是847返回值:int,0表示失败,1表示成功
    winapi是函数参数入栈顺序修饰符(__stdcall),在Dll中声明的时候使用,调用的时候不要带上了有了上面这些信息下手就容易了:
    [DllImport("kpci800.dll")]
    private static extern int OpenmDevice(unsigned long iIndex, unsigned long boardtype);unsigned long index = 0;
    unsigned long boardtype = 847;
    int result = OpenmDevice(index, boardtype);
    Console.WriteLine(result)
    先把result搞成1再进行下一步