以下是开发一款叫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 TypePrivate 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#中如何申明并实现此方法么?

解决方案 »

  1.   

    试试:
    [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);
      

  2.   

    调用时
    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;
    Int16 i=0;
        bool a = SCL_ShowString(this.Address, ref i, info);
       textInfo.Left=i;
       
      }
      

  3.   

    [DllImport(@"C:/WINDOWS/system32/SCL_API_stdcall.Dll", EntryPoint = "SCL_ShowString" ,CharSet = CharSet.Ansi)]
      public static extern bool SCL_ShowString(Int16 nDevID, ref Int16 info, [MarshalAs( UnmanagedType.LPStr)]string disinfo);不要:[MarshalAs( UnmanagedType.I2)]这句
      

  4.   

    BOOL SCL_ShowString(WORD nDevID,short *info, char *str);
    我觉得  *info 应该给的是一个 struct 的 第一个元素的unmanage的首地址,你说的方法是试了 还是不行
      

  5.   

    那试试:
    [DllImport(@"C:/WINDOWS/system32/SCL_API_stdcall.Dll", EntryPoint = "SCL_ShowString", CharSet = CharSet.Ansi)]
            public static extern bool SCL_ShowString(Int16 nDevID, [MarshalAs(UnmanagedType.LPArray)]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;
            }
      

  6.   

    无法封送处理“parameter #2”: 无效的托管/非托管类型组合(该值类型必须与 Struct 成对出现)。
      

  7.   

    [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,可以调通
      

  8.   

    10楼的写法我试了    不行  没有错误  就是返回false   调用不成功
      

  9.   

    刚又看了一下VB中的定义:
     Color As Long
    你把结构中的Color改成Int32试试
      

  10.   

    依然不行   晕倒   
    c的 实现是 这样的 
    struct TextOutInfo
    {
    WORD Left; // 区域左   , Left coordinate of the area.
    WORD Top; // 区域上   , Top  coordinate of the area.
    WORD Width; // 区域宽   , Width  of the area.
    WORD Height; // 区域高   , Height of the area.
    LONG Color; // 颜色     , Text color
    WORD ASCFont; // 英文字体 , Font index of ASCII charactors.
    WORD HZFont; // 中文字体 , Font index of Local language charactors.
    WORD XPos; // x坐标    , X coordinate for output text.
    WORD YPos; // y坐标    , Y coordinate for output text.
    };
    typedef struct TextOutInfo TEXTINFO;
    TEXTINFO    Info;
    char        S[1024];
    BOOL        bOK;
        if (bSCL2008) Info.Left = 4096-LEDWidth;
        else          Info.Left =  960-LEDWidth;
        Info.Top    =  0;
        Info.Width  = LEDWidth;
        Info.Height = LEDHeight;
        Info.Color  = 0x80FF;
        Info.ASCFont= 1;   // This Font index is related with the load order of the fonts.
        Info.HZFont = 2;   // This Font index is related with the load order of the fonts.
        Info.XPos   = 0;
        Info.YPos   = 0;
    SCL_ShowString(mDevID,(short*)&Info.Left,S);
      

  11.   

      这不是C#的问题!  是那个dll    你这个dll是用C++编的?    因为里面有指针,但C#里面都不用指针了    传过去的参数就不行了!    
      

  12.   

    封存的方法应该没问题,主要看参数的值有没有问题吧调用前检查一下 mDevID和 textInfo 是不是有问题,最好用VB可调用成功的例子去判断一下
      

  13.   

    恩  c#里有用到 unsafe   标记后可以当做 c来用  SCL_ShowString(this.Address, (short*)&textInfo.Left, info);
    哎。即使是完全按照c++里的方法写,也不行 、、 
      

  14.   

    this.Address类型是什么?具体数值是多少?是不是算术溢出了?
      

  15.   

    不会  仅仅是个LED编号而已  值是1
      

  16.   

    发送图片的话 我发送的是  txt文件  但是在现实网络环境中 实时通讯能力较差 不满足业务需求
      

  17.   

      对了  用图片可以实现!
        不过显示出来的东西,等不是太亮!      我女朋友做这,她知道!    她就遇到一个内存错误问题就弄了20多天  最好是他们公司的那个dll有错误!  哎       他们公司又找那个led公司重新做dll   原来那个dll对C#支持不好!
      

  18.   

    恩   我怀疑是他的DLL有问题  我在vb.net里面试了  还是返回false
      

  19.   

    现在我用的方法是用TXT传  能跑  但就是慢  是在是郁闷  切换播放列表要将近3秒钟   是在是不能忍受
      

  20.   

    我用的也是这个动态库 本来也打算用C#去做  看来也要换了可能真是对C#的支持性不好用delphi做应该比较快  但是有个问题  如何把文本文件转换成图片???  我以前用过ListenDisplay.dll 的这个库做过 他提供了转换的接口 
    哎 不知道这个怎么做 fenglei225做好了分享下  等待。。
      

  21.   

     ByRef TextInfo As Integer 这个参数封装有问题,使用InPtr类型
    以下是开发一款叫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);
      

  22.   

    volunteergg,在C#中如何定义BOOL SCL_ShowString(..)?我用C#写的  在网络初始化的时候总是成功,即使你没有连接设备,郁闷啊
      

  23.   

    如果没有返回Flase,请检查如下:
    1、使用ShowString(Par……)前请先使用NetInitial(Par……)初始化
    34楼:NetInitial(Par……)基本上是返回True;
    2、检查ShowString(Par……)参数或TextInfo的元素类型是否错误
    :我看了fenglei225的C#代码,他的TextInfo的元素类型定义错误(说明:用(Short *)强制转换无效)
    3、是否已经加载字库
    :注意配置Config.ly及字库文件
      

  24.   

    还有谁要用SCL2008做二次开发不?突然发现我可以做外包的,呵呵
      

  25.   

    你们好,我需要帮忙,我现在需要用vb.net写,发信息到scl2008显示器显示。请问可以给我vb完整的代码让我参考吗?谢谢
      

  26.   

    请问StringtoByte = j 有什么功用?我总是无法成功输出文字,是什么原因呢? If bOK Then
                bOK = SCL_ShowString(mDevID, TextInfo.Left_, S)
                If bOK = False Then MsgBox("ShowString failed")
            End If