我现在有一个用delphi写的带指针的dll 接口说明是这样的:
方法ReceiveSM
若ReceiveSMCounter接收短消息数返回值N大于1,则调用函数ReceiveSM(char * PMsgs) API接口。注意:分配的Buffer size=1067*N字节,该函数将返回N条MO消息的结构体内容。
参数名 IN/OUT 数据类型 描述
Msgs OUT *Pchar 接收短信内容,1067*N个字节大小,N为返回的消息条数每条短消息的结构定义(C语言)如下:
typedef  TShortMsg  struct
{
  ulong SM_ID ; //短消息的ID,4个字节长度的无符号整数
  char  DestAddr[21] ; //短消息的目的地址,应该是等同于InitConnection设ServiceNO
  char  OrgAddr[21]; //短消息的源地址
  uchar  Prior ; //短消息的优先级,1个字节长度的无符号整数
  char  TimeStamp[20] ; //短消息的下发时间
  char  Content[1000] ; //短消息的内容
}
因此一条短消息的长度为:4+21+21+1+20+1000=1067 字节
注意:需要分配一片足够大的内存区1067*N字节,该内存区由pMsgs指向首位置
然后我的C#代码里调用:
public static class MobileOpen
//接收短消息
[DllImport("MobileOpen.dll")]
public static extern int ReceiveSM([MarshalAs(UnmanagedType.LPStr)] StringBuilder PMsgs);
点接收按钮的时候调用ReceiveSM方法:
StringBuilder msgs = new StringBuilder("".PadLeft(1067 * res, '\0'), 1067 * res);
MobileOpen.ReceiveSM(msgs);
string shormsg = msgs.ToString();
MessageBox.Show("接收短信:" + shormsg);可以取到有收到短消息,但调用ReceiveSM取短消息内容的时候就取不到了,最后那句弹出来是空的哪位知道这个方法应该怎么调用啊 

解决方案 »

  1.   

    对于char指针,c#中用string类型就可以了
      

  2.   

    用string类型试过,调用ReceiveSM方法就报内存错误,char[]数组也试过,也报内存错误,就用StringBuilder不报错,但取出来是空的
      

  3.   

    PMsgs到底是什么,是结构体指针吗,如果是结构体指针,就传递 out TShortMsg实例
      

  4.   


    具体我也不太清楚PMsgs里到底是什么,按照说明的话应该是多个TShortMsg实例,但说明上给了一段C++的代码,传进去的是一个字符型指针char*
      

  5.   

    其实你的实现很接近了, 稍改装下就行, 参考下面这段代码:C#调用Delphi编译的DLL函数库返回大文本数据 

    http://www.csframework.com/archive/2/arc-2-20110324-1226.htm
    C/S框架网欢迎您!
      

  6.   

    char指针,c#接收用StringBuilder,而且要初始化大小StringBuilder sb = new StringBuilder(100);
      

  7.   

    试试这个呢public static extern int ReceiveSM([Out] StringBuilder PMsgs);
      

  8.   

    用我那个方法100%可行. 解决思路:在Delphi把结构体转换为带符号的字符串, C#接受后转换字符串为结构体, 用StringBuilder, 把容量设为10000试下.10000% 可行!我写的那个API可以获取整个Novell网络的对象信息, 何况你这点小数据?