[HELP]注册和调用回调函数的问题

Hello_Wrorld_2010 2011-02-25 02:29:13
//XXXXXX 函数原型 XXXXXX
//结构体
struct TUssdCallbacks
{
LPONUSSDREQUEST m_pOnUssdRequest;
LPONUSSDRESPONSE m_pOnUssdResponse;
};

//定义函数指针
typedef int (*LPONUSSDREQUEST)(void * hLoginInstance, void * hUssdDialog,
struct TUssdData UssdData, unsigned long *pdwUssdAppParam);

typedef int (*LPONUSSDRESPONSE)(void * hLoginInstance, void * hUssdDialog,
char szUssdString[], unsigned long dwUssdAppParam);

//函数指针指向的函数
int PASCAL EXPORT UssdSendRequest(void * hUssdDialog, struct TUssdData UssdData);

int PASCAL EXPORT UssdSendResponse(void * hUssdDialog, struct TUssdData UssdData);

//DLL文件导出的函数
#ifdef __cplusplus
extern "C"
{
#endif
int PASCAL EXPORT UssdSendRequest(void * hUssdDialog, struct TUssdData UssdData);
int PASCAL EXPORT UssdSendResponse(void * hUssdDialog, struct TUssdData UssdData);
int PASCAL EXPORT RegisterUssdCallbackFunctions(struct TUssdCallbacks CallbackFuncs);
#ifdef __cplusplus
};
#endif

//###### 以上是跟DLL库相关的头文件中的代码 ######


// @@@@@@ 通过DLL中的回调函数接收设备返回的信息 @@@@@@
//以下代码是注册和调用回调函数,DLL文件是跟设备通信的接口;
//在回调函数中接收设备返回的信息。。。

用下面的方式来实现,是否可以呢?

//定义结构体
TUssdCallbacks myCallbackFuncs;
myCallbackFuncs.m_pOnUssdResponse = UssdSendRequest;
myCallbackFuncs.m_pOnUssdResponse = UssdSendResponse;

//注册结构体中的函数
RegisterUssdCallbackFunctions(myCallbackFuncs);

//回调方式接收消息
static int CALLBACK UssdSendRequest
(void * hLoginInstance, void * hUssdDialog, char szUssdString[], unsigned long dwUssdAppParam)
{
//接收设备返回的消息
//处理自己的业务逻辑
};

//回调方式接收消息
static int CALLBACK UssdSendResponse
(void * hLoginInstance, void * hUssdDialog, char szUssdString[], unsigned long dwUssdAppParam)
{
//接收设备返回的消息
//处理自己的业务逻辑
}
...全文
148 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
芸香传奇 2011-08-01
  • 打赏
  • 举报
回复
学些。。。
Hello_Wrorld_2010 2011-02-28
  • 打赏
  • 举报
回复
DLL相关的头文件中,函数声明时没有CALLBACK关键字

//定义函数指针
typedef int (*LPONUSSDREQUEST)(void * hLoginInstance, void * hUssdDialog,
struct TUssdData UssdData, unsigned long *pdwUssdAppParam);

typedef int (*LPONUSSDRESPONSE)(void * hLoginInstance, void * hUssdDialog,
char szUssdString[], unsigned long dwUssdAppParam);
Hello_Wrorld_2010 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wqt_007 的回复:]
//给结构体变量赋值
myCallbackFuncs.m_pOnUssdResponse = OnSendResponse;

这个是在函数里写的么?
[/Quote]
----------------------
是的。

//补充“CALLBACK” Add 0228
//这个是DLL相关的 头文件中的一个函数的声明
typedef int (CALLBACK *LPONUSSDRESPONSE)(void * hLoginInstance, void * hUssdDialog,
char szUssdString[], unsigned long dwUssdAppParam);

wqt_007 2011-02-28
  • 打赏
  • 举报
回复
//给结构体变量赋值
myCallbackFuncs.m_pOnUssdResponse = OnSendResponse;

这个是在函数里写的么?
Hello_Wrorld_2010 2011-02-28
  • 打赏
  • 举报
回复
struct TUssdCallbacks
{
LPONUSSDRESPONSE m_pOnUssdResponse;
};

//补充“CALLBACK” Add 0228
typedef int (CALLBACK *LPONUSSDRESPONSE)(void * hLoginInstance, void * hUssdDialog,
char szUssdString[], unsigned long dwUssdAppParam);

//======================
以上代码是函数原型,
以下代码是注册和调用回调函数。。。

//定义结构体
/*struct*/ TUssdCallbacks myCallbackFuncs;

//给结构体变量赋值
myCallbackFuncs.m_pOnUssdResponse = OnSendResponse;

//注册回调函数
int retRegisCallFun = RegisterUssdCallbackFunctions(myCallbackFuncs);

//回调方式接收设备返回的消息
static int CALLBACK OnSendResponse(HANDLE hLoginInstance, HANDLE hUssdDialog,
char szUssdString[], DWORD dwUssdAppParam)

{
AfxMessageBox("回调函数中接收消息");
return 0;
}
Hello_Wrorld_2010 2011-02-28
  • 打赏
  • 举报
回复
TUssdCallbacks myCallbackFuncs;
这行代码没有错误,

但是给结构体变量赋值的时候,有错误。。。
Hello_Wrorld_2010 2011-02-28
  • 打赏
  • 举报
回复
//给结构体赋值
/*struct*/ TUssdCallbacks myCallbackFuncs;
myCallbackFuncs.m_pOnUssdResponse = UssdSendRequest;
myCallbackFuncs.m_pOnUssdResponse = UssdSendResponse;



: error C2143: syntax error : missing ';' before '.'
: error C2501: 'myCallbackFuncs' : missing storage-class or type specifiers

: error C2371: 'myCallbackFuncs' : redefinition; different basic types
: see declaration of 'myCallbackFuncs'

: error C2143: syntax error : missing ';' before '.'
: error C2143: syntax error : missing ';' before '.'
: error C2501: 'myCallbackFuncs' : missing storage-class or type specifiers

: error C2371: 'myCallbackFuncs' : redefinition; different basic types
: see declaration of 'myCallbackFuncs'

: error C2143: syntax error : missing ';' before '.'
无水先生 2011-02-28
  • 打赏
  • 举报
回复
LPONUSSDREQUEST的定义应该给出.
wqt_007 2011-02-25
  • 打赏
  • 举报
回复
这确实是个很奇怪的问题,等待楼主结果。
Hello_Wrorld_2010 2011-02-25
  • 打赏
  • 举报
回复
//DLL头文件中代码如下

// ClientApi.h: interface for the USSD API routines.
//
#ifndef __CLIENT_API
#define __CLIENT_API

#define MAX_MSISDN_LENGTH 20
#define MAX_SERVICECODE_LENGTH 3
#define MAX_USSDSTRING_LENGTH 181

#define UT_REQUEST 1 // Request.
#define UT_NOTIFY 2 // Notify.
#define UT_RESPONSE 3 // Response.
#define UT_RELEASE 4 // Release.

#define UV_UNKNOWN 0x00 // 未知.
#define UV_PHASE_I 0x10 // Phase I (只能由移动台发起)
#define UV_PHASE_II 0x20 // Phase II
#define UV_PHASE_II_PLUS 0x25 // Phase II+

#define INVALID_INSTANCE_HANDLE ((HANDLE)-1)

struct TUssdSwitchInfo //业务转移信息
{
BYTE m_bSwitchMode;
char m_szMsIsdn[MAX_MSISDN_LENGTH + 1];
char m_szServiceCode[MAX_SERVICECODE_LENGTH + 1];
char m_szUssdString[MAX_USSDSTRING_LENGTH + 1];
};

struct TUssdChargeIndInfo //计费指示信息
{
DWORD m_dwChargeRatio;
DWORD m_dwChargeType;
char m_szChargeSource[MAX_MSISDN_LENGTH + 1];
BYTE m_bChargeLocation;
};

struct TUssdData
{
DWORD m_dwUssdCmd; // USSD会话操作类型(Request、Response、Abort、Error)
BYTE m_bUssdVersion; // USSD会话版本号(Phase I、Phase II、Phase II+)
BYTE m_bCodeScheme; //编码方案
DWORD m_dwErrorCode; // USSD错误代码(仅对UssdAbort和UssdError)
char m_szMsIsdn[MAX_MSISDN_LENGTH + 1]; // 移动台号码.
char m_szServiceCode[MAX_SERVICECODE_LENGTH + 1]; // 业务码.
char m_szUssdString[MAX_USSDSTRING_LENGTH + 1]; // USSD串内容。
DWORD m_dwUssdAppParam; // USSD业务应用程序自定义的参数。
};

//-----------------------------------------------------------------------------
// CallBack Functions For GetMessage
//------------------------------------------------------------------------------
typedef int (*LPONUSSDREQUEST)(HANDLE hLoginInstance, HANDLE hUssdDialog,
TUssdData UssdData, DWORD *pdwUssdAppParam);
typedef int (*LPONUSSDRESPONSE)(HANDLE hLoginInstance, HANDLE hUssdDialog,
char szUssdString[], DWORD dwUssdAppParam);
typedef int (*LPONUSSDABORT)(HANDLE hLoginInstance, HANDLE hUssdDialog,
DWORD dwErrorCode, DWORD dwUssdAppParam);
typedef int (*LPONUSSDERROR)(HANDLE hLoginInstance, HANDLE hUssdDialog,
DWORD dwErrorCode, DWORD dwUssdAppParam);
typedef int (*LPONUSSDTIMEOUT)(HANDLE hLoginInstance, HANDLE hUssdDialog,
DWORD dwUssdAppParam);

struct TUssdCallbacks
{
LPONUSSDREQUEST m_pOnUssdRequest;
LPONUSSDRESPONSE m_pOnUssdResponse;
LPONUSSDABORT m_pOnUssdAbort;
LPONUSSDERROR m_pOnUssdError;
LPONUSSDTIMEOUT m_pOnUssdTimeOut;
};

extern "C"
{
int PASCAL EXPORT UssdInit(char szServerAddress[],int nServicePort);
int PASCAL EXPORT UssdExit();
HANDLE PASCAL EXPORT UssdLogin(char szAccountName[],char szPassword[],int *pnErrorCode,BOOL fAutoConnect,DWORD dwTimeOut);
BOOL PASCAL EXPORT UssdLogout(HANDLE hLoginInstance,int *pnErrorCode);
BOOL PASCAL EXPORT UssdIsConnectionOK(HANDLE hLoginInstance);
void PASCAL EXPORT UssdGetErrorString(int nErrorCode,char *pszErrorString);
BOOL PASCAL EXPORT UssdReloadErrorInfoLib();
HANDLE PASCAL EXPORT UssdLocalOpen(HANDLE hLoginInstance, DWORD dwUssdAppParam, DWORD *pdwErrorCode);
BOOL PASCAL EXPORT UssdLocalClose(HANDLE hUssdDialog);
int PASCAL EXPORT UssdSendRequest(HANDLE hUssdDialog, TUssdData UssdData);
int PASCAL EXPORT UssdSendNotify(HANDLE hUssdDialog, TUssdData UssdData);
int PASCAL EXPORT UssdSendResponse(HANDLE hUssdDialog, TUssdData UssdData);
int PASCAL EXPORT UssdSendRelease(HANDLE hUssdDialog);
int PASCAL EXPORT UssdSendAbort(HANDLE hUssdDialog, DWORD dwErrorCode);
int PASCAL EXPORT UssdSendError(HANDLE hUssdDialog, DWORD dwErrorCode);
int PASCAL EXPORT UssdSendSwitch(HANDLE hUssdDialog, TUssdSwitchInfo SwitchInfo);
int PASCAL EXPORT UssdSendChargeInd(HANDLE hUssdDialog, TUssdChargeIndInfo ChargeIndInfo);
int PASCAL EXPORT RegisterUssdCallbackFunctions(TUssdCallbacks CallbackFuncs);
};

#endif // __CLIENT_API defined.
Hello_Wrorld_2010 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 year2002 的回复:]
//定义函数指针
typedef int (*LPONUSSDREQUEST)(void * hLoginInstance, void * hUssdDialog,
struct TUssdData UssdData, unsigned long *pdwUssdAppParam);

typedef int (*LPONUSSDRESPONSE)(void * hLoginInsta……
[/Quote]
------------------
这些是跟这个DLL文件对应的头文件中的代码。。。
Hello_Wrorld_2010 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 year2002 的回复:]
//定义函数指针
typedef int (*LPONUSSDREQUEST)(void * hLoginInstance, void * hUssdDialog,
struct TUssdData UssdData, unsigned long *pdwUssdAppParam);

typedef int (*LPONUSSDRESPONSE)(void * hLoginInsta……
[/Quote]
------------------
这些是跟这个DLL文件对应的头文件中的代码。。。
  • 打赏
  • 举报
回复
//定义函数指针
typedef int (*LPONUSSDREQUEST)(void * hLoginInstance, void * hUssdDialog,
struct TUssdData UssdData, unsigned long *pdwUssdAppParam);

typedef int (*LPONUSSDRESPONSE)(void * hLoginInstance, void * hUssdDialog,
char szUssdString[], unsigned long dwUssdAppParam);

//函数指针指向的函数
int PASCAL EXPORT UssdSendRequest(void * hUssdDialog, struct TUssdData UssdData);

int PASCAL EXPORT UssdSendResponse(void * hUssdDialog, struct TUssdData UssdData);

不明白你的意思,貌似你上面的函数指针定义,和下面的函数定义都对不上
Hello_Wrorld_2010 2011-02-25
  • 打赏
  • 举报
回复
这里有相关的开发文档。

华为开发ussd
http://d.download.csdn.net/down/521278/geeky
Hello_Wrorld_2010 2011-02-25
  • 打赏
  • 举报
回复
拷贝过去,提示结构体重定义,
主要是给结构体赋值的时候有问题。。。
  • 打赏
  • 举报
回复
把TUssdCallbacks的定义拷过去
Hello_Wrorld_2010 2011-02-25
  • 打赏
  • 举报
回复
下面的代码编译不通过,
error C2143: syntax error : missing ';' before '.'
error C2501: 'myCallbackFuncs' : missing storage-class or type specifiers


//定义结构体
/*struct*/ TUssdCallbacks myCallbackFuncs;
myCallbackFuncs.m_pOnUssdResponse = UssdSendRequest;
myCallbackFuncs.m_pOnUssdResponse = UssdSendResponse;

//SetMyCallBack(LPONUSSDRESPONSE pfunc);
//myCallbackFuncs->m_pOnUssdResponse = UssdSendRequest;
//myCallbackFuncs->m_pOnUssdResponse = UssdSendResponse;
  • 打赏
  • 举报
回复
可以啊,就是取下dll中的函数地址,在应用程序中再把那个地址转成函数定义就行了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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