请高手帮忙,C#如何调用c++写的DLL

hzhzl 2015-04-04 10:32:59
对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
...全文
206 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzhzl 2015-04-07
  • 打赏
  • 举报
回复
自己已解决!
hzhzl 2015-04-05
  • 打赏
  • 举报
回复
自己顶上去!
hzhzl 2015-04-05
  • 打赏
  • 举报
回复
之前简单的调用都没问题,这个比较复杂,有回调函数之类的,一直有问题,等空点再慢慢研究
anabiosispe 2015-04-05
  • 打赏
  • 举报
回复
P/Invoke的方式,是可以调用的。我以前调用过一些。 但是单独说一个C++写的dll,范围太广泛,我并不清楚是否所有的C++.dll是否有导出函数可用。 你先去研究一下吧。

110,549

社区成员

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

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

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