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);
}
{
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);
}
解决方案 »
- 想透彻了解一下static?
- 关闭程序时释放串口连接
- 为什么我这段代码不会发出声音呢?
- dataset生成xml,dataset空字符串如何处理
- 关于DataTable动态插入多行数据问题,在线.......下班前结贴!!!
- 求助,一个简单的问题
- 怎么让自己的程序写到注册表里的自启动里,以后每次开机,程序都会自动启动??
- &&&&&&&&50分就问一个问题,Url参数传递问题?如何判断?%%%%%%%%%
- 简单的多线程问题,哪位好心人告诉我哪里错了
- Visual Studio .NET那里有下的地方,还有它和 Visual Studio 7.0 是不是一回事。
- winform 的显示html格式数据问题
- 请教一个树节点递归问题
{
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;
};
后面一种就很模糊了。
按照老兄的说法,我写了个简单的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);
}
}
调用是通过了,但没正确的把值返回。
[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;
};
报告以下错误:无法封送处理类型为“ConsoleApplication1.TTYDogInfo”的字段“CorpName”: 结构字段或类字段的类型不能是 StringBuilder。通常可采用以下方法达到同样的效果,即: 使用一个 String 字段并预先对该字段进行初始化,使其成为一个长度与相应缓冲区的长度相符的字符串。
[StructLayout(LayoutKind.Sequential)]
public struct TTYDogInfo
{
//... [MarshalAs( UnmanagedType.ByValTStr, SizeConst=256)]
public string CorpName; //...
}
extern static long GetTYDogInfo(ref TTYDogInfo dogInfo, int productID, int softType);
好象是不正确的。我修改了DLL,不让处理任何值,只简单返回,结果返回的不是我预期的。请问这个引用该怎么实现?
c++ long (32bit) => c# int