C#调用 C++写的DLL传递结构体的问题

shuihan20e 2016-01-07 06:42:40
C++结构体声明如下

struct CTollRate
{
DWORD BaseWeightTollRate; //spare1
DOUBLE FavRate1; //spare7
DOUBLE FavRate2; //spare8
DWORD PunishRate1; //spare2
DWORD PunishRate2; //spare3
double LegalOverFav; //spare6
};

struct CMoneyByWeight
{
DOUBLE BaseMoney;
DOUBLE OverMoney1;
DOUBLE OverMoney2;
};

接口如下
FARE_CALL_DLL_API DOUBLE WINAPI CalWeightMoney(DWORD dwAxis, DWORD dwTotalWeight, DWORD Meters, const CTollRate &TollRate, CMoneyByWeight *pMoneyByWeight)


翻译成C#代码如下
        [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi, Pack = 1)]
public struct CMoneyByWeight
{
public double BaseMoney;
public double OverMoney1;
public double OverMoney2;
}

[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi, Pack = 1)]
public struct CTollRate
{
public UInt32 BaseWeightTollRate;
public double FavRate1;
public double FavRate2;
public UInt32 PunishRate1;
public UInt32 PunishRate2;
public double Spare;
}

接口如下
        [DllImport("FareCalcDll.DLL", EntryPoint = "CalWeightMoney", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern double CalWeightMoney(UInt32 dwAxis, UInt32 dwTotalWeight, UInt32 Meters, CTollRate TollRate,ref CMoneyByWeight pMoneyByWeight);


调用代码如下

CMoneyByWeight cmoney = new CMoneyByWeight();

CTollRate rate = new CTollRate();
rate.BaseWeightTollRate = 8;
rate.FavRate1 = 6.0;
rate.FavRate2 = 3.0;
rate.PunishRate1 = 2;
rate.PunishRate2 = 4;
rate.Spare = 0;

double money = 0.0;
money=CalWeightMoney(2, 10000, 10000, rate, ref cmoney);


运行时总是提示“未AccessViolationException 尝试读取或写入受的内存。这通常指示其他内存已损坏
期待高手帮忙,急
...全文
151 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
马少华 2016-01-08
  • 打赏
  • 举报
回复

        [DllImport("FareCalcDll.DLL", EntryPoint = "CalWeightMoney", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern double CalWeightMoney(UInt32 dwAxis, UInt32 dwTotalWeight, UInt32 Meters, CTollRate TollRate,IntPtr pMoneyByWeight);

 CMoneyByWeight t = (CMoneyByWeight)Marshal.PtrToStructure(pMoneyByWeight, typeof(CMoneyByWeight));

Poopaye 2016-01-07
  • 打赏
  • 举报
回复
CTollRate TollRate ---> ref CTollRate TollRate

110,538

社区成员

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

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

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