微机监测 动态加载CAN驱动模块

#ifndef CAN_H_
#define CAN_H_
#include "can.h"

typedef BOOL (__cdecl *STD_CAN_Open)(VOID);
typedef BOOL (__cdecl *STD_CAN_Init)(UCHAR BaudRate); // Init CAN controller with Baud rate

typedef void (__cdecl *STD_CAN_Close)(VOID);   // close CAN device when exit application you must close CAN
typedef BOOL (__cdecl *STD_CAN_CloseEx)(VOID);   // close CAN device when exit application you must close CAN

typedef UINT (__cdecl *STD_CAN_Trans)(UCHAR ModleNo, UINT DataLen, UCHAR Data[]);//Send data
typedef BOOL (__cdecl *STD_CAN_Inquiry_Answer)(VOID); // Inquiry receive status
typedef BOOL (__cdecl *STD_CAN_Read_Answer)(UCHAR *ModleNo, UINT *DataLen, UCHAR Data[]);// Receive data
typedef BOOL (__cdecl *STD_CAN_Inquiry_Sub)(VOID); // Inquiry receive status
typedef BOOL (__cdecl *STD_CAN_Read_Sub)(UCHAR *ModleNo, UINT *DataLen, UCHAR Data[]);

static HMODULE hCanDriverModule=NULL;
static BOOL bLoadMCan2006=true;//加载MCAN2006
void SetCanDriverType(bool bCan2006)//设置CAN驱动的类型
{
 if(!hCanDriverModule)
 {
  bLoadMCan2006=bCan2006;
 }
}
BOOL GetCanDriverType()
{
 return bLoadMCan2006;
}
BOOL LoadCanDriverDll()
{
 if(!bLoadMCan2006)
 {
  hCanDriverModule=LoadLibrary("MCAN.DLL");
 }
 else
 {
  hCanDriverModule=LoadLibrary("MCAN2006.DLL");
 }
 if(hCanDriverModule)
  return true;
 else
 {
  TRACE("没有找到MCAN.DLL或MCAN2006.DLL/n");
  return false;
 }
}

BOOL UnLoadCanDriverDll()
{
 if(hCanDriverModule)
 {
  return FreeLibrary(hCanDriverModule);
 }
 return true;
}

BOOL CAN_Open(VOID)   // open CAN device
{
 if(hCanDriverModule==NULL)
 {
  TRACE("没有LoadCanDriverDll()/n");
  return false;
 }
 
 STD_CAN_Open can_open=NULL;

 if(!bLoadMCan2006)
 {
  can_open=(STD_CAN_Open)GetProcAddress(hCanDriverModule,"?CAN_Open@@YAHXZ");
 }
 else
 {
  can_open=(STD_CAN_Open)GetProcAddress(hCanDriverModule,"?CAN_Open@@YAHXZ");
 }
 if(can_open!=NULL)
 {
  return (can_open)();
 }
 else
 {
  return false;
 } 
}

BOOL CAN_Init(UCHAR BaudRate) // Init CAN controller with Baud rate
{   
 if(hCanDriverModule==NULL)
 {
  TRACE("没有LoadCanDriverDll()/n");
  return false;
 }
 STD_CAN_Init can_init=NULL;
 if(!bLoadMCan2006)
 {
  can_init=(STD_CAN_Init)GetProcAddress(hCanDriverModule,"?CAN_Init@@YAHE@Z");
 }
 else
 {
  can_init=(STD_CAN_Init)GetProcAddress(hCanDriverModule,"?CAN_Init@@YAHE@Z");
 }

 if(can_init!=NULL)
 {
  return (can_init)(BaudRate);
 }
 else
 {
  return false;
 } 
}

BOOL CAN_Close(VOID)   // close CAN device
        // when exit application you must close CAN
{
 if(hCanDriverModule==NULL)
 {
  TRACE("没有LoadCanDriverDll()/n");
  return false;
 }
 
 if(!bLoadMCan2006)
 {
  STD_CAN_Close can_close=NULL;
  can_close=(STD_CAN_Close)GetProcAddress(hCanDriverModule,"?CAN_Close@@YAXXZ");
  if(can_close!=NULL)
  {
   (can_close)();
   return true;
  }
  else
  {
   return false;
  }
 }
 else
 {
  STD_CAN_CloseEx can_close=NULL;
  can_close=(STD_CAN_CloseEx)GetProcAddress(hCanDriverModule,"?CAN_Close@@YAHXZ");
  if(can_close!=NULL)
  {
   return (can_close)();
  }
  else
  {
   return false;
  }
 }

}

UINT CAN_Trans(UCHAR ModleNo, UINT DataLen, UCHAR Data[])
        //Send data

 if(hCanDriverModule==NULL)
 {
  TRACE("没有LoadCanDriverDll()/n");
  return false;
 } 
 STD_CAN_Trans can_trans=NULL;
 if(!bLoadMCan2006)
 {
  can_trans=(STD_CAN_Trans)GetProcAddress(hCanDriverModule,"?CAN_Trans@@YAIEIQAE@Z");
 }
 else
 {
  can_trans=(STD_CAN_Trans)GetProcAddress(hCanDriverModule,"?CAN_Trans@@YAIEIQAE@Z");
 }
 
 if(can_trans!=NULL)
 {
  return (can_trans)(ModleNo,DataLen,Data);
 }
 else
 {
  return false;
 } 
}

BOOL CAN_Inquiry_Answer(VOID) // Inquiry receive status
{
 if(hCanDriverModule==NULL)
 {
  TRACE("没有LoadCanDriverDll()/n");
  return false;
 }
 STD_CAN_Inquiry_Answer can_inquiry_answer=NULL;
 if(!bLoadMCan2006)
 {
  can_inquiry_answer=(STD_CAN_Inquiry_Answer)GetProcAddress(hCanDriverModule,"?CAN_Inquiry_Answer@@YAHXZ");
 }
 else
 {
  can_inquiry_answer=(STD_CAN_Inquiry_Answer)GetProcAddress(hCanDriverModule,"?CAN_Inquiry_Answer@@YAHXZ");
 }
 
 if(can_inquiry_answer!=NULL)
 {
  return (can_inquiry_answer)();
 }
 else
 {
  return false;
 } 
}

BOOL CAN_Read_Answer(UCHAR *ModleNo, UINT *DataLen, UCHAR Data[])
             // Receive data
{
 if(hCanDriverModule==NULL)
 {
  TRACE("没有LoadCanDriverDll()/n");
  return false;
 }
 STD_CAN_Read_Answer can_read_answer=NULL;
 if(!bLoadMCan2006)
 {
  can_read_answer=(STD_CAN_Read_Answer)GetProcAddress(hCanDriverModule,"?CAN_Read_Answer@@YAHPAEPAIQAE@Z");
 }
 else
 {
  can_read_answer=(STD_CAN_Read_Answer)GetProcAddress(hCanDriverModule,"?CAN_Read_Answer@@YAHPAEPAIQAE@Z");
 }

 if(can_read_answer!=NULL)
 {
  return (can_read_answer)(ModleNo,DataLen,Data);
 }
 else
 {
  return false;
 }  
}

BOOL CAN_Inquiry_Sub(VOID) // Inquiry receive status
{
 if(hCanDriverModule==NULL)
 {
  TRACE("没有LoadCanDriverDll()/n");
  return false;
 }
 STD_CAN_Inquiry_Sub can_inquiry_sub=NULL;
 if(!bLoadMCan2006)
 {
  can_inquiry_sub=(STD_CAN_Inquiry_Sub)GetProcAddress(hCanDriverModule,"?CAN_Inquiry_Sub@@YAHXZ");
 }
 else
 {
  can_inquiry_sub=(STD_CAN_Inquiry_Sub)GetProcAddress(hCanDriverModule,"?CAN_Inquiry_Sub@@YAHXZ");
 }
 
 if(can_inquiry_sub!=NULL)
 {
  return (can_inquiry_sub)();
 }
 else
 {
  return false;
 }
}

BOOL CAN_Read_Sub(UCHAR *ModleNo, UINT *DataLen, UCHAR Data[])
        // Receive data
{
 if(hCanDriverModule==NULL)
 {
  TRACE("没有LoadCanDriverDll()/n");
  return false;
 }

 STD_CAN_Read_Sub can_read_sub=NULL;
 if(!bLoadMCan2006)
 {
  can_read_sub=(STD_CAN_Read_Sub)GetProcAddress(hCanDriverModule,"?CAN_Read_Sub@@YAHPAEPAIQAE@Z");
 }
 else
 {
  can_read_sub=(STD_CAN_Read_Sub)GetProcAddress(hCanDriverModule,"?CAN_Read_Sub@@YAHPAEPAIQAE@Z");
 }

 if(can_read_sub!=NULL)
 {
  return (can_read_sub)(ModleNo,DataLen,Data);
 }
 else
 {
  return false;
 }
}

#endif

//MCAN.dll
/************************************************************************/
/*        1    0 00001023 ?CAN_Close@@YAXXZ
          2    1 00001032 ?CAN_Init@@YAHE@Z
          3    2 0000101E ?CAN_Inquiry_Answer@@YAHXZ
          4    3 00001037 ?CAN_Inquiry_Sub@@YAHXZ
          5    4 00001005 ?CAN_Open@@YAHXZ
          6    5 0000103C ?CAN_Read_Answer@@YAHPAEPAIQAE@Z
          7    6 0000102D ?CAN_Read_Sub@@YAHPAEPAIQAE@Z
          8    7 00001000 ?CAN_Trans@@YAIEIQAE@Z
          9    8 00001019 ?ReadCANPort@@YAEE@Z
         10    9 0000100A ?WriteCANPort@@YAXEE@Z                                                                     */
/************************************************************************/
/************************************************************************/
/* MCan2006.dll                     */
/*     ordinal hint RVA      name

          1    0 0000109B ?CAN_Close@@YAHXZ
          2    1 000010C3 ?CAN_Init@@YAHE@Z
          3    2 00001091 ?CAN_Inquiry_Answer@@YAHXZ
          4    3 000010F5 ?CAN_Inquiry_Sub@@YAHXZ
          5    4 00001041 ?CAN_Open@@YAHXZ
          6    5 0000111D ?CAN_Read_Answer@@YAHPAEPAIQAE@Z
          7    6 000010A0 ?CAN_Read_Sub@@YAHPAEPAIQAE@Z
          8    7 0000103C ?CAN_Trans@@YAIEIQAE@Z                                                                     */
/************************************************************************/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值