[错误内容]
未处理的“System.NullReferenceException”类型的异常出现在 cmppAPI_test.exe 中。其他信息: 未将对象引用设置到对象的实例[部分代码][函数定义]
public class API_SubmitSMS
{
[DllImport("LongSms.dll",EntryPoint="Cmpp_submitSMS",SetLastError=true,CharSet=CharSet.Unicode,ExactSpelling=true,CallingConvention=CallingConvention.Cdecl)] 
public static extern int Cmpp_submitSMS
(
StringBuilder SMId,//1
StringBuilder Registered_Delivery ,//2
StringBuilder Msg_level ,//3
byte[] Service_Id ,//4
StringBuilder Fee_UserType ,//5
byte[] Fee_terminal_Id ,//6
StringBuilder Fee_terminal_type,//7
StringBuilder TP_udhi,//8
StringBuilder Msg_Fmt ,//9
byte[] Msg_src ,//10
byte[] FeeType ,//11
byte[] FeeCode ,//12
byte[] ValId_Time ,//13
byte[] At_Time ,//14
byte[] Src_Id ,//15
StringBuilder DestUsr_tl ,//16
byte[] Dest_terminal_Id ,//17
StringBuilder Dest_terminal_type,//18
StringBuilder Msg_Length ,//19
byte[] Msg_Content ,//20
StringBuilder LinkID,//21
StringBuilder Msg_Id,//22
ulong Result//23
);
}[调用]
//1
string s_SMID = "";
//byte[] s1 = System.Text.Encoding.Unicode.GetBytes(s_SMID);
System.Text.StringBuilder s1 = new System.Text.StringBuilder(s_SMID);
//4 是否要求返回状态确认报告:0:不需要;1:需要;2:产生SMC话单(该类型短信仅供网关计费使用,不发送给目的终端)
string s_Registered_Delivery = "";
//byte[] s2 = System.Text.Encoding.Unicode.GetBytes(s_Registered_Delivery);
System.Text.StringBuilder s2 = new System.Text.StringBuilder(s_Registered_Delivery);//5 信息优先级别
string s_Msg_level = "";
//byte[] s3 = System.Text.Encoding.Unicode.GetBytes(s_Msg_level);
System.Text.StringBuilder s3 = new System.Text.StringBuilder(s_Msg_level);//6 业务类型,是数字、字母和符号的组合。
string s_Service_Id = "";
byte[] s4 = System.Text.Encoding.Unicode.GetBytes(s_Service_Id);//7 计费用户类型字段,0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
string s_Fee_UserType = "";
//byte[] s5 = System.Text.Encoding.Unicode.GetBytes(s_Fee_UserType);
System.Text.StringBuilder s5 = new System.Text.StringBuilder(s_Fee_UserType);//8 被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_UserType字段,本字段与Fee_UserType字段互斥)
string s_Fee_terminal_Id = "";
byte[] s6 = System.Text.Encoding.Unicode.GetBytes(s_Fee_terminal_Id);//9 GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
string s_Fee_terminal_type = "";
//byte[] s7 = System.Text.Encoding.Unicode.GetBytes(s_Fee_terminal_type);
System.Text.StringBuilder s7 = new System.Text.StringBuilder(s_Fee_terminal_type);//10 GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
//发送超长短信应将该值置为1
string s_TP_udhi = "";
//byte[] s8 = System.Text.Encoding.Unicode.GetBytes(s_TP_udhi);
System.Text.StringBuilder s8 = new System.Text.StringBuilder(s_TP_udhi);//11 信息格式,0:ASCII串; 3:短信写卡操作;4:二进制信息;8:UCS2编码;15:含GB汉字  
string s_Msg_Fmt = "";
//byte[] s9 = System.Text.Encoding.Unicode.GetBytes(s_Msg_Fmt);
System.Text.StringBuilder s9 = new System.Text.StringBuilder(s_Msg_Fmt);//12 信息内容来源(SP_Id),sp的企业代码
string s_Msg_src = "";
byte[] s10 = System.Text.Encoding.Unicode.GetBytes(s_Msg_src);//13 资费类别,01:对“计费用户号码”免费;02:对“计费用户号码”按条计信息费;
//03:对“计费用户号码”按包月收取信息费;04:对“计费用户号码”的信息费封顶;
//05:对“计费用户号码”的收费是由SP实现
string s_FeeType = "";
byte[] s11 = System.Text.Encoding.Unicode.GetBytes(s_FeeType);//14 资费代码(以分为单位),如:“0050”代表人民币0.50元
string s_FeeCode = "";
byte[] s12 = System.Text.Encoding.Unicode.GetBytes(s_FeeCode);//15 存活有效期,格式遵循SMPP3.3协议
string s_ValId_Time = "";
byte[] s13 = System.Text.Encoding.Unicode.GetBytes(s_ValId_Time);//16 定时发送时间,格式遵循SMPP3.3协议。这个字段可以让短信在规定的时间内发送给手机用户。
//一般情况下不添,保留为空字符串
string s_At_Time = "";
byte[] s14 = System.Text.Encoding.Unicode.GetBytes(s_At_Time);//17 源号码,SP的服务代码或前缀为服务代码的长号码,
//网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,
//该号码最终在用户手机上显示为短消息的主叫号码
string s_Src_Id = "";
byte[] s15 = System.Text.Encoding.Unicode.GetBytes(s_Src_Id);//18,接收信息的用户数量(小于100个用户)
//通常为1,但长短信这如何添?
string s_DestUsr_tl = "";
//byte[] s16 = System.Text.Encoding.Unicode.GetBytes(s_DestUsr_tl);
System.Text.StringBuilder s16 = new System.Text.StringBuilder(s_DestUsr_tl);//19 接收短信的MSISDN号码,一个类似字符串数组的结构。受DestUsr_tl的约束,决定了本字段的长度。
//21*DestUsr_tl
string s_Dest_terminal_Id = "13912345678";
byte[] s17 = System.Text.Encoding.Unicode.GetBytes(s_Dest_terminal_Id);//20 只有在cmpp3.0里面使用
string s_Dest_terminal_type = "";
//byte[] s18 = System.Text.Encoding.Unicode.GetBytes(s_Dest_terminal_type);
System.Text.StringBuilder s18 = new System.Text.StringBuilder(s_Dest_terminal_type);//21 信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节)
string s_Msg_Length = "";
//byte[] s19 = System.Text.Encoding.Unicode.GetBytes(s_Msg_Length);
System.Text.StringBuilder s19 = new System.Text.StringBuilder(s_Msg_Length);//22 信息内容,一般情况下存在汉字传输,所以默认的编码/解码应该为Encoding.Default
string s_Msg_Content = "";
//byte[] s20 = System.Text.Encoding.GetEncoding(1252).GetBytes(s_Msg_Content);
byte[] s20 = System.Text.Encoding.Unicode.GetBytes(s_Msg_Content);//23 只有cmpp3.0里面使用
string s_LinkID = "";
//byte[] s21 = System.Text.Encoding.Unicode.GetBytes(s_LinkID);
System.Text.StringBuilder s21 = new System.Text.StringBuilder(s_LinkID);//24 输出参数,返回网关返回的ID
string s_Msg_Id = "";
//byte[] s22 = System.Text.Encoding.Unicode.GetBytes(s_Msg_Id);
System.Text.StringBuilder s22 = new System.Text.StringBuilder(s_Msg_Id);//25 0:不等待网关回应;1,等待网关回应后返回
ulong Result = 0;
//int submit = API_Class.API_SubmitSMS.Cmpp_submitSMS(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,Result); 请问为什么会出现
未将对象引用设置到对象的实例错误....?
达人快进来啊,在线等,急啊,求救//求救,,,,,,

解决方案 »

  1.   

    哦,提醒一下,StringBuilder原我给过初始化大小 255 但是还是报此错
      

  2.   

    是不是有些需要用ref修饰以下,太长了。没看完。
      

  3.   

    StringBuilder 传进去是要分配够足够空间现代你传进去的都是空
      

  4.   

    谢谢诸位
    我现在是用来传入的,用string 么?
    我先试试,不行再求教.,,.
      

  5.   

    如果改为string 如下:
    string s1 = "1"; //4 是否要求返回状态确认报告:0:不需要;1:需要;2:产生SMC话单(该类型短信仅供网关计费使用,不发送给目的终端)
    string s2 = "1"; //5 信息优先级别
    string s3 = "3"; //6 业务类型,是数字、字母和符号的组合。
    string s_Service_Id = "xx";
    byte[] s4 = System.Text.Encoding.Unicode.GetBytes(s_Service_Id); //7 计费用户类型字段,0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
    string s5 = "3"; //8 被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_UserType字段,本字段与Fee_UserType字段互斥)
    string s_Fee_terminal_Id = "0";
    byte[] s6 = System.Text.Encoding.Unicode.GetBytes(s_Fee_terminal_Id); //9 GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
    string s7 = "0"; //10 GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
    //发送超长短信应将该值置为1
    string s8 = "1"; //11 信息格式,0:ASCII串; 3:短信写卡操作;4:二进制信息;8:UCS2编码;15:含GB汉字  
    string s9 = "15"; //12 信息内容来源(SP_Id),sp的企业代码
    string s_Msg_src = "11";
    byte[] s10 = System.Text.Encoding.Unicode.GetBytes(s_Msg_src); //13 资费类别,01:对“计费用户号码”免费;02:对“计费用户号码”按条计信息费;
    //03:对“计费用户号码”按包月收取信息费;04:对“计费用户号码”的信息费封顶;
    //05:对“计费用户号码”的收费是由SP实现
    string s_FeeType = "03";
    byte[] s11 = System.Text.Encoding.Unicode.GetBytes(s_FeeType); //14 资费代码(以分为单位),如:“0050”代表人民币0.50元
    string s_FeeCode = "0050";
    byte[] s12 = System.Text.Encoding.Unicode.GetBytes(s_FeeCode); //15 存活有效期,格式遵循SMPP3.3协议
    string s_ValId_Time = "";
    byte[] s13 = System.Text.Encoding.Unicode.GetBytes(s_ValId_Time); //16 定时发送时间,格式遵循SMPP3.3协议。这个字段可以让短信在规定的时间内发送给手机用户。
    //一般情况下不添,保留为空字符串
    string s_At_Time = "";
    byte[] s14 = System.Text.Encoding.Unicode.GetBytes(s_At_Time); //17 源号码,SP的服务代码或前缀为服务代码的长号码,
    //网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,
    //该号码最终在用户手机上显示为短消息的主叫号码
    string s_Src_Id = "22";
    byte[] s15 = System.Text.Encoding.Unicode.GetBytes(s_Src_Id); //18,接收信息的用户数量(小于100个用户)
    string s16 = "1"; //19 接收短信的MSISDN号码,一个类似字符串数组的结构。受DestUsr_tl的约束,决定了本字段的长度。
    //21*DestUsr_tl
    string s_Dest_terminal_Id = "13912345678";
    byte[] s17 = System.Text.Encoding.Unicode.GetBytes(s_Dest_terminal_Id); //20 只有在cmpp3.0里面使用
    string s18 = ""; //21 信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节)
    //怎么添?
    string s19 = "140"; //22 信息内容,一般情况下存在汉字传输,所以默认的编码/解码应该为Encoding.Default
    string s_Msg_Content = "测试内容";
    // byte[] s20 = System.Text.Encoding.GetEncoding(1252).GetBytes(s_Msg_Content);
    byte[] s20 = System.Text.Encoding.Unicode.GetBytes(s_Msg_Content); //23 只有cmpp3.0里面使用
    string s21 = ""; //24 输出参数,返回网关返回的ID
    string s22 = ""; //25 0:不等待网关回应;1,等待网关回应后返回
    ulong Result = 0;
    未处理的“System.Runtime.InteropServices.SEHException”类型的异常出现在 cmppAPI_test.exe 中。又出现下错误:
    其他信息: 外部组件发生异常怎么回事 ,头发蒙了,救命哦...
      

  6.   

    Cmpp_submitSMS 
    【功能描述】
    向指定的地址发送短信(长短信),内部对内容进行编码处理,用户应按照协议的要求进行相应的处理。
    【调用条件】
    成功调用Init_connection。
    成功调用Login_ismg。
    【函数原型】
    int Cmpp_submitSMS
    (
    unsigned char SMId[8],
    unsigned char Registered_Delivery ,
    unsigned char Msg_level ,
    char* Service_Id ,
    unsigned char Fee_UserType ,
    char* Fee_terminal_Id ,
    unsigned char TP_udhi,
    unsigned char Msg_Fmt ,
    char* Msg_src ,
    char* FeeType ,
    char* FeeCode ,
    char* ValId_Time ,
    char* At_Time ,
    char* Src_Id ,
    unsigned char DestUsr_tl ,
    char* Dest_terminal_Id ,
    unsigned char Msg_Length ,
    char* Msg_Content ,
    unsigned char LinkID[20],
    unsigned char Msg_Id[8],
    unsigned long &Result
    );
    【参数说明】
    各参数和Cmpp_submit基本一致,不过此处对内容的长度不作限制可以超过70个汉字,内部使用Unicode编码,如果是多字节编码内部会转换成Unicode,用户如果传入的就是Unicode,请不要作网络字节顺序的转换,系统内部会作转换。
    【返回值】
    函数返回值定义参见附录。
      【使用说明】
    如果该函数执行的不成功,函数的返回值中定义了详细的出错原因,具体可参见返回值部分的定义。
      【example】
    unsigned long Reuslt = 0; rc = Cmpp_submitSMS
    (
    SMId,
    1 ,
    3,
    (char*)(LPCTSTR)m_Service_Id ,
    m_Fee_UserType ,
    (char*)(LPCTSTR)m_Fee_terminal_Id ,
    m_Udhi,
    m_Msg_Fmt ,
    (char*)(LPCTSTR)m_Msg_src ,
    (char*)(LPCTSTR)m_FeeType ,
    (char*)(LPCTSTR)m_FeeCode ,
    (char*)(LPCTSTR)m_ValId_Time ,
    (char*)(LPCTSTR)m_At_Time ,
    (char*)(LPCTSTR)m_Src_Id ,
    m_DestUsr_tl ,
    (char*)(LPCTSTR)m_Dest_terminal_Id ,
    m_Msg_Length ,
    (char*)(LPCTSTR)m_Msg_Content ,
    LinkID,
    Msg_Id,
    Result
    );
      

  7.   

    我自己认为主要是c#里面用什么类型去对应vc的dll中的类型没搞对,不知道怎么对应啊,没受过系统教育,真难找啊,达人能否帮忙给个对应代码...
      

  8.   

    最后一个long参数是传出来的,用ref Result
      

  9.   

    谢谢avoid!
    除了ref result,其他全部用string 么?
      

  10.   

    我先这样测试是否正确,为什么提示:
    其他信息: 外部组件发生异常
    int submit = API_Class.API_SubmitSMS.Cmpp_submitSMS("0","1","3","1",
    "3","13480812431","0","1",
    "15","969766","03","0050",
    "","","969766","1",
    "13912345678","0","140","你好",
    "","",ref Result); public static extern int Cmpp_submitSMS
    (
    string SMId,//1
    string Registered_Delivery ,//2
    string Msg_level ,//3
    string Service_Id ,//4
    string Fee_UserType ,//5
    string Fee_terminal_Id ,//6
    string Fee_terminal_type,//7
    string TP_udhi,//8
    string Msg_Fmt ,//9
    string Msg_src ,//10
    string FeeType ,//11
    string FeeCode ,//12
    string ValId_Time ,//13
    string At_Time ,//14
    string Src_Id ,//15
    string DestUsr_tl ,//16
    string Dest_terminal_Id ,//17
    string Dest_terminal_type,//18
    string Msg_Length ,//19
    string Msg_Content ,//20
    string LinkID,//21
    string Msg_Id,//22
    ref long Result//23
    );
      

  11.   

    1 ,
    3,
    问题应该在这里,他用ASCII码你把string Registered_Delivery ,//2
    string Msg_level ,//3
    改成int,直接输入1,3
      

  12.   

    外部组件出现异常说明你调用函数成功了,但参数的问题导致dll抛异常
      

  13.   

    TO Avoid,真的是太感激了,能否帮我改下这个代码,我实在是改不通了:
    //1
    string s1 = "0"; //4 是否要求返回状态确认报告:0:不需要;1:需要;2:产生SMC话单(该类型短信仅供网关计费使用,不发送给目的终端)
    string s2 = "1"; //5 信息优先级别
    string s3 = "3"; //6 业务类型,是数字、字母和符号的组合。
    string s4 = "xx"; //7 计费用户类型字段,0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
    string s5 = "3"; //8 被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_UserType字段,本字段与Fee_UserType字段互斥)
    string s6 = "13480812431"; //9 GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
    string s7 = ""; //10 GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
    //发送超长短信应将该值置为1
    string s8 = "1"; //11 信息格式,0:ASCII串; 3:短信写卡操作;4:二进制信息;8:UCS2编码;15:含GB汉字  
    string s9 = "15"; //12 信息内容来源(SP_Id),sp的企业代码
    string s10 = ""; //13 资费类别,01:对“计费用户号码”免费;02:对“计费用户号码”按条计信息费;
    //03:对“计费用户号码”按包月收取信息费;04:对“计费用户号码”的信息费封顶;
    //05:对“计费用户号码”的收费是由SP实现
    string s11 = "03"; //14 资费代码(以分为单位),如:“0050”代表人民币0.50元
    string s12 = "0050"; //15 存活有效期,格式遵循SMPP3.3协议
    //如何添?
    string s13 = ""; //16 定时发送时间,格式遵循SMPP3.3协议。这个字段可以让短信在规定的时间内发送给手机用户。
    //一般情况下不添,保留为空字符串
    string s14 = ""; //17 源号码,SP的服务代码或前缀为服务代码的长号码,
    //网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,
    //该号码最终在用户手机上显示为短消息的主叫号码
    string s15 = "969766"; //18,接收信息的用户数量(小于100个用户)
    //通常为1,但长短信这如何添?
    string s16 = "1"; //19 接收短信的MSISDN号码,一个类似字符串数组的结构。受DestUsr_tl的约束,决定了本字段的长度。
    //21*DestUsr_tl
    string s17 = "13912345678"; //20 只有在cmpp3.0里面使用
    string s18 = ""; //21 信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节)
    //怎么添?
    string s19 = ""; //22 信息内容,一般情况下存在汉字传输,所以默认的编码/解码应该为Encoding.Default
    string s20 = ""; //23 只有cmpp3.0里面使用
    string s21 = ""; //24 输出参数,返回网关返回的ID
    //如何添?
    string s22 = ""; //25 0:不等待网关回应;1,等待网关回应后返回
    long Result = 0;int submit = API_Class.API_SubmitSMS.Cmpp_submitSMS(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,ref Result); 
      

  14.   

    还有Result是个输入输出参数,使用0时不等待网关回应,使用1时等待网关回应后返回,
    是否用ref result 就可以了
      

  15.   

    你先不要用int submit = API_Class.API_SubmitSMS.Cmpp_submitSMS(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,ref Result); 先用具体的参数直接代如int submit = API_Class.API_SubmitSMS.Cmpp_submitSMS(s1,3,1,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,ref Result); 
    问题应该在unsigned char字段内容不匹配上