问题描述
不知大家用过华为的信息机没有,就是在调用查询函数时,必须首先调用第一个函数QuerySentShortMessages,然后才能第二个函数GetNextSentShortMessage,因为第二个函数的调用,需要上一个函数返回值,但是第一个函数中QuerySentShortMessages返回hQuery是一个句柄,我怎么在第二个函数GetNextSentShortMessage引用呢,第二个函数中hQuery定义是int,而第一个函数定义int*所以我在调用第二个函数时出现了一个错误:“提供了一个不存在的对象句柄”这两个函数是这样定义的intQuerySentShortMessages(char*FromTime,char*ToTime,int*hQuery);intGetNextSentShortMessage(inthQuery,char*SourceAddr,char*DestAddr,char*Content,ul*ContentLen,char*MsgID,char*SendTime,char*SentTime,byte*MsgStatus,byte*RecvStatus,byte*TryTimes,char*RecvTime);这是vb给的例子函数声明:PublicDeclareFunctionQuerySentShortMessagesLib"SMEntry.dll"(ByValFromTimeAsString,ByValToTimeAsString,ByRefhQueryAsInteger)AsLongPublicDeclareFunctionGetNextSentShortMessageLib"SMEntry.dll"(ByValhQueryAsLong,ByValSourceAddrAsString,ByValDestAddrAsString,ByValContentAsString,ByRefContentLenAsLong,ByValMsgIDAsString,ByValSendTimeAsString,ByValSentTimeAsString,ByRefMsgStatusAsByte,ByRefRecvStatusAsByte,ByRefTryTimesAsByte,ByValRecvTimeAsString)AsLong调用代码:PrivateSubQueryButton_Click()DimItemAsMSComctlLib.ListItemDimhQueryAsLongDimQueryRetAsLongDimRetAsLongDimSourceAddrAsStringDimDestAddrAsStringDimContentAsStringDimContentLenAsLongDimMsgIDAsStringDimSendTimeAsStringDimSentTimeAsStringDimMsgStatusAsByteDimRecvStatusAsByteDimTryTimesAsByteDimRecvTimeAsStringQueryRetGrid.ListItems.ClearQueryRet=QuerySentShortMessages(FromTimeText.Text,ToTimeText.Text,hQuery)IfQueryRet<>0ThenMsgBox"查询已发送短信失败!RetCode="&QueryRetElseOnErrorGoToQuery_ErrorRet=0WhileRet=0SourceAddr=Replace(Space(21),"",Chr(0))DestAddr=Replace(Space(36),"",Chr(0))Content=Replace(Space(1600),"",Chr(0))MsgID=Replace(Space(22),"",Chr(0))SendTime=Replace(Space(19),"",Chr(0))SentTime=Replace(Space(19),"",Chr(0))RecvTime=Replace(Space(19),"",Chr(0))ContentLen=1600Ret=GetNextSentShortMessage(hQuery,SourceAddr,DestAddr,Content,ContentLen,MsgID,SendTime,SentTime,MsgStatus,RecvStatus,TryTimes,RecvTime)IfRet=0ThenSetItem=QueryRetGrid.ListItems.AddItem.Text=SourceAddr'Item.ListSubItems.Add.Text=SourceAddrItem.ListSubItems.Add.Text=DestAddrItem.ListSubItems.Add.Text=ContentItem.ListSubItems.Add.Text=MsgIDItem.ListSubItems.Add.Text=SendTimeItem.ListSubItems.Add.Text=SentTimeItem.ListSubItems.Add.Text=MsgStatusItem.ListSubItems.Add.Text=RecvStatusItem.ListSubItems.Add.Text=TryTimesItem.ListSubItems.Add.Text=RecvTimeEndIfWendGoToNormal_EntryQuery_Error:MsgBox"查询已发送短信时出现异常!异常描述:"&Err.DescriptionNormal_Entry:CloseObjecthQueryEndIfEndSub这是我的c#代码以及出现错误,请大家帮忙解决[DllImport("SMEntry.dll")]publicstaticexternintQuerySentShortMessages([MarshalAs(UnmanagedType.LPStr)]stringFromTime,[MarshalAs(UnmanagedType.LPStr)]stringToTime,outIntPtrhQuery);[DllImport("SMEntry.dll")]publicstaticexternintGetNextSentShortMessage(outIntPtrhQuery,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSourceAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderDestAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderContent,intContentLen,[MarshalAs(UnmanagedType.LPStr)]StringBuilderMsgID,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSendTime,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSentTime,refbyteMsgStatus,refbyteRecvStatus,refbyteTryTimes,[MarshalAs(UnmanagedType.LPStr)]StringBuilderRecvTime);//查询intRet1;intQueryRet;IntPtrhQuery;intRet;byteMsgStatus=0;byteRecvStatus=0;byteTryTimes=0;intContentLen;Ret1=SP_Startup((TextBox1.Text),TextBox2.Text,TextBox3.Text);QueryRet=QuerySentShortMessages((FromTimeText.Text.Trim()),(ToTimeText.Text.Trim()),outhQuery);if(QueryRet!=0){Response.Write("查询已发送短信失败!RetCode="+QueryRet);}else{Ret=0;while(Ret==0){StringBuilderSourceAddr=newStringBuilder(22);StringBuilderDestAddr=newStringBuilder(36);StringBuilderContent=newStringBuilder(1600);StringBuilderMsgID=newStringBuilder(22);StringBuilderSendTime=newStringBuilder(19);StringBuilderSentTime=newStringBuilder(19);StringBuilderRecvTime=newStringBuilder(19);ContentLen=1600;Ret=GetNextSentShortMessage(outhQuery,SourceAddr,DestAddr,Content,ContentLen,MsgID,SendTime,SentTime,refMsgStatus,refRecvStatus,refTryTimes,RecvTime);if(Ret==0){Ret出现错误-1009,提供了一个不存在的对象句柄,请大家帮忙,谢谢大家了//}}}SP_Cleanup();
解决方案
解决方案二:
SF
解决方案三:
大家帮忙呀
解决方案四:
[DllImport("SMEntry.dll")]publicstaticexternintQuerySentShortMessages([MarshalAs(UnmanagedType.LPStr)]stringFromTime,[MarshalAs(UnmanagedType.LPStr)]stringToTime,refinthQuery);[DllImport("SMEntry.dll")]publicstaticexternintGetNextSentShortMessage(refinthQuery,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSourceAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderDestAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderContent,intContentLen,[MarshalAs(UnmanagedType.LPStr)]StringBuilderMsgID,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSendTime,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSentTime,refbyteMsgStatus,refbyteRecvStatus,refbyteTryTimes,[MarshalAs(UnmanagedType.LPStr)]StringBuilderRecvTime);这个问题好熟悉..
解决方案五:
谢谢,请问我调用的时候,定义hQuery什么类型,怎么调用呢
解决方案六:
[DllImport("SMEntry.dll")]publicstaticexternintQuerySentShortMessages([MarshalAs(UnmanagedType.LPStr)]stringFromTime,[MarshalAs(UnmanagedType.LPStr)]stringToTime,refinthQuery);[DllImport("SMEntry.dll")]publicstaticexternintGetNextSentShortMessage(refinthQuery,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSourceAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderDestAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderContent,intContentLen,[MarshalAs(UnmanagedType.LPStr)]StringBuilderMsgID,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSendTime,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSentTime,refbyteMsgStatus,refbyteRecvStatus,refbyteTryTimes,[MarshalAs(UnmanagedType.LPStr)]StringBuilderRecvTime);//查询intRet1;intQueryRet;inthQuery;intRet;byteMsgStatus=0;byteRecvStatus=0;byteTryTimes=0;intContentLen;Ret1=SP_Startup((TextBox1.Text),TextBox2.Text,TextBox3.Text);QueryRet=QuerySentShortMessages((FromTimeText.Text.Trim()),(ToTimeText.Text.Trim()),refhQuery);if(QueryRet!=0){Response.Write("查询已发送短信失败!RetCode="+QueryRet);}else{Ret=0;while(Ret==0){StringBuilderSourceAddr=newStringBuilder(22);StringBuilderDestAddr=newStringBuilder(36);StringBuilderContent=newStringBuilder(1600);StringBuilderMsgID=newStringBuilder(22);StringBuilderSendTime=newStringBuilder(19);StringBuilderSentTime=newStringBuilder(19);StringBuilderRecvTime=newStringBuilder(19);ContentLen=1600;Ret=GetNextSentShortMessage(refhQuery,SourceAddr,DestAddr,Content,ContentLen,MsgID,SendTime,SentTime,refMsgStatus,refRecvStatus,refTryTimes,RecvTime);if(Ret==0){Ret出现错误-1009,提供了一个不存在的对象句柄,请大家帮忙,谢谢大家了//}}}SP_Cleanup();先看看int类型的如果int类型不可以的话只能用IntPtr了
解决方案七:
先看看int类型的如果int类型不可以的话只能用IntPtr了
解决方案八:
看不明白!
解决方案九:
这是我修改后代码,编译没有问题,运行时,出现未将对象引用设置到对象的实例,就是这句Ret=GetNextSentShortMessage(hQuery,SourceAddr,DestAddr,Content,ContentLen,MsgID,SendTime,SentTime,refMsgStatus,refRecvStatus,refTryTimes,RecvTime);大家看看下面代码,是我定义有问题吗//***c#代码[DllImport("SMEntry.dll")]publicstaticexternintQuerySentShortMessages([MarshalAs(UnmanagedType.LPStr)]stringFromTime,[MarshalAs(UnmanagedType.LPStr)]stringToTime,refinthQuery);[DllImport("SMEntry.dll")]publicstaticexternintGetNextSentShortMessage(inthQuery,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSourceAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderDestAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderContent,intContentLen,[MarshalAs(UnmanagedType.LPStr)]StringBuilderMsgID,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSendTime,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSentTime,refbyteMsgStatus,refbyteRecvStatus,refbyteTryTimes,[MarshalAs(UnmanagedType.LPStr)]StringBuilderRecvTime);//查询intRet1;intQueryRet;inthQuery=0;intRet;byteMsgStatus=0;byteRecvStatus=0;byteTryTimes=0;intContentLen;Ret1=SP_Startup((TextBox1.Text),TextBox2.Text,TextBox3.Text);QueryRet=QuerySentShortMessages((FromTimeText.Text.Trim()),(ToTimeText.Text.Trim()),refhQuery);if(QueryRet!=0){Response.Write("查询已发送短信失败!RetCode="+QueryRet);}else{Ret=0;while(Ret==0){//SourceAddr=Space(21).Replace("",'');//DestAddr=Space(36).Replace("",'');//SourceAddr=.Replace(Microsoft.VisualBasic..Strings.Space(21),"",Microsoft.VisualBasic.Strings.Chr(0).ToString(),1,-1,Microsoft.VisualBasic.CompareMethod.Text);//DestAddr=Microsoft.VisualBasic.Strings.Replace(Microsoft.VisualBasic.Strings.Space(36),"",Microsoft.VisualBasic.Strings.Chr(0).ToString(),1,-1,Microsoft.VisualBasic.CompareMethod.Text);StringBuilderSourceAddr=newStringBuilder(22);StringBuilderDestAddr=newStringBuilder(36);StringBuilderContent=newStringBuilder(1600);StringBuilderMsgID=newStringBuilder(22);StringBuilderSendTime=newStringBuilder(19);StringBuilderSentTime=newStringBuilder(19);StringBuilderRecvTime=newStringBuilder(19);ContentLen=1600;Ret=GetNextSentShortMessage(hQuery,SourceAddr,DestAddr,Content,ContentLen,MsgID,SendTime,SentTime,refMsgStatus,refRecvStatus,refTryTimes,RecvTime);if(Ret==0){//}}}SP_Cleanup();}v
解决方案十:
[DllImport("SMEntry.dll")]publicstaticexternintGetNextSentShortMessage(refinthQuery,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSourceAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderDestAddr,[MarshalAs(UnmanagedType.LPStr)]StringBuilderContent,intContentLen,[MarshalAs(UnmanagedType.LPStr)]StringBuilderMsgID,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSendTime,[MarshalAs(UnmanagedType.LPStr)]StringBuilderSentTime,refbyteMsgStatus,refbyteRecvStatus,refbyteTryTimes,[MarshalAs(UnmanagedType.LPStr)]StringBuilderRecvTime);看看!
解决方案十一:
现在是出现执行这句以后,返回Ret=-1009,Ret出现错误-1009,提供了一个不存在的对象句柄Ret=GetNextSentShortMessage(refhQuery,SourceAddr,DestAddr,Content,ContentLen,MsgID,SendTime,SentTime,refMsgStatus,refRecvStatus,refTryTimes,RecvTime);
解决方案十二:
11