对DLL的调用,如何把以下C代码在C#中实现?

daview 2009-04-14 11:23:07
struct TTYDogInfo
{
int ProductID;
float VersionID;
int UserNumber;
float MakeDate;
int Validate;
//char CorpName[256];
//char Remark[256];
//char ProductCode[256];
//char RFID[256];
char* CorpName; //专用
char* Remark; //备注
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->Remark = "Remark";
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);
}
...全文
155 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgke 2009-04-14
  • 打赏
  • 举报
回复
返回值是什么样的.
gomoku 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 daview 的回复:]
发现新大陆!代码:

C# code
[DllImport("Dt.dll")]
extern static long GetTYDogInfo(ref TTYDogInfo dogInfo, int productID, int softType);




好象是不正确的。

我修改了DLL,不让处理任何值,只简单返回,结果返回的不是我预期的。

请问这个引用该怎么实现?
[/Quote]

c++ long (32bit) => c# int
daview 2009-04-14
  • 打赏
  • 举报
回复
发现新大陆!代码:

[DllImport("Dt.dll")]
extern static long GetTYDogInfo(ref TTYDogInfo dogInfo, int productID, int softType);


好象是不正确的。

我修改了DLL,不让处理任何值,只简单返回,结果返回的不是我预期的。

请问这个引用该怎么实现?
龙宜坡 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zgke 的回复:]

[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];

[/Quote]


答案
gomoku 2009-04-14
  • 打赏
  • 举报
回复
先试试这样做(LayoutKind.Sequential是为了阻止.net移动成员顺序的优化,SizeConst指定结构中数组的长度):


[StructLayout(LayoutKind.Sequential)]
public struct TTYDogInfo
{
//...

[MarshalAs( UnmanagedType.ByValTStr, SizeConst=256)]
public string CorpName;

//...
}
daview 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zgke 的回复:]

[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];

[/Quote]

报告以下错误:

无法封送处理类型为“ConsoleApplication1.TTYDogInfo”的字段“CorpName”: 结构字段或类字段的类型不能是 StringBuilder。通常可采用以下方法达到同样的效果,即: 使用一个 String 字段并预先对该字段进行初始化,使其成为一个长度与相应缓冲区的长度相符的字符串。
daview 2009-04-14
  • 打赏
  • 举报
回复
无论使用 char* corpname 还是使用 char corpname[256],在C里面调用这个都没问题,但C#不行,郁闷。
wts_net 2009-04-14
  • 打赏
  • 举报
回复
zgke 2009-04-14
  • 打赏
  • 举报
回复

[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 Remark[256];
//char ProductCode[256];
//char RFID[256];
public StringBuilder CorpName; //专用
public StringBuilder Remark; //备注
public StringBuilder ProductCode; //SCADS SCADP
public StringBuilder RFID;
public int RegisterState;
public int Hid1;
public int Hid2;
public StringBuilder HostID;
};


daview 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gomoku 的回复:]
为什么不坚持用char CorpName[256]; 而用char* CorpName; 呢?

前面一种很清晰是由调用方分配空间,
后面一种就很模糊了。
[/Quote]

按照老兄的说法,我写了个简单的DLL,把 char* corpname 修改为 char corpname[256]了:


struct TTYDogInfo
{
int ProductID;
float VersionID;
int UserNumber;
float MakeDate;
int Validate;
char CorpName[256];
char Remark[256];
char ProductCode[256];
char RFID[256];
//char* CorpName; //专用
//char* Remark; //备注
//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->Remark, "Remark");
strcpy(dogInfo->ProductCode, "Product");
strcpy(dogInfo->RFID, "RFID");
strcpy(dogInfo->HostID, "HostID");
//dogInfo->CorpName = "企业名称";
//dogInfo->Remark = "Remark";
//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[] Remark;// = new char[256];
//public char[] ProductCode;// = new char[256];
//public char[] RFID;// = new char[256];
public fixed char CorpName[256]; //专用
public fixed char Remark[256]; //专用
public fixed char ProductCode[256]; //专用
public fixed char RFID[256]; //专用
//public string CorpName; //专用
//public string Remark; //备注
//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.Remark = 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);
}
}


调用是通过了,但没正确的把值返回。
悔说话的哑巴 2009-04-14
  • 打赏
  • 举报
回复
不听明白,是做成。DLL调用?
sushou2009 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zgke 的回复:]
public int GetTYDogInfo(ref TTYDogInfo dogInfo, int productCode, int softType)
{
dogInfo.ProductID = productCode;
dogInfo.Hid1 = softType;
dogInfo.CorpName = System.Text.Encoding.Default.GetBytes("企业名称");
dogInfo.Remark = System.Text.Encoding.Default.GetBytes("Remark");
dogInfo.ProductCode = System.Text.Encodin…
[/Quote]
UP
daview 2009-04-14
  • 打赏
  • 举报
回复
谢谢老兄哈,不过你误解了。

我给出的代码是在C写的DLL中的代码,现在需要在C#中使用这个DLL,不知道C#中怎么实现才可以使用这个DLL。
CeShenBeiWang 2009-04-14
  • 打赏
  • 举报
回复
帮顶
hhhh63 2009-04-14
  • 打赏
  • 举报
回复
字节数组改成字符串好一些,要转换编码。
gomoku 2009-04-14
  • 打赏
  • 举报
回复
为什么不坚持用char CorpName[256]; 而用char* CorpName; 呢?

前面一种很清晰是由调用方分配空间,
后面一种就很模糊了。
zgke 2009-04-14
  • 打赏
  • 举报
回复
public int GetTYDogInfo(ref TTYDogInfo dogInfo, int productCode, int softType)
{
dogInfo.ProductID = productCode;
dogInfo.Hid1 = softType;
dogInfo.CorpName = System.Text.Encoding.Default.GetBytes("企业名称");
dogInfo.Remark = System.Text.Encoding.Default.GetBytes("Remark");
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 Remark[256];
//char ProductCode[256];
//char RFID[256];
public byte[] CorpName; //专用
public byte[] Remark; //备注
public byte[] ProductCode; //SCADS SCADP
public byte[] RFID;
public int RegisterState;
public int Hid1;
public int Hid2;
public byte[] HostID;
};
daview 2009-04-14
  • 打赏
  • 举报
回复
补充下:C中是基于GB2312编码的,.NET中是UTF-8的,CORPNAME和REMARK中可能有汉字。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧