#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 */
/************************************************************************/