struct TTYDogInfo
{
  int   ProductID;
  float VersionID;  
  int   UserNumber;
  float MakeDate;
  int   Validate;
//char CorpName[256];
//char Re[256];
//char ProductCode[256];
//char RFID[256];
  char* CorpName;  //专用
  char* Re;  //备注
  char* ProductCode;    //SCADS SCADP
  char* RFID;
  int RegisterState;
  DWORD Hid1;
  DWORD Hid2;
//char HostID[256];
  char* HostID;
};
extern "C" __declspec(dllexport) long GetTYDogInfo(TTYDogInfo *dogInfo, int productCode, int softType)
{
dogInfo->ProductID = productCode;
dogInfo->Hid1 = softType;
dogInfo->CorpName = "企业名称";
dogInfo->Re = "Re";
dogInfo->ProductCode = "Product";
dogInfo->RFID = "RFID";
dogInfo->HostID = "HostID";
return 0;
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
//CDTMainFun dtmf;
//return dtmf.DLLInit(isAuthor,lpProductID,lpSoftName,lpAppString,lpCorpGUID);
}

解决方案 »

  1.   

    补充下:C中是基于GB2312编码的,.NET中是UTF-8的,CORPNAME和REMARK中可能有汉字。
      

  2.   

       public int GetTYDogInfo(ref TTYDogInfo dogInfo, int productCode, int softType)
            {
                dogInfo.ProductID = productCode;
                dogInfo.Hid1 = softType;
                dogInfo.CorpName = System.Text.Encoding.Default.GetBytes("企业名称");
                dogInfo.Re = System.Text.Encoding.Default.GetBytes("Re");
                dogInfo.ProductCode = System.Text.Encoding.Default.GetBytes("Product");
                dogInfo.RFID = System.Text.Encoding.Default.GetBytes("RFID");
                dogInfo.HostID = System.Text.Encoding.Default.GetBytes("HostID");
                return 0;
            }        public struct TTYDogInfo
            {
                public int ProductID;
                public float VersionID;
                public int UserNumber;
                public float MakeDate;
                public int Validate;
                //char CorpName[256]; 
                //char Re[256]; 
                //char ProductCode[256]; 
                //char RFID[256]; 
                public byte[] CorpName;  //专用 
                public byte[] Re;  //备注 
                public byte[] ProductCode;    //SCADS SCADP 
                public byte[] RFID;
                public int RegisterState;
                public int Hid1;
                public int Hid2;
                public byte[] HostID;
            }; 
      

  3.   

    为什么不坚持用char CorpName[256]; 而用char* CorpName; 呢?前面一种很清晰是由调用方分配空间,
    后面一种就很模糊了。
      

  4.   

    谢谢老兄哈,不过你误解了。我给出的代码是在C写的DLL中的代码,现在需要在C#中使用这个DLL,不知道C#中怎么实现才可以使用这个DLL。
      

  5.   

    不听明白,是做成。DLL调用?
      

  6.   


    按照老兄的说法,我写了个简单的DLL,把 char* corpname 修改为 char corpname[256]了:
    struct TTYDogInfo
    {
      int   ProductID;
      float VersionID;  
      int   UserNumber;
      float MakeDate;
      int   Validate;
    char CorpName[256];
    char Re[256];
    char ProductCode[256];
    char RFID[256];
      //char* CorpName;  //专用
      //char* Re;  //备注
      //char* ProductCode;    //SCADS SCADP
      //char* RFID;
      int RegisterState;
      DWORD Hid1;
      DWORD Hid2;
    char HostID[256];
      //char* HostID;
    };
    extern "C" __declspec(dllexport) long GetTYDogInfo(TTYDogInfo *dogInfo, int productCode, int softType)
    {
    dogInfo->ProductID = productCode;
    dogInfo->Hid1 = softType;
    strcpy(dogInfo->CorpName, "企业名称");
    strcpy(dogInfo->Re, "Re");
    strcpy(dogInfo->ProductCode, "Product");
    strcpy(dogInfo->RFID, "RFID");
    strcpy(dogInfo->HostID, "HostID");
    //dogInfo->CorpName = "企业名称";
    //dogInfo->Re = "Re";
    //dogInfo->ProductCode = "Product";
    //dogInfo->RFID = "RFID";
    //dogInfo->HostID = "HostID";
    return 0;
    //AFX_MANAGE_STATE(AfxGetStaticModuleState());
    //CDTMainFun dtmf;
    //return dtmf.DLLInit(isAuthor,lpProductID,lpSoftName,lpAppString,lpCorpGUID);
    }
    然后在C#中:    unsafe struct TTYDogInfo
        {
            public int ProductID;
            public float VersionID;
            public int UserNumber;
            public float MakeDate;
            public int Validate;
            //public char[] CorpName;// = new char[256];
            //public char[] Re;// = new char[256];
            //public char[] ProductCode;// = new char[256];
            //public char[] RFID;// = new char[256];
            public fixed char CorpName[256];  //专用
            public fixed char Re[256];  //专用
            public fixed char ProductCode[256];  //专用
            public fixed char RFID[256];  //专用
            //public string CorpName;  //专用
            //public string Re;  //备注
            //public string ProductCode;    //SCADS SCADP
            //public string RFID;
            public int RegisterState;
            public long Hid1;
            public long Hid2;
            //public char[] HostID;// = new char[256];
            public fixed char HostID[256];  //专用
            //public string HostID;
        }    class Program
        {
            [DllImport("Dt.dll")]
            extern static long GetTYDogInfo(ref TTYDogInfo dogInfo, int productID, int softType);
            static void Main(string[] args)
            {
                TTYDogInfo dogInfo = new TTYDogInfo();
                //dogInfo.CorpName = new string(' ', 256);
                //dogInfo.Re = new string(' ', 256);
                //dogInfo.ProductCode = new string(' ', 256);
                //dogInfo.RFID = new string(' ', 256);
                //dogInfo.HostID = new string(' ', 256);
                long result = GetTYDogInfo(ref dogInfo, 8006, 2);
            }
        }
    调用是通过了,但没正确的把值返回。
      

  7.   


       [DllImport("Dll")]
            public static extern int GetTYDogInfo(ref TTYDogInfo dogInfo, int productCode, int softType);        public struct TTYDogInfo
            {
                public int ProductID;
                public float VersionID;
                public int UserNumber;
                public float MakeDate;
                public int Validate;
                //char CorpName[256]; 
                //char Re[256]; 
                //char ProductCode[256]; 
                //char RFID[256]; 
                public StringBuilder CorpName;  //专用 
                public StringBuilder Re;  //备注 
                public StringBuilder ProductCode;    //SCADS SCADP 
                public StringBuilder RFID;
                public int RegisterState;
                public int Hid1;
                public int Hid2;
                public StringBuilder HostID;
            }; 
      

  8.   

    无论使用 char* corpname 还是使用 char corpname[256],在C里面调用这个都没问题,但C#不行,郁闷。
      

  9.   


    报告以下错误:无法封送处理类型为“ConsoleApplication1.TTYDogInfo”的字段“CorpName”: 结构字段或类字段的类型不能是 StringBuilder。通常可采用以下方法达到同样的效果,即: 使用一个 String 字段并预先对该字段进行初始化,使其成为一个长度与相应缓冲区的长度相符的字符串。
      

  10.   

    先试试这样做(LayoutKind.Sequential是为了阻止.net移动成员顺序的优化,SizeConst指定结构中数组的长度):
        [StructLayout(LayoutKind.Sequential)]
        public struct TTYDogInfo 
        {
            //...        [MarshalAs( UnmanagedType.ByValTStr, SizeConst=256)]
            public string CorpName;        //...
        }
      

  11.   

    发现新大陆!代码:[DllImport("Dt.dll")]
    extern static long GetTYDogInfo(ref TTYDogInfo dogInfo, int productID, int softType);
    好象是不正确的。我修改了DLL,不让处理任何值,只简单返回,结果返回的不是我预期的。请问这个引用该怎么实现?
      

  12.   


    c++ long (32bit) => c# int