高手帮帮我啊,救命啊,我都想了一个星期了,没有多少分了,全给了。。。

yao991118 2006-10-21 09:04:32
这是厂家给的DLL文件说明:(是C++的)
VC++:
// 短消息参数结构,编码/解码共用
// 其中,字符串以0结尾
typedef struct {
char SCA[16];// 短消息服务中心号码(SMSC地址)
char TPA[16];// 目标号码或回复号码(TP-DA或TP-RA)
char TP_PID;// 用户信息协议标识(TP-PID)
char TP_DCS;// 用户信息编码方式(TP-DCS)
char TP_SCTS[16];// 服务时间戳字符串(TP_SCTS), 接收时用到
char TP_UD[161];// 原始用户信息(编码前或解码后的TP-UD)
char index;// 短消息序号,在读取时用到
} SM_PARAM;
//接收所有未读新短消息
// sm_param_temp:返回的短消息数组指针
int ReceiveAllMessage(SM_PARAM *sm_param_temp)
C++中调用的程序:
void CSmsExampleDlg::OnReceiveButton()
{
UpdateData(TRUE);
CListCtrl* pListCtrl=(CListCtrl*)GetDlgItem(IDC_LIST1);
SetCursor(LoadCursor(NULL,IDC_WAIT));
pListCtrl->DeleteAllItems();
SM_PARAM *sm_param_temp=new SM_PARAM[30];
int temp=ReceiveAllMessage(sm_param_temp);
int i=0;
while(i<temp)
{
pListCtrl->InsertItem(LVIF_TEXT|LVIF_STATE,i,sm_param_temp->TPA,(i%2)==0?LVIS_SELECTED:0,LVIS_SELECTED,0,0);
pListCtrl->SetItemText(i,1, InvertTime(sm_param_temp->TP_SCTS));
pListCtrl->SetItemText(i,2, sm_param_temp->TP_UD);
sm_param_temp++;
i++;
}
SetCursor(LoadCursor(NULL,IDC_ARROW));
UpdateData(FALSE);
}
我用C#写的结构体是:
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
public struct SM_PARAM
{
public string SCA; // 短消息服务中心号码(SMSC地址)
public string TPA; // 目标号码或回复号码(TP-DA或TP-RA)
public string TP_PID; // 用户信息协议标识(TP-PID)
public string TP_DCS; // 用户信息编码方式(TP-DCS)
public string TP_SCTS;// 服务时间戳字符串(TP_SCTS), 接收时用到
public string TP_UD; // 原始用户信息(编码前或解码后的TP-UD)
public string index; // 短消息序号,在读取时用到
}
DLL文件函数调用:
[DllImport("smspdu.dll")]
public static extern int ReceiveAllMessage(ref SM_PARAM sm_param_temp);
ICollection CreateDataSource()
{
SM_PARAM[] sm_param_temp=new SM_PARAM[30];
int temp=CmonDem.ReceiveAllMessage(ref sm_param_temp);
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("发送方号码",typeof(string)));
dt.Columns.Add(new DataColumn("发送时间",typeof(string)));
dt.Columns.Add(new DataColumn("发送内容",typeof(string)));
for (int i=0;i<temp;i++)
{
dr = dt.NewRow();
dr[0]=sm_param_temp[i].TPA;
dr[1]=sm_param_temp[i].TP_SCTS;
dr[2]=sm_param_temp[i].TP_UD;
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}
private void btnShowPart_Click(object sender, System.EventArgs e)
{
SM_PARAM[] sm_param_temp=new SM_PARAM[30];
int temp=CmonDem.ReceiveAllMessage(ref sm_param_temp);
if(temp>0)
{
dgInfo.DataSource=CreateDataSource();
}
}
我做的就是读不出结构体SM_PARAM中的变量的值,希望各位能帮我,谢谢!
...全文
131 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yao991118 2006-10-21
  • 打赏
  • 举报
回复
Nara(千里之外):
你的意思是在结构体中申明变量的时候像这样吗?
public byte[] SCA;// 短消息服务中心号码(SMSC地址)
public byte[] TPA;// 目标号码或回复号码(TP-DA或TP-RA)
public byte[] TP_PID;// 用户信息协议标识(TP-PID)
public byte[] TP_DCS;// 用户信息编码方式(TP-DCS)
public byte[] TP_SCTS;// 服务时间戳字符串(TP_SCTS), 接收时用到
public byte[] TP_UD;// 原始用户信息(编码前或解码后的TP-UD)
public byte[] index;// 短消息序号,在读取时用到

那么我实例化的时候该怎么写啊?
Nara 2006-10-21
  • 打赏
  • 举报
回复
你试试不要用string,用byte[]来接,然后Convert
DalyQiao 2006-10-21
  • 打赏
  • 举报
回复
会不会是字符串的问题,不明白,帮你顶
yao991118 2006-10-21
  • 打赏
  • 举报
回复
我取一个值,取出来也是空的,我就是不知道是结构体出错,还是DLL函数里的参数错了
荣耀钢铁侠 2006-10-21
  • 打赏
  • 举报
回复
先不要写完整修程序,只取一个值做测试,找到问题的根源
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-21 09:04
社区公告

让您成为最强悍的C#开发者