首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

入,dll调用

2012-03-17 
高手进入,dll调用以下是开发一款叫SCL2008的LED控制卡的VB源码(这个是厂商提供,可以正确实现所有方法),我

高手进入,dll调用
以下是开发一款叫SCL2008的LED控制卡的VB源码(这个是厂商提供,可以正确实现所有方法),我将以下源码在c#里做了相应的编写,但是结果发现只有Private Declare Function SCL_ShowString Lib "SCL_API_Stdcall" (ByVal DevID As Integer, ByRef TextInfo As Integer, ByVal Str As String) As Boolean申明在c#返回结果总是false,没有实现成功。
API中此方法是这样定义的BOOL SCL_ShowString(WORD nDevID,short *info, char *str);

VERSION 5.00
Begin VB.Form Form1 
  Caption = "Form1"
  ClientHeight = 1740
  ClientLeft = 60
  ClientTop = 345
  ClientWidth = 4530
  LinkTopic = "Form1"
  ScaleHeight = 1740
  ScaleWidth = 4530
  StartUpPosition = 3 '窗口缺省
  Begin VB.CommandButton Command2 
  Caption = "发送文本,直接静止显示"
  Height = 375
  Left = 720
  TabIndex = 1
  Top = 960
  Width = 3255
  End
  Begin VB.CommandButton Command1 
  Caption = "发送文本文件, 带移动效果"
  Height = 375
  Left = 720
  TabIndex = 0
  Top = 240
  Width = 3255
  End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
' ---------------------------------------------------------
' Functions in DLL
Private Declare Function SCL_NetInitial Lib "SCL_API_Stdcall" (ByVal DevID As Integer, ByVal Password As String, ByVal IP As String, ByVal TimeOut As Long, ByVal Retry As Long, ByVal UDPPort As Integer, ByVal SCL2008 As Boolean) As Boolean
Private Declare Function SCL_ComInitial Lib "SCL_API_Stdcall" (ByVal DevID As Integer, ByVal ComPort As Long, ByVal Baudrate As Long, ByVal LedNum As Long, ByVal TimeOut As Long, ByVal Retry As Long, ByVal SCL2008 As Boolean) As Boolean
Private Declare Function SCL_ShowString Lib "SCL_API_Stdcall" (ByVal DevID As Integer, ByRef TextInfo As Integer, ByVal Str As String) As Boolean
Private Declare Function SCL_SendFile Lib "SCL_API_Stdcall" (ByVal DevID As Integer, ByVal DrvNo As Long, ByVal Path As String, ByVal FileName As String) As Boolean
Private Declare Function SCL_SendData Lib "SCL_API_Stdcall" (ByVal DevID As Integer, ByVal Offset As Long, ByVal SendBytes As Long, ByRef Buff As Byte) As Boolean
Private Declare Function SCL_SaveFile Lib "SCL_API_Stdcall" (ByVal DevID As Integer, ByVal DrvNo As Long, ByVal FileName As String, ByVal Length As Long, ByVal Da As Long, ByVal Ti As Long) As Boolean
Private Declare Function SCL_GetFileDosDateTime Lib "SCL_API_Stdcall" (ByVal FileName As String, ByRef Da As Long, ByRef Ti As Long) As Boolean
Private Declare Function SCL_RemoveFile Lib "SCL_API_Stdcall" (ByVal DevID As Integer, ByVal DrvNo As Long, ByVal FileName As String) As Boolean
Private Declare Function SCL_Replay Lib "SCL_API_Stdcall" (ByVal DevID As Integer, ByVal Drv As Long, ByVal Index As Long) As Boolean
Private Declare Function SCL_Close Lib "SCL_API_Stdcall" (ByVal DevID As Integer) As Boolean
' ---------------------------------------------------------
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
' ---------------------------------------------------------
' Constant define
Const bSCL2008 = True 'TRUE: 控制器为SCL2008, FALSE: 控制器为SuperComm
Const IPAddr = "10.1.1.100" '网络通讯: 控制器 IP 地址
Const UDPPort = 1024 '网络通讯: UDP 端口号



Const LedNum = 0 '串口通讯: 控制器编号
Const ComPort = 1 '串口通讯: 计算机串口号
Const Baudrate = 57600 '串口通讯: 通讯速率

Const bOnlyShowStatic = False 'TRUE: 只静止输出,不带移动效果, FALSE:试验发文件的方式
Const bSendFile = False 'TRUE: 用 SendFile 发送文件, FALSE:用SendData,SaveFile发送文件
Const bNet = False 'TRUE: 使用网络收发, FALSE: 使用串口收发

Const mDevID = 9 '任意的2字节通讯设备编号

Const TimeOut = 2 '通讯超时上限
Const RetryTimes = 2 '通讯重发次数

Const LedWidth = 128 '区域宽
Const LedHeight = 32 '区域高
Const CharColor = 255 '文字颜色

Const FileName = "Test.Txt" '文本文件名

' ---------------------------------------------------------
' 文本输出信息结构,
Private Type TextInfoType
  Left As Integer
  Top As Integer
  Width As Integer
  Height As Integer
  Color As Long
  ASCFont As Integer
  HZFont As Integer
  XPos As Integer
  YPos As Integer
End Type

Private Sub Command2_Click()
Dim S As String
Dim bOK As Boolean, xb As Boolean
Dim Buff(1024) As Byte
Dim Da As Long, Ti As Long
Dim TextInfo As TextInfoType
If bSCL2008 Then
TextInfo.Left = 4096 - LedWidth
Else
TextInfo.Left = 960 - LedWidth
End If
TextInfo.Top = 0
TextInfo.Width = LedWidth
TextInfo.Height = LedHeight
TextInfo.Color = CharColor
TextInfo.ASCFont = 1
TextInfo.HZFont = 2
TextInfo.XPos = 0
TextInfo.YPos = 0
   
  S = ""
  'Use 6x12,12x12 fonts
  S = S + " `A1`H2`C0000FF红色12点显示"

  'Use 8x16,16x16 fonts
  S = S + "`A3`H4绿色16点显示AB"

  'Use 12x24,24x24 fonts
  S = S + "`A5`H6黄色24点显示CD`Y000"

  'Use 16x32,32x32 fonts
  S = S + "`M3`A7`H8反白32点显示EF"

  '通讯初始化
  If bNet Then
  bOK = SCL_NetInitial(mDevID, "", IPAddr, TimeOut, RetryTimes, UDPPort, bSCL2008)
  Else
  bOK = SCL_ComInitial(mDevID, ComPort, Baudrate, LedNum, TimeOut, RetryTimes, bSCL2008)
  End If

  If bOK = False Then MsgBox ("初始化失败")

  If bOnlyShowStatic = False Then
  '删除移动播出的文本文件
  '仅实现静止显示则可不调用这个函数
  If bOK Then
  bOK = SCL_RemoveFile(mDevID, 2, FileName)
  If bOK = False Then MsgBox ("删除文件失败")
  End If

  '重启节目表,使屏幕静止(因为节目表中的文本文件不存在了)
  '仅实现静止显示则可不调用这个函数
  If bOK Then
  If bSCL2008 Then
  bOK = SCL_Replay(mDevID, 0, 0)
  Else
  bOK = SCL_Replay(mDevID, 1, 0)
  End If
  If bOK = False Then MsgBox ("重启节目表失败")
  Sleep (500)
  End If
  End If

  '显示文字串,自动排版,超出部分自动截断
  If bOK Then
  bOK = SCL_ShowString(mDevID, TextInfo.Left, S)
  If bOK = False Then MsgBox ("文字直接输出失败")
  End If

  SCL_Close (mDevID)
End Sub
Private Function StringToByte(ByRef S As String, ByRef ByteBuf() As Byte) As Integer
Dim i As Integer
Dim j As Integer
Dim v As Integer
Dim xv As Integer
Dim Lv As Long
  j = 0
  For i = 0 To Len(S) - 1
  v = Asc(Mid(S, i + 1, 1)) '取一个16位字符
  If v > 0 Then '普通字符
  ByteBuf(j) = v


  j = j + 1
  Else '小于0则为中文字,实际是大于等于32768
  Lv = 65536 + v
  xv = Lv \ 256
  ByteBuf(j) = xv
  j = j + 1
  xv = Lv Mod 256
  ByteBuf(j) = xv
  j = j + 1
  End If
  Next i
  StringToByte = j
End Function

以上红字部分我在c#中是这样写的,第一种方法:
 [DllImport(@"C:/WINDOWS/system32/SCL_API_stdcall.Dll", EntryPoint = "SCL_ShowString")]
  public static extern bool SCL_ShowString(short nDevID, ref int info, string disinfo);
 public struct TextInfoType
  {
  public int Left;
  public int Top;
  public int Width;
  public int Height;
  public int Color;
  public int ASCFont;
  public int HZFont;
  public int XPos;
  public int YPos;
  }

  public void ShowStringRightNow(string info) 
  {
  TextInfoType textInfo = new TextInfoType() { } ;
  textInfo.Left = 3984;
  textInfo.Top = 0;
  textInfo.Height = 32;
  textInfo.Width = 112;
  textInfo.HZFont =4;
  textInfo.XPos = 0;
  textInfo.YPos = 0;
  textInfo.Color = 255;
  textInfo.ASCFont = 3;
  bool a = SCL_ShowString(this.Address, ref textInfo.Left, info);
   
  }
  }
第二种方法:
[DllImport(@"C:/WINDOWS/system32/SCL_API_stdcall.Dll", EntryPoint = "SCL_ShowString")]
public static extern bool SCL_ShowString(short nDevID, IntPtr info, string disinfo);
  public struct TextInfoType
  {
  public int Left;
  public int Top;
  public int Width;
  public int Height;
  public int Color;
  public int ASCFont;
  public int HZFont;
  public int XPos;
  public int YPos;
  }
  public void ShowStringRightNow(string info) 
  {
  TextInfoType textInfo = new TextInfoType() { } ;
  textInfo.Left = 3984;
  textInfo.Top = 0;
  textInfo.Height = 32;
  textInfo.Width = 112;
  textInfo.HZFont =4;
  textInfo.XPos = 0;
  textInfo.YPos = 0;
  textInfo.Color = 255;
  textInfo.ASCFont = 3;

  IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TextInfoType)));
  Marshal.StructureToPtr(textInfo, ptr, false);
  bool a = SCL_ShowString(this.Address, ptr, info);
  
  }
  }
结果发现两种方法返回结果都是FLASE,崩溃,各位大虾知道在c#中如何申明并实现此方法么?

[解决办法]
试试:
[DllImport(@"C:/WINDOWS/system32/SCL_API_stdcall.Dll", EntryPoint = "SCL_ShowString" ,CharSet = CharSet.Ansi)]
public static extern bool SCL_ShowString(Int16 nDevID,[MarshalAs( UnmanagedType.I2)] ref Int16 info, [MarshalAs( UnmanagedType.LPStr)]string disinfo);
[解决办法]
[DllImport(@"C:/WINDOWS/system32/SCL_API_stdcall.Dll", EntryPoint = "SCL_ShowString", CharSet = CharSet.Ansi)]
public static extern bool SCL_ShowString(Int16 nDevID, ref TextInfoType info, [MarshalAs(UnmanagedType.LPStr)]string disinfo);



[StructLayout(LayoutKind.Sequential)]
public struct TextInfoType
{
public Int16 Left;
public Int16 Top;
public Int16 Width;
public Int16 Height;
public Int16 Color;
public Int16 ASCFont;
public Int16 HZFont;
public Int16 XPos;
public Int16 YPos;
}
以上代码,我用C做了个DLL,可以调通

[解决办法]
封存的方法应该没问题,主要看参数的值有没有问题吧

调用前检查一下 mDevID和 textInfo 是不是有问题,最好用VB可调用成功的例子去判断一下
[解决办法]
这个动态库我也用过,不过没使用这个函数,我全部把要发送的字转换成图片再发送。图片发送比较简单。
[解决办法]


对了

用图片可以实现!
不过显示出来的东西,等不是太亮!

我女朋友做这,她知道!

她就遇到一个内存错误问题就弄了20多天

最好是他们公司的那个dll有错误!

哎。。。

他们公司又找那个led公司重新做dll

原来那个dll对C#支持不好!
[解决办法]


用图片传,就是显示效果不够好!

其它都没什么
[解决办法]
我用的也是这个动态库 本来也打算用C#去做 看来也要换了

可能真是对C#的支持性不好

用delphi做应该比较快 但是有个问题 如何把文本文件转换成图片???

我以前用过ListenDisplay.dll 的这个库做过 他提供了转换的接口 


哎 不知道这个怎么做 fenglei225做好了分享下 等待。。。。。

热点排行