首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

用C#调用用C++写成的dll资料时,类型的匹配

2011-12-11 
用C#调用用C++写成的dll文件时,类型的匹配现在做一个项目,需要用到别人写好的一个dll文件中的函数,dll文件

用C#调用用C++写成的dll文件时,类型的匹配
现在做一个项目,需要用到别人写好的一个dll文件中的函数,dll文件中函数的定义如下:
BOOLHKCanInitState(
  PHKCANHANDLE mDevHandle, 
  int nPort, 
  UINT CAN_bps,
  UCHAR CAN_StationAddress,
  UCHAR CAN_Mask, 
  HANDLEmRxEvent
  )


mDevHandle为一个结构体指针,如下:
typedef struct _HKCANHANDLE {
HANDLE mHandle;
DWORD mGuid;
WORD mClass;
WORD mDev;
WORD mType;
WORD mState;
}HKCANHANDLE,*PHKCANHANDLE

我对函数的引用如下:
  [DllImport("HKCANDLL.dll", EntryPoint = "HKCanGetBDVersion", CallingConvention = CallingConvention.Cdecl)]
  public static extern int InitState(ref HKCANHANDLE mDevHandle, int nPort, uint CAN_bps, byte CAN_StationAddress, byte CAN_Mask, IntPtr mRxEvent);

  public struct HKCANHANDLE 
  {
   
  public IntPtr mHandle; //设备句柄  
  public UInt32 mGuid; //设备标志 
  public UInt16 mClass; //设备类型  
  public UInt16 mDev; //设备数量
  public UInt16 mType;  
  public UInt16 mState;  
  }
调用如下:
IntPtr ptr = (IntPtr)null;
InitState(ref m_HKCanHandle, 0, 21295, 0, 255, ptr );

这一句执行以后,总是提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”,不知如何处理。
m_HKCanHandle为HKCANHANDLE 类型的变量,前面已经取得此值。

高手指点一下,困扰好几天啦,在线等。

[解决办法]
参考MSDN中的pinvoke,用平台调用封送数据。
平台调用是相当麻烦的事。
建议你使用c++.net混合编程来屏蔽这个细节。

热点排行