楼主,这是MSDN上的例子: C++: void TestCallBack(FPTR pf, int value); void TestCallBack2(FPTR2 pf2, char* value);C#: public delegate bool FPtr( int value ); public delegate bool FPtr2( String value );public class LibWrap {// Declares managed prototypes for unmanaged functions. [ DllImport( "..\\LIB\\PinvokeLib.dll" )] public static extern void TestCallBack( FPtr cb, int value ); [ DllImport( "..\\LIB\\PinvokeLib.dll" )] public static extern void TestCallBack2( FPtr2 cb2, String value ); } public class App { public static void Main() { FPtr cb = new FPtr( App.DoSomething ); LibWrap.TestCallBack( cb, 99 ); FPtr2 cb2 = new FPtr2( App.DoSomething2 ); LibWrap.TestCallBack2( cb2, "abc" ); }
public static bool DoSomething( int value ) { Console.WriteLine( "\nCallback called with param: {0}", value ); … } public static bool DoSomething2( String value ) { Console.WriteLine( "\nCallback called with param: {0}", value ); … } }
单步调试一下看看程序有没有走这里;
2.看窗体是不是假死了,在
listBox1.Items.Add("端口"+port+": 来电号码 "+number);
后面加上this.Refresh();试试;
3.Setup_Tel(LDTCallBack CallBack, int y);你确定这个y指的是port?
public void MyCallBack(int port)
{
if (port == 0)
{
//设备有改变
}
else
{
string number;
number = LDT.GetNumber_Tel(port).ToString();
listBox1.Items.Add("端口"+port+": 来电号码 "+number);
}
}
这段代码就没进去,说明不是假死的原因吧
try
{
for (int i = 1; i <= LDT.DevCount_Tel(); i++)
{
if (LDT.Begin_Tel(i, '1') == 1)
{
ListviewItems("开启设备" + i.ToString() + "成功", Convert.ToString(DateTime.Now));
}
}
//设置回调
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect(); //LDTCallBack callback = new LDTCallBack(MyCallBack);
callback = new LDTCallBack(MyCallBack);
LDT.Setup_Tel(callback, 1);
}
catch (Exception ex)
{ } 这段代码你没有写
btnSetup_Click button1_Click这两个事件里边头写了这段代码,分两部而已。
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
少了这个
C++:
void TestCallBack(FPTR pf, int value);
void TestCallBack2(FPTR2 pf2, char* value);C#:
public delegate bool FPtr( int value );
public delegate bool FPtr2( String value );public class LibWrap
{// Declares managed prototypes for unmanaged functions.
[ DllImport( "..\\LIB\\PinvokeLib.dll" )]
public static extern void TestCallBack( FPtr cb, int value );
[ DllImport( "..\\LIB\\PinvokeLib.dll" )]
public static extern void TestCallBack2( FPtr2 cb2, String value );
}
public class App
{
public static void Main()
{
FPtr cb = new FPtr( App.DoSomething );
LibWrap.TestCallBack( cb, 99 );
FPtr2 cb2 = new FPtr2( App.DoSomething2 );
LibWrap.TestCallBack2( cb2, "abc" );
}
public static bool DoSomething( int value )
{
Console.WriteLine( "\nCallback called with param: {0}", value );
…
}
public static bool DoSomething2( String value )
{
Console.WriteLine( "\nCallback called with param: {0}", value );
…
}
}