在C#中调用一个用C写的DLL(负责接收网关短信), 里面有一个函数的原型定义如下:int WINAPI GetDeliver(ULONG* sm_ID, unsigned char* DestTON, char* DestAddr, char* UserData, ...);参数太多,不一一列举,主要有UNLONG* ,unsigned char* ,char* 这几个数据类型,其中DestAddr是用来接收11位手机号码,UserData则是收到的短信内容..用Dllimport包装了DLL后重新写一遍该函数的定义,如下:public static extern int GetDeliver(out uint sm_ID, out byte DestTON, out char DestAddr, out string UserData, ...);之中的数据类型我用了uint代替ULONG*,用byte代替unsigned char* ,问题在于“char*”我无论用long或char或是string都不能正常接收,不知道到底该用什么样的数据类型才合适???请各路大虾慷慨襄助!也欢迎讨论!先谢谢啦~~~

解决方案 »

  1.   

    have a try!char* DestAddr: [Out] StringBuilder DestAddr
      

  2.   

    unsigned char* DestTON, char* DestAddr,
    对应的是字符还是字符数组,如果是字符数组,我喜欢这么写Byte[] DestTON, Char[] DestAddr,...
      

  3.   

    to StringBuilder也试过了,不行你的参数到底是传进,还是传出。一般来说StringBuilder就足够了。不过你可以用如下试试
    char*:[MarshalAs(UnmanagedType.LPTStr)] string如果是out参数的话,可以用
    char*:[Out,MarshalAs(UnmanagedType.LPTStr)] string
      

  4.   

    好,我试试,另外有朋友说,
    ---------------
    ULONG*应该是unsigned long *
    char *也是一样的问题
    指针和值怎么能混为一谈呢?
    如果你用C#应该用IntPtr
    ---------------这个说法对吗,是不是一定要用指针?
      

  5.   

    定义用[Out,MarshalAs(UnmanagedType.LPTStr)] string实参怎么定义,一样用[Out,MarshalAs(UnmanagedType.LPTStr)] string,还是string就可以了?
      

  6.   

    参数DestAddr接收返回地址的缓冲区,参数UserData是接收返回正文的缓冲区
      

  7.   

    to 实参怎么定义,一样用[Out,MarshalAs(UnmanagedType.LPTStr)] string,还是string就可以了?用string就行了
      

  8.   

    to 
    ---------------
    ULONG*应该是unsigned long *
    char *也是一样的问题
    指针和值怎么能混为一谈呢?
    如果你用C#应该用IntPtr
    ---------------
    这个说法对吗,是不是一定要用指针?这个要看函数中如何用的,根据函数的不同,有时候处理的手法也不同。
      

  9.   

    char* 用 [out,MarshalAs(UnmanagedType.LPTStr)] string 来替换也不行...用string来对应char*时,其他参数(ULONG*,byte)都获得了值,唯独string参数是null
      

  10.   

    在API的调用举例中,这样写法:char sUserData[MAX_UD_LEN];
    memset(sUserData, 0, MAX_UD_LEN);...i = GetDeliver(...sUserData...)
      

  11.   

    [DllImport("...",CharSet=CharSet.Ansi)]
    int GetDeliver(ref System.UInt32 sm_ID,
                   StringBuilder DestTON,
                   StringBuilder DestAddr,
                   StringBuilder UserData,
                   ...
                  );
      

  12.   

    to char* 用 [out,MarshalAs(UnmanagedType.LPTStr)] string 来替换也不行...这就怪了,照理说,[Out]StringBuilder就已经足够了,你可以参看
    http://community.csdn.net/Expert/TopicView3.asp?id=4799900即用IntPtr来替换char*,然后用Marshal.PtrToStringAnsi来读出string。
      

  13.   

    Knight94(愚翁)你的邮箱是多少,我把代码发给你
      

  14.   

    public static extern int GetDeliver(out uint sm_ID, out byte DestTON, StringBuilder DestAddr, StringBuilder UserData, ...);实参要分配好适当空间,如StringBuilder  Userdata = new StringBuilder(141);