调用dll的问题

问题描述

不知大家用过华为的信息机没有,就是在调用查询函数时,必须首先调用第一个函数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

时间: 2024-09-20 13:44:47

调用dll的问题的相关文章

在ASP文件中调用DLL

在ASP文件中调用DLL 动态联接库(DLL)是加快应用程序关键部分的执行速度的重要方法,但有一点恐怕大部分人都不知道,那就是在ASP文件也能通过调用DLL来加快服务器的执行速度,下面我简单的介绍一下在ASP文件调用DLL的步骤. 首先,必须得有DLL文件,本例是通过VB5.0创建ActiveX DLL文件,这个文件模拟了一个掷色子的过程. 在VB5.0的环境下,新建一个工程,并双击新建工程窗口中ActiveX DLL图标,VB将自动为项目添加一个类模块,并将该项目类型设置为ActiveX DL

在ASP文件调用DLL

动态联接库(DLL)是加快应用程序关键部分的执行速度的重要方法,但有一点恐怕大部分人都不知道,那就是在ASP文件也能通过调用DLL来加快服务器的执行速度,下面我简单的介绍一下在ASP文件调用DLL的步骤.    首先,必须得有DLL文件,本例是通过VB5.0创建ActiveX DLL文件,这个文件模拟了一个掷色子的过程.   在VB5.0的环境下,新建一个工程,并双击新建工程窗口中ActiveX DLL图标,VB将自动为项目添加一个类模块,并将该项目类型设置为ActiveX DLL.在属性窗口将

C#使用技巧--调用DLL

技巧 使用C#时不免用调用别的DLL,如WIN32的API和自己以前做的DLL, C#调用DLL很像VB,下面讨论的C#调用DLL的方式. 看看下面的例子,演示了怎么定义DLL函数接口 public class Utility {    [DllImport("kernel32", EntryPoint="CreateDirectory", CallingConvention=CallingConvention.StdCall]    public static e

java中如何调用DLL方法

前段时间项目需要使用调用DLL来控制POS机外设,如钱箱和小票打印机.顾客显示屏等,于是,我便开始了java调用DLL中的方法的探索,事实上,网上的例子还是很多的,一些外部包的例子也有很多,但每个人的实际情况都有所不同,尽管只是一个很简单的调用,也花了我不少时间,在这里分享一下我的经验吧. 我是通过一个外部的JAR包来间接来获得DLL文件的句柄 的,它就是jacob了,这是java com brige的简写,呵呵, 这个名称起得非常形象吧,我用的版本是jacob 1.9的,你可以到它的官方网站去

在C#中如何创建和调用DLL

一.写在前面 C# 语言是一种简单但功能强大的编程语言,用于编写企业应用程序. C# 语言从C和C++语言演化而来,在语句.表达式和运算符方面使用了许多C++ 功能. C# 语言在类型安全性.版本转换.事件和垃圾回收等方面进行了相当大的改进和创新. C# 语言提供对常用API 样式(如 .NET 框架.COM.自动化和 C 样式 API 等)的访问. 和大多数程序员一样,你一定使用过DLL.也一定曾感受到它的带给你程序设计和编码上的好处.我想和大家探讨一个主题:如何利用C#创建和调用DLL(动态

jna-使用JNA或者JNI调用dll的问题

问题描述 使用JNA或者JNI调用dll的问题 我有一个dll文件,是厂家给的二次开发SDK,当我使用JNI调用的时候出现如下提示: System.loadLibery("Basic"); 提示:Can't load this .dll (machine code=0x0) on a IA 32-bit platform 但是当我使用JNA调用的时候提示找不到模块 dll文件我已经放在了system32.bin.项目路径下,程序能找到dll文件的,但是调用的时候不能调用,请问什么情况啊

jna dll-java 用jna调用dll库问题

问题描述 java 用jna调用dll库问题 昨天接手一个新项目,是关于java调用dll的,用jna实现,在我本机上运行成功,今天换了台电脑,就出现了EXception in main thread java.lang.UnsatisfiedLinkError UNable to load library..........请问有谁知道原因啊?急. 解决方案 dll已经放到system32 下了,还是一样出错 解决方案二: 目测是需要加载的dll位置不对 你再看看啦 解决方案三: 使用JNA通

请教JNative 调用DLL的最佳方式

问题描述 最近做一个项目需要跟硬件打交道,而硬件开发商只提供了一个DLL对硬件进行操作,于是我就用JNative对DLL中定义的函数进行调用,目前已知的调用方法是JNative native = new JNative("DELL Name","methodName");其它的构造忽略,在这种情况下,已创建了一个JNative的实例,并且要调用的方法也已跟这个实例绑定了,也就是说这个native只能调用指定的methodName,要想调用DLL中其它方法,还得重新实

动态电用dll出错-动态调用Dll出错,服务模式

问题描述 动态调用Dll出错,服务模式 用MFC开发一个服务程序,服务程序在应用模式下,动态调用dll正常,然而变成服务模式,会导致服务停止.请问这是怎么回事,请大神指点. 解决方案 主要是你服务运行情况下,进程权限会变高,同时不能直接访问一些用户目录等.服务运行在SESSION0,这个可能会导致你的DLL处理有问题.你需要检查一下DLL的内部代码逻辑 解决方案二: http://www.cnblogs.com/duanshuiliu/archive/2012/07/05/2577402.htm

调用dll文件,本应该创建该文件,但是在指定文件夹中并未显示出该文件

问题描述 调用dll文件,本应该创建该文件,但是在指定文件夹中并未显示出该文件 string a= "D://nihao.docx"; Char[] result = new Char[1024]; int check; check = CPPDLL.createCombinationFile(a.ToCharArray()); //创建该文件,成功返回0,运行时返回0,但在指定目录下并未出现该文件 check = CPPDLL.writeCombinationFile(a.ToCha