请高手帮忙,C#怎么调用c++写的DLL

请高手帮忙,C#如何调用c++写的DLL
对C++不太熟悉,请高手帮忙,C#如何调用c++写的DLL,主要是调用GPSSubscribe方法,回调函数返回GPS信息,DLL的C++代码如下:

#ifndef LIBALARMCLIENT_H__
#define LIBALARMCLIENT_H__

#include <time.h>

#ifdef LIBALARMCLIENT_EXPORTS
#define LIBALARMCLIENT_API __declspec(dllexport)
#else
#define LIBALARMCLIENT_API __declspec(dllimport)
#endif

/** @struct ST_ALARM_SERVER_INFO
*  @brief 报警服务器登录信息
*/
typedef struct
{
char szAlarmServerIP[32];  /**< 报警服务器IP */
unsigned short int nAlarmServerPort; /**< 报警服务器端口 */
unsigned short int nReserved;  /**< 保留字段 */
char szUserName[32]; /**< 登陆用户名,未使用 */
char szUserPwd[32];  /**< 登陆密码,未使用 */
}ST_ALARM_SERVER_INFO;

/** @struct ST_ALARMSERVER_STATUS
*  @brief 报警服务器状态
*/
typedef struct
{
char szServerIP[32]; /**< 服务器IP */
unsigned short int nServerPort;  /**< 服务器通信端口 */
unsigned short int  nReserved;  /**< 保留 */
    int nAlarmSubClientNum; /**< 订阅报警用户数目 */
    int nGPSSubClientNum; /**< 订阅GPS用户数目 */
char szServerVersion[128]; /**< 服务器版本号 */
time_t tRunningTime; /**< 服务器运行时间 */
unsigned int nCpuUsage;  /**< 服务器CPU使用率 */
unsigned int nTotalPhys; /**< 服务器总的物理内存 */
unsigned int nAvailPhys; /**< 服务器可用物理内存 */
}ST_ALARMSERVER_STATUS;


/** @enum EN_ALARM_TYPE_EX
* @brief 报警类型
*/
typedef enum
{
ALARM_TYPE_DISK_FULL = 0x00, /**< 0、硬盘满 */
ALARM_TYPE_DISK_WRERROR, /**< 1、读写硬盘出错 */

ALARM_TYPE_VIDEO_LOST = 0x05, /**< 5、视频(信号)丢失 */
ALARM_TYPE_EXTERNAL, /**< 6、外部(信号量)报警 */
ALARM_TYPE_VIDEO_COVERED, /**< 7、视频遮盖 */
ALARM_TYPE_MOTION, /**< 8、移动侦测 */
ALARM_TYPE_STANDARD_NOTMATCH, /**< 9、制式不匹配 */
ALARM_TYPE_SPEEDLIMIT_EXCEED, /**< 10、超速 */
ALARM_TYPE_SOUNDLIMIT_EXCEED=80, /**< 80、声音分贝数超标 */
ALARM_TYPE_ALL = 100, /**< 所有报警类型 */
}EN_ALARM_TYPE_EX;

/** @struct ST_ALARM_INFO
*  @brief 报警信息
*/
typedef struct
{
    char szAlarmTime[64];  /**< 报警上传时间 格式2009-02-24 12:11:12 */
    char szDeviceID[64]; /**<设备注册ID*/
    unsigned int nAlarmType; /**< 报警类型 见EN_ALARM_TYPE枚举变量 */
    unsigned int nAlarmAction; /**< 报警动作 0:开始 1:停止 */
    unsigned int nVideoChannel;  /**<发生视频丢失报警、移动侦测报警、遮挡报警时的视频通道号,当报警类型为10时代表允许最大速度,为80时代表允许声音分贝数阀值*10*/
    unsigned int nAlarmInChannel;  /**<发生报警的报警输入通道号,当报警类型为10时代表实际速度,为80时代表采样声音分贝数*10*/
    unsigned int nDiskNumber;  /**<发生硬盘错或者硬盘满报警的硬盘编号*/
}ST_ALARM_INFO;


/**   @struct ST_GPS_INFO
*   @brief GPS信息
*/
typedef struct  
{
char szSampleTime[64];      /**< GPS采样时间*/
    char szDeviceID[64];        /**< 设备ID */
    char division[2];           /**< division[0]:'E'or'W'(东经/西经), division[1]:'N'or'S'(北纬/南纬) */
    char reserve[2]; /**< 保留 */
    int  longitude;             /**< 经度,取值范围为(0~180*3600*100),转换公式为:longitude= 实际度*3600*100+实际分*60*100+实际秒*100 */
    int  latitude;              /**< 纬度,取值范围为(0~90*3600*100),转换公式为:latitude = 实际度*3600*100+实际分*60*100+实际秒*100 */
    int  direction;             /**< 方向,取值范围为(0~359.9*100,-1),转换公式为:direction= 实际方向*100 */
    int  speed;                 /**< 速度,取值范围为(0~999.9*100000),转换公式为:speed =实际速度*100000,相当于cm/h */
}ST_GPS_INFO;


/**   @struct ST_DATETIME_ALARM
*   @brief 日期时间结构
*/
typedef struct
{
int iYear; /**< 年 */
int iMonth; /**< 月 */
int iDay; /**< 日 */
char chHours; /**< 时 */
char chMinutes; /**< 分 */
char chSeconds; /**< 秒 */
char chReserved; /**< 保留 */
}ST_DATETIME_ALARM;

/**   @struct ST_DATETIME_GPS
*   @brief 日期时间结构
*/
typedef struct
{
int iYear; /**< 年 */
int iMonth; /**< 月 */
int iDay; /**< 日 */
int iHours; /**< 时 */
int iMinutes; /**< 分 */
int iSeconds; /**< 秒 */
}ST_DATETIME_GPS;


#ifdef __cplusplus
extern "C" {
#endif


/**
*@brief 报警回调函数类型声明
*@param nUserDataForCallBack 用户数据ID
*@param nReserved 保留
*@param pDesc 报警信息数据
*@param dwDescLen 报警信息长度
*@return void
**/
typedef void (__stdcall *pAlarmCallBack)( unsigned int nUserDataForCallBack, unsigned int nReserved, 
const void* pDesc, size_t dwDescLen );



/**  
*@brief 初始化库
*@return 0代表成功;<0代表失败
*/
LIBALARMCLIENT_API int AlarmInitLib( void );


/**
*@brief 销毁库
*@return 0代表成功;<0代表失败
**/
LIBALARMCLIENT_API int AlarmFiniLib( void );


/**
*@brief 获取报警服务器状态
*@param stAlarmServerInfo 报警服务器连接信息
*@param pSTAlarmServerStatus 报警服务器状态
*@return 0代表获取成功;<0代表获取失败
**/
LIBALARMCLIENT_API int AlarmGetServerInfo( ST_ALARM_SERVER_INFO stAlarmServerInfo, ST_ALARMSERVER_STATUS* pSTAlarmServerStatus );


/**
*@brief 全部报警订阅
*@param stAlarmServerInfo 报警服务器的信息
*@param pfnAlarmCallBack 接收报警的回调函数
*@param nUserDataForCallBack 接收报警的回调函数的用户数据
*@return >=0代表订阅成功返回的句柄;-1代表失败
**/
LIBALARMCLIENT_API int AlarmSubscribe( ST_ALARM_SERVER_INFO stAlarmServerInfo, pAlarmCallBack pfnAlarmCallBack, unsigned int nUserDataForCallBack );


/**
*@brief 取消报警订阅(包括全部订阅、部分订阅)
*@param iAlarmUsrID 订阅报警的返回句柄
*@return void
**/
LIBALARMCLIENT_API void AlarmUnSubscribe( int iAlarmUsrID );


/**
*@brief 向报警服务器查找报警信息
*@param stAlarmServerInfo 报警服务器连接信息
*@param pszDeviceID 查询设备ID
*@param iAlarmType 报警类型(ALARM_TYPE_ALL:全部;其余参考EN_ALARM_TYPE_EX)
*@param stStart 开始时间结构体
*@param stStop 结束时间结构体
*@param pArray 报警信息内容数组
*@param iNum 报警信息的条数
*@return 0代表获取成功;<0代表获取失败
**/
LIBALARMCLIENT_API int AlarmFindRecordAlarm( ST_ALARM_SERVER_INFO stAlarmServerInfo, const char* pszDeviceID, 
int iAlarmType, ST_DATETIME_ALARM stStart, ST_DATETIME_ALARM stStop, ST_ALARM_INFO* pArray, int *iNum );

/**
*@brief 全部GPS订阅
*@param stAlarmServerInfo 报警服务器的信息
*@param pfnAlarmCallBack 接收GPS的回调函数
*@param nUsrData 用户参数
*@return >=0代表订阅成功返回的句柄;-1代表失败
**/
LIBALARMCLIENT_API int GPSSubscribe( ST_ALARM_SERVER_INFO stAlarmServerInfo, pAlarmCallBack pfnAlarmCallBack, unsigned int nUserDataForCallBack );

/**
*@brief 取消GPS订阅(包括全部订阅、部分订阅)
*@param iAlarmUsrID 订阅GPS的返回句柄
*@return void
**/
LIBALARMCLIENT_API void GPSUnSubscribe( int iAlarmUsrID );

/**
*@brief 向报警服务器查找GPS信息
*@param stAlarmServerInfo 报警服务器连接信息
*@param pszDeviceID 查询设备ID
*@param stStart 开始时间结构体
*@param stStop 结束时间结构体
*@param pArray GPS信息列表
*@param iNum 查得GPS数目
*@retval pArray GPS信息列表
*@retval iNum 查得GPS数目
*@return 0代表获取成功;<0代表获取失败
**/
LIBALARMCLIENT_API int FindRecordGPS( ST_ALARM_SERVER_INFO stAlarmServerInfo, const char* pszDeviceID,
ST_DATETIME_ALARM stStart, ST_DATETIME_ALARM stStop, ST_GPS_INFO* pArray, int *iNum );

/**
*@brief 消息订阅
*@param stAlarmServerInfo 报警服务器的信息
*@param pfnAlarmCallBack 接收消息回调函数
*@param nUserDataForCallBack 用户参数
*@return >=0代表订阅成功返回的句柄;-1代表失败
**/
LIBALARMCLIENT_API int MessageSubscribe( ST_ALARM_SERVER_INFO stAlarmServerInfo, pAlarmCallBack pfnAlarmCallBack, unsigned int nUserDataForCallBack );

/**
*@brief 取消消息订阅
*@param iAlarmUsrID 订阅消息的返回句柄
*@return void
**/
LIBALARMCLIENT_API void MessageUnSubscribe( int iAlarmUsrID );

/**
*@brief 向报警服务器发送信息
*@param iAlarmUsrID 订阅GPS的返回句柄
*@param pSendBuf 发送数据
*@param nCount 发送数据长度
*@return 0代表发送成功;-1代表发送失败
**/
LIBALARMCLIENT_API int SendDataToServer( int iAlarmUsrID, const void* pSendBuf, size_t nCount);

/**
*@brief 向报警服务器查找GPS信息
*@param stAlarmServerInfo 报警服务器连接信息
*@param pszDeviceID 查询设备ID
*@param stStart 开始时间结构体
*@param stStop 结束时间结构体
*@param pArray GPS信息列表
*@param iNum 查得GPS数目
*@retval pArray GPS信息列表
*@retval iNum 查得GPS数目
*@return 0代表获取成功;<0代表获取失败
**/
LIBALARMCLIENT_API int FindRecordGPSEx( ST_ALARM_SERVER_INFO stAlarmServerInfo, const char* pszDeviceID,
ST_DATETIME_GPS stStart, ST_DATETIME_GPS stStop, ST_GPS_INFO* pArray, int *iNum );

#ifdef __cplusplus
}
#endif

#endif

------解决思路----------------------
http://www.cnblogs.com/YuZhang/articles/1272887.html
------解决思路----------------------
P/Invoke的方式,是可以调用的。我以前调用过一些。
但是单独说一个C++写的dll,范围太广泛,我并不清楚是否所有的C++.dll是否有导出函数可用。
你先去研究一下吧。