我正在Windows CE 6上编写一个C#应用程序来监视3G调制解调器。该应用程序将调用C DLL中的函数来访问调制解调器。
在启动时,C#应用程序将调用此函数以创建新连接:
EVENT_CALLBACK 的定义如下:
一个数据结构也被定义了:
在 C DLL 中,CreateDataConnection() 函数中传递了一个函数指针,用于更新调制解调器状态。
创建连接后,DLL将调用回调函数来更新调制解调器的状态,例如EC/IO(接收到的导频能量比)。
基本上,当ECIO更改时,将调用回调函数将ECIO数据传递给C#应用程序:
在C DLL中:
在 C# 应用程序中,回调函数的定义如下:
现在问题来了。程序启动时,一切正常,连接成功创建,EC/IO也在更新。但是运行几个小时后,EC/IO的更新停止了。经过测试,我发现当回调函数被调用时,更新就会停止。
我不知道这里出了什么问题。可能在C# DLL调用中传递函数指针的方式不正确,或者代码中隐藏着一些错误?
在启动时,C#应用程序将调用此函数以创建新连接:
[DllImport("swmodem.dll", CallingConvention = CallingConvention.Winapi)]
public static extern int CreateDataConnection(EVENT_CALLBACK callback);
EVENT_CALLBACK 的定义如下:
public delegate void EVENT_CALLBACK(int e, IntPtr data);
一个数据结构也被定义了:
[StructLayout(LayoutKind.Sequential)]
public struct ECIO_INFO
{
public UInt32 ecio1; /*!< Primary scramble code */
public UInt32 ecio2; /*!< Received signal code power */
public UInt32 ecio3; /*!< Energy per chip per power density */
}
在 C DLL 中,CreateDataConnection() 函数中传递了一个函数指针,用于更新调制解调器状态。
int CreateDataConnection(EVENT_CALLBACK ecb)
{
.
.
fEventCallback = ecb;
// Create a connection
.
.
}
创建连接后,DLL将调用回调函数来更新调制解调器的状态,例如EC/IO(接收到的导频能量比)。
基本上,当ECIO更改时,将调用回调函数将ECIO数据传递给C#应用程序:
在C DLL中:
void ProcessNotification(EVENT_CALLBACK fEventCallback)
{
ECIO_INFO ecio_info;
ecio_info.ecio1 = ecio_info.ecio2 = ecio_info.ecio3 = 0;
if(data.nNumOfCells>0)
ecio_info.ecio1 = data.arCellInfo[0].nEcIo;
if(data.nNumOfCells>1)
ecio_info.ecio2 = data.arCellInfo[1].nEcIo;
if(data.nNumOfCells>2)
ecio_info.ecio3 = data.arCellInfo[2].nEcIo;
if(data.nNumOfCells>0)
fEventCallback(ME_RSCP_ECIO, &ecio_info);
}
在 C# 应用程序中,回调函数的定义如下:
private void ModemEventCallback(int e, IntPtr data)
{
.
.
Modem.ECIO_INFO new_reinfo = new Modem.ECIO_INFO();
new_reinfo = (Modem.ECIO_INFO)Marshal.PtrToStructure(
data, typeof(Modem.ECIO_INFO));
.
.
}
现在问题来了。程序启动时,一切正常,连接成功创建,EC/IO也在更新。但是运行几个小时后,EC/IO的更新停止了。经过测试,我发现当回调函数被调用时,更新就会停止。
fEventCallback(ME_RSCP_ECIO, &ecio_info);
我不知道这里出了什么问题。可能在C# DLL调用中传递函数指针的方式不正确,或者代码中隐藏着一些错误?