c#调用动态库的问题,已经折磨我好几天了!请帮助,谢谢!!!

mrdingsheng 2009-04-01 11:01:19
我现在用C#调用vc写的动态库,这个动态库在delphi环境下调用是没有问题的,但是在c#环境下调用就会出现问题:
我所用的函数readCheckCard在delpi下的定义日下:
function readCheckCard(comport:integer;
UserIDNO:pchar;
Var CmdByte:integer;
Var MeterType:integer;
MeterNo:pchar;
Var seq:integer;
Var TotalPurQty:double;
Var TotalUsedQty:double;
Var residualQty:double;
Var loadTimes:integer;
Var lastPurQty:double;
Var MonthQty:PDoublearray;
Var ReiresidualQty:double;
Var WarnQty:double;
Var CoemptionQty:double;
Var BalDate:integer;
Var impluseNum:integer;
Var WorkStatus:integer;
Var BasicReading:double;
Var RecentlyUsedQty:double;
ChangeBatteryTime:pchar;
MeterTime:pchar;
Var measuredecimal:integer;
isw:pchar):integer;stdcall;far;external 'StarWS42.dll';
在c#下的定义如下:
public static extern int readCheckCard(int comport, StringBuilder UserIDNO, ref int CmdByte, ref int MeterType, StringBuilder MeterNo, ref int seq, ref double TotalPurQty,ref double TotalUsedQty, ref double residualQty, ref int loadTimes, ref double lastPurQty, ref double MonthQty, ref double ReiresidualQty, ref double WarnQty, ref double CoemptionQty,ref int BalDate, ref int impluseNum, ref int WorkStatus, ref double BasicReading, ref double LastUsedQty, StringBuilder ChangeBatteryTime, StringBuilder MeterTime, ref int measuredecimal,StringBuilder isw);
但是我在调试程序的时候,发现StringBuilder ChangeBatteryTime和StringBuilder MeterTime的值是正确的,但是StringBuilder UserIDNO和StringBuilder MeterNo的值始终为NULL,但是这两个值在delphi下是可以读出来的,并且这个函数的返回值是零(为零表示成功)。不知道是为什么呀?
请帮助,万分感谢!
...全文
226 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghost5216 2009-04-01
  • 打赏
  • 举报
回复
unsigned char *UserIDNO C#中byte []试试
mrdingsheng 2009-04-01
  • 打赏
  • 举报
回复
谢谢各位的关注,vc的原形如下:
int FAR PASCAL readCheckCard(unsigned int comport,unsigned char *UserIDNO,unsigned int *CmdByte,
unsigned int *MeterType,unsigned char *MeterNo,
unsigned int *seq,double *TotalPurQty,double *TotalUsedQty,double *residualQty,
unsigned int *loadTimes,double *lastPurQty,double *MonthQty,
double *ReiresidualQty,double *WarnQty,double *CoemptionQty,unsigned int *BalDate,
unsigned int *impluseNum,unsigned int *WorkStatus,
double *BasicReading,double* LastUsedQty,unsigned char* ChangeBatteryTime,
unsigned char *MeterTime,unsigned int *measuredecimal,unsigned char *isw);
在调试的过程中没有报任何的错误,这个函数的返回值是零,表示是成功的。
在C#中的变量定义如下:
StringBuilder UserIDNO = new StringBuilder(20);
int CmdByte = 0;
int MeterType = 0;
StringBuilder MeterNo = new StringBuilder(20);
int seq = 0;
double TotalPurQty = 0.00;
double TotalUsedQty = 0.00;
double residualQty = 0.00;
int loadTimes = 0;
double lastPurQty = 0.00;
double MonthQty = 0.00;
double ReiresidualQty = 0.00;
double WarnQty = 0.00;
double CoemptionQty = 0.00;
int BalDate = 0;
int impluseNum = 0;
int WorkStatus = 0;
double BasicReading = 0.00;
double LastUsedQty = 0.00;
StringBuilder ChangeBatteryTime = new StringBuilder(20);
StringBuilder MeterTime = new StringBuilder(20);
StringBuilder isw = new StringBuilder("0", 1);
int measuredecimal = 0;
以下是部分源代码:
switch (rc_CardType)
{
case 5:
{
if (rdbSmallDN.Checked == true)
{
rs = Cls_IC4442.readCheckCard(Cls_GlobVal.Comport4442,
UserIDNO,
ref CmdByte,
ref MeterType,
MeterNo,
ref seq,
ref TotalPurQty,
ref TotalUsedQty,
ref residualQty,
ref loadTimes,
ref lastPurQty,
ref MonthQty,
ref ReiresidualQty,
ref WarnQty,
ref CoemptionQty,
ref BalDate,
ref impluseNum,
ref WorkStatus,
ref BasicReading,
ref LastUsedQty,
ChangeBatteryTime,
MeterTime,
ref measuredecimal,
isw);
gxj760998 2009-04-01
  • 打赏
  • 举报
回复
/// <summary>
/// 批量读取记录
/// </summary>
/// <param name="hPort"></param>
/// <param name="records"></param>
/// <param name="size">固定为16</param>
/// <returns>返回读取的记录条数,失败时不大于0</returns>
[DllImport(DllName, CharSet = CharSet.Ansi)]
public static extern int BatchReadRecord(int hPort, [In, Out] TICRecord[] records);

给你个样本参考下。注意调用格式,数组,语言
suners 2009-04-01
  • 打赏
  • 举报
回复
还不明白
suners 2009-04-01
  • 打赏
  • 举报
回复
还不明白
suners 2009-04-01
  • 打赏
  • 举报
回复
还不明白
hyblusea 2009-04-01
  • 打赏
  • 举报
回复
C#报的错误是什么?
ghost5216 2009-04-01
  • 打赏
  • 举报
回复
VC的原型是什么?

111,126

社区成员

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

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

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