以下是开发一款叫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#中如何申明并实现此方法么?
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#中如何申明并实现此方法么?
[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);
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;
}
public static extern bool SCL_ShowString(Int16 nDevID, ref Int16 info, [MarshalAs( UnmanagedType.LPStr)]string disinfo);不要:[MarshalAs( UnmanagedType.I2)]这句
我觉得 *info 应该给的是一个 struct 的 第一个元素的unmanage的首地址,你说的方法是试了 还是不行
[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;
}
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,可以调通
Color As Long
你把结构中的Color改成Int32试试
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);
哎。即使是完全按照c++里的方法写,也不行 、、
不过显示出来的东西,等不是太亮! 我女朋友做这,她知道! 她就遇到一个内存错误问题就弄了20多天 最好是他们公司的那个dll有错误! 哎 他们公司又找那个led公司重新做dll 原来那个dll对C#支持不好!
哎 不知道这个怎么做 fenglei225做好了分享下 等待。。
以下是开发一款叫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);
1、使用ShowString(Par……)前请先使用NetInitial(Par……)初始化
34楼:NetInitial(Par……)基本上是返回True;
2、检查ShowString(Par……)参数或TextInfo的元素类型是否错误
:我看了fenglei225的C#代码,他的TextInfo的元素类型定义错误(说明:用(Short *)强制转换无效)
3、是否已经加载字库
:注意配置Config.ly及字库文件
bOK = SCL_ShowString(mDevID, TextInfo.Left_, S)
If bOK = False Then MsgBox("ShowString failed")
End If