真心发自肺腑的求一个关于"回调函数的问题",为什么我的回调函数alt+G跳不进去,编译器是怎么找到回调函数执行的代码,附代码,求耐心的你

gjskxy 2011-03-31 07:19:49
真心发自肺腑的求一个关于"回调函数的问题",为什么我的回调函数alt+G跳不进去,编译器是怎么找到回调函数执行的代码,附代码,求耐心的你

求你分析下面函数的 RecvCallBackFun 到底是执行的神马代码啊


struct PER_IO_OPERATION_DATA_ : public WSAOVERLAPPED
{
WSABUF Buffer;
char szMessage[MAXRECVLEN];
DWORD NumberOfBytesRecvd;
DWORD Flags;
SOCKET sClient;
DWORD NumberRecvd;
COverlappedBase *pCommObject;
};



void CALLBACK RecvCompletionRoutine(DWORD dwError,DWORD cbTransferred,
LPWSAOVERLAPPED lpOverlapped,DWORD dwFlags)
{
LPPER_IO_OPERATION_DATA lpPerIOData = (LPPER_IO_OPERATION_DATA)lpOverlapped;

//将数据丢入缓冲区
//调用各UE的回调函数
lpPerIOData->NumberRecvd = cbTransferred;
lpPerIOData->pCommObject->RecvCallBackFun(lpPerIOData);

//重新投递接收请求
memset(lpPerIOData,0,sizeof(WSAOVERLAPPED));
//Sleep(60);
if(WSARecv(lpPerIOData->sClient,
&lpPerIOData->Buffer,
1,
&lpPerIOData->NumberOfBytesRecvd,
&lpPerIOData->Flags,
&static_cast<OVERLAPPED&>(*lpPerIOData),
RecvCompletionRoutine))
{
if(WSA_IO_PENDING != WSAGetLastError())
{
PRINT_LOG("CSocketManage","WorkerThread","WSARecv failed!: %ld, Line:%ld", WSAGetLastError(), __LINE__);
}
}
}

断点调试的时候 貌似进了下面这个函数,我想问的是 理由和原因,它是依据神马进的,我能让它进别的函数吗
bool CCommunicateV2::doMsg(UINT8* pData, UINT32 unDataLen)
{
/*
消息的结构:(head)9F 9F (len)0 0 0 5 (info)01 02 03 04 05
判断m_oOmUnFrameStateST当前的解帧状态,包含三部分head、len、info
*/
......

}

...全文
77 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-04-06
  • 打赏
  • 举报
回复
这是编译器提供的库里的,你用VS的话,选中CALLBACK,右击 go to definition就能看到。
当然,具体这个CALLBACK被定义成什么,还和你编译设置有关。


我的vs2005 windef.h里

#ifdef _MAC
#define CALLBACK PASCAL
#define WINAPI CDECL
#define WINAPIV CDECL
#define APIENTRY WINAPI
#define APIPRIVATE CDECL
#ifdef _68K_
#define PASCAL __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY WINAPI
#define APIPRIVATE
#define PASCAL pascal
#endif
gjskxy 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luciferisnotsatan 的回复:]
#define CALLBACK __stdcall
这个CALLBACK就是给程序员看的。


lpPerIOData->pCommObject->RecvCallBackFun(lpPerIOData);

RecvCallBackFun这应该就是一个函数指针。指向的函数原型接收一个 LPPER_IO_OPERATION_DATA 型参数,返回值从你的代码里看不出来。比如,你这个R……
[/Quote]

求求了,我的代码里怎么没有CALLBACK __stdcall
luciferisnotsatan 2011-04-06
  • 打赏
  • 举报
回复
#define CALLBACK __stdcall
这个CALLBACK就是给程序员看的。


lpPerIOData->pCommObject->RecvCallBackFun(lpPerIOData);

RecvCallBackFun这应该就是一个函数指针。指向的函数原型接收一个 LPPER_IO_OPERATION_DATA 型参数,返回值从你的代码里看不出来。比如,你这个RecvCallBackFun 指向 void xxx(LPPER_IO_OPERATION_DATA data)
那行代码等价于
xxx(lpPerIOData);
luciferisnotsatan 2011-04-06
  • 打赏
  • 举报
回复
回调函数不就是一个参数类型为函数指针的参数么。函数里通过该指针调用传入的那个函数。
gjskxy 2011-04-06
  • 打赏
  • 举报
回复
没人回吗

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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