在c#中调用DELPH编写的DLL的函数时,老是出现未将对象引用到实例的错误:
delphi编写的dll中函数声明:function DeliverfromEsm(var Smtype, Content,Caller:pchar):integer;
我在c#中声明:
[DllImport("EsmApi.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]
static extern int DeliverfromEsm(ref string smtype,ref string content,ref string caller);
调用:
string smtype="";
string content="";
string caller="";
int reportval=DeliverfromEsm( ref smtype,ref content,ref caller);
出现未将对象引用到实例的错误,请问我该如何正确调用?
delphi编写的dll中函数声明:function DeliverfromEsm(var Smtype, Content,Caller:pchar):integer;
我在c#中声明:
[DllImport("EsmApi.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]
static extern int DeliverfromEsm(ref string smtype,ref string content,ref string caller);
调用:
string smtype="";
string content="";
string caller="";
int reportval=DeliverfromEsm( ref smtype,ref content,ref caller);
出现未将对象引用到实例的错误,请问我该如何正确调用?
解决方案 »
- (紧急求助)WPF中DataGrid,Header和列的数据分离时,怎么实现数据绑定?
- 单步执行结果输出正确,但执行的时候没结果输出。
- win7装VS2005
- 关于海天人系统的页面跳转问题(看似简单.)研究过海天人系统的进!
- C#2.0连接sql server2000怪事!
- 高手来看看,调用dll之后,程序退出是总报错:1.引用的内存地址不能为“read”;2.runtime error 216 at xxxx
- 文本框中的值为什么和页面源代码中的值不一致
- 问一个初级者的问题:我该学vc.net还是要学C#?
- 请问接口和纯虚的真实功能区别:)
- 关于MDI窗体的一个问题
- c# 怎样才能实现 像QQ那样的 自动的信息提示 框! 求助! 谢谢!
- C# 中做安装项目时碰到的问题
library Project2;
function DeliverfromEsm(var Smtype, Content,Caller:pchar):integer;stdcall; begin
Smtype:='Smtype' ;
Content:='Content' ;
Caller:='Caller' ;
result:=0;
end;
exports
DeliverfromEsm;
begin
end.[DllImport("EsmApi.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern int DeliverfromEsm(ref string smtype, ref string content, ref string caller);
private void button1_Click(object sender, EventArgs e)
{
string smtype = "";
string content = "";
string caller = ""; int i=DeliverfromEsm(ref smtype, ref content, ref caller); }
前边加public,这么改不行
我试过你的方法,虽然这样调用可以,但delphi提供的dll,是别人提供的,我不知怎么实现这个函数的,content参数是个地址,可能指向字符串,也可能指向一个结构。
System.NullReferenceException: 未将对象引用设置到对象的实例。
at UMSClient.Form1.DeliverfromEsm(String& Smtype, String& Content, String& Caller)
[DllImport("EsmApi.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]
static extern int DeliverfromEsm(string smtype, string content, string caller);
调用:
string smtype="";
string content="";
string caller="";
int reportval=DeliverfromEsm( smtype,content,caller);
调用正常,但几个参数没有值。为什么ref报错呢
delphi编写的dll中函数声明:function DeliverfromEsm(var Smtype, Content,Caller:pchar):integer;
我在c#中怎么调用呢?
static extern int DeliverfromEsm( StringBuilder smtype,StringBuildercontent,StringBuilder caller);
调用:
StringBuilder smtype= new StringBuilder(256);//Init buffer
StringBuilder content= new StringBuilder(256);//Init buffer
StringBuilder caller= new StringBuilder(256);//Init buffer
int reportval=DeliverfromEsm( smtype,content,caller);
谢谢,这样不报错,3个参数也取到值了,但取到的值后两个是乱码,第一个也不是想要的结果。
我要做的东西是,根据联通提供的企信通开发接口,调用他们提供的用delphi做的dll发送短信,dll只有文档说明,没有具体调用示例代码。联通的人只会说别人可以正常调用,别的什么也不知道。
[DllImport("EsmApi.dll",CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]
static extern int DeliverfromEsm( StringBuilder smtype,StringBuildercontent,StringBuilder caller);
Content表示返回的状态报告Report结构:
DWORD TaskID; //客户端序列号 TaskID
DWORD MsgID; //客户端序列号 MsgID
char UserNumber[22]; //接收手机号
unsigned char state; //状态
unsigned char ErrCode; //错误代码我该怎么声明和调用呢?content用StringBuilder类型,是状态报告的时候,收到是乱码。定义一个结构体,用这个类型的时候,接收状态报告时,出错。
static extern int DeliverfromEsm( StringBuilder smtype,StringBuilder content,StringBuilder caller);
CharSet 不管用什么值,用下边的方法,content都是2个字节啊。
byte[] bytecontent=Encoding.Unicode.GetBytes(content.ToString());
bytecontent.Length.ToString()怎么回事呢?
===
试试IntPtr content
使用Marshal.StructureToPtr()和Marshal.StringToBSTR()方法调用
问题差不多解决了,我再测试测试。很快就结贴
虽然能正常调用了
但初始化总返回-1
郁闷那API说明又狂简单