关于控制台程序调用函数进不去函数里的问题(在MFC中尝试能正常进入)

hawjb528 2014-04-08 02:42:11
我在用控制台写一段代码时遇到这样一个问题~当调用if(!HK::PlayM4_SetDecCallBack(*nPort, DecCBFun)) 的方法时,程序进不去DecCBFun的内部,在void CALLBACK DecCBFun的断点不能触发,估计是逻辑结构写错了,求指导~
代码如下:
// SHOW.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "SHOW.h"
#include "PlayM4.h"
#pragma region Includes
#include <stdio.h>
#include <windows.h>
#pragma endregion

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

LONG *nPort;
long nPause;


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

void CALLBACK DecCBFun(long nPort, char * pBuf, long nSize, HK::FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2)
{
wprintf(L"call g_DecCBFun suceess.\n");
printf("nPort=%d,nSize=%d,pFrameInfo.nWidth=%ld,pFrameInfo.nHeight=%ld,pFrameInfo.nStamp=%ld,pFrameInfo.nType=%ld,pFrameInfo.nFrameRate=%ld.\n",
nPort,nSize,pFrameInfo->nWidth,pFrameInfo->nHeight,
pFrameInfo->nStamp,pFrameInfo->nType,pFrameInfo->nFrameRate);
}


void _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{


//int nRetCode = 0;

HMODULE hModule = ::GetModuleHandle(NULL);

if (hModule != NULL)
{
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
//nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。

CString str;
char path[1024];
memset(path,0,1024);
int nID = 0;
sprintf_s(path,"%s","20131226_20131226155939_20131226160037_155724.mp4");
nPort = ( LONG* )malloc( sizeof( long ));

if(!HK::PlayM4_OpenFile(*nPort,path))
{
AfxMessageBox(_T("cun"));
}else{
AfxMessageBox(CString(path));
}


if(!HK::PlayM4_SetDecCallBack(*nPort, DecCBFun))
{
TRACE("PlayM4_SetDecCallBack err");
//return;
}
else{
wprintf(L"Read from the file mapping:\n");

}


if(!HK::PlayM4_Play(*nPort,NULL))
{

AfxMessageBox(_T("paly err"));

}else{
nPause = PLAY;
}

}
}
else
{
_tprintf(_T("错误: GetModuleHandle 失败\n"));
//nRetCode = 1;
}

//return nRetCode;
//return 0;
}

程序可以运行,但是不能进入 CALLBACK DecCBFun 的内部,不能打印出 wprintf(L"call g_DecCBFun suceess.\n");
...全文
366 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-04-09
  • 打赏
  • 举报
回复
你没必要用定时器,我的例子中用定时器只是说明定时器的回调函数是在消息循环中被调用的。 除定时器外,很多Windows回调函数都是在消息循环中被调用的。所以 控制台程序想让回调函数被调用,必须有消息循环。 至于消息循环放在哪里合适,那就随便你了。
hawjb528 2014-04-09
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
我让你参考的意思是: 控制台程序想让回调函数被调用,必须有消息循环。
这个例子我可不可以这样理解呢: 这个程序的消息循环是用的SetTimer定时器跟GetMessage两种不同的方式实现的呢~ 我在我程序中想用消息循环只需选择其中一种方法,在 if(!HK::PlayM4_SetDecCallBack(*nPort, DecCBFun)) 的外面套个for循环, for (i=0;i<20;i++) { Sleep(500); HK::PlayM4_SetDecCallBack(*nPort, DecCBFun) if (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 就可以呢?
赵4老师 2014-04-09
  • 打赏
  • 举报
回复
hawjb528 2014-04-09
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
你没必要用定时器,我的例子中用定时器只是说明定时器的回调函数是在消息循环中被调用的。 除定时器外,很多Windows回调函数都是在消息循环中被调用的。所以 控制台程序想让回调函数被调用,必须有消息循环。 至于消息循环放在哪里合适,那就随便你了。
可以用了~膜拜!!!我发现这上面大部分的帖子都有您的回答~强悍之极,愚生佩服得五体投地,希望哪天技术能练就得像您这样
赵4老师 2014-04-08
  • 打赏
  • 举报
回复
我让你参考的意思是: 控制台程序想让回调函数被调用,必须有消息循环。
hawjb528 2014-04-08
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
仅供参考
#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {
    struct tm *now;
    struct timeb tb;

    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,s);
}
VOID CALLBACK myTimerProc1(
  HWND hwnd, // handle of window for timer messages
  UINT uMsg, // WM_TIMER message
  UINT idEvent, // timer identifier
  DWORD dwTime // current system time
) {
 log("In myTimerProc1\n");
}
VOID CALLBACK myTimerProc2(
  HWND hwnd, // handle of window for timer messages
  UINT uMsg, // WM_TIMER message
  UINT idEvent, // timer identifier
  DWORD dwTime // current system time
) {
 log("In myTimerProc2\n");
}
int main() {
    int i;
    MSG msg;

    SetTimer(NULL,0,1000,myTimerProc1);
    SetTimer(NULL,0,2000,myTimerProc2);
    for (i=0;i<20;i++) {
        Sleep(500);
        log("In main\n");
        if (GetMessage(&msg,NULL,0,0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

    }
    return 0;
}
//2012-07-26 17:29:06.375 In main
//2012-07-26 17:29:06.875 In myTimerProc1
//2012-07-26 17:29:07.375 In main
//2012-07-26 17:29:07.875 In myTimerProc2
//2012-07-26 17:29:08.375 In main
//2012-07-26 17:29:08.375 In myTimerProc1
//2012-07-26 17:29:08.875 In main
//2012-07-26 17:29:08.875 In myTimerProc1
//2012-07-26 17:29:09.375 In main
//2012-07-26 17:29:09.890 In myTimerProc2
//2012-07-26 17:29:10.390 In main
//2012-07-26 17:29:10.390 In myTimerProc1
//2012-07-26 17:29:10.890 In main
//2012-07-26 17:29:10.890 In myTimerProc1
//2012-07-26 17:29:11.390 In main
//2012-07-26 17:29:11.890 In myTimerProc2
//2012-07-26 17:29:12.390 In main
//2012-07-26 17:29:12.390 In myTimerProc1
//2012-07-26 17:29:12.890 In main
//2012-07-26 17:29:12.890 In myTimerProc1
//2012-07-26 17:29:13.390 In main
//2012-07-26 17:29:13.890 In myTimerProc2
//2012-07-26 17:29:14.390 In main
//2012-07-26 17:29:14.390 In myTimerProc1
//2012-07-26 17:29:14.890 In main
//2012-07-26 17:29:14.890 In myTimerProc1
//2012-07-26 17:29:15.390 In main
//2012-07-26 17:29:15.890 In myTimerProc2
//2012-07-26 17:29:16.390 In main
//2012-07-26 17:29:16.390 In myTimerProc1
//2012-07-26 17:29:16.890 In main
//2012-07-26 17:29:16.890 In myTimerProc1
//2012-07-26 17:29:17.390 In main
//2012-07-26 17:29:17.890 In myTimerProc2
//2012-07-26 17:29:18.390 In main
//2012-07-26 17:29:18.390 In myTimerProc1
//2012-07-26 17:29:18.890 In main
//2012-07-26 17:29:18.890 In myTimerProc1
//2012-07-26 17:29:19.390 In main
//2012-07-26 17:29:19.890 In myTimerProc2
额~如果把void log(char *s)写成void CALLBACK log(char *s) ,然后在main里面调用log("In myTimerProc1\n")跟log("In myTimerProc2\n")是错误的吗
赵4老师 2014-04-08
  • 打赏
  • 举报
回复
仅供参考
#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {
    struct tm *now;
    struct timeb tb;

    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,s);
}
VOID CALLBACK myTimerProc1(
  HWND hwnd, // handle of window for timer messages
  UINT uMsg, // WM_TIMER message
  UINT idEvent, // timer identifier
  DWORD dwTime // current system time
) {
 log("In myTimerProc1\n");
}
VOID CALLBACK myTimerProc2(
  HWND hwnd, // handle of window for timer messages
  UINT uMsg, // WM_TIMER message
  UINT idEvent, // timer identifier
  DWORD dwTime // current system time
) {
 log("In myTimerProc2\n");
}
int main() {
    int i;
    MSG msg;

    SetTimer(NULL,0,1000,myTimerProc1);
    SetTimer(NULL,0,2000,myTimerProc2);
    for (i=0;i<20;i++) {
        Sleep(500);
        log("In main\n");
        if (GetMessage(&msg,NULL,0,0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

    }
    return 0;
}
//2012-07-26 17:29:06.375 In main
//2012-07-26 17:29:06.875 In myTimerProc1
//2012-07-26 17:29:07.375 In main
//2012-07-26 17:29:07.875 In myTimerProc2
//2012-07-26 17:29:08.375 In main
//2012-07-26 17:29:08.375 In myTimerProc1
//2012-07-26 17:29:08.875 In main
//2012-07-26 17:29:08.875 In myTimerProc1
//2012-07-26 17:29:09.375 In main
//2012-07-26 17:29:09.890 In myTimerProc2
//2012-07-26 17:29:10.390 In main
//2012-07-26 17:29:10.390 In myTimerProc1
//2012-07-26 17:29:10.890 In main
//2012-07-26 17:29:10.890 In myTimerProc1
//2012-07-26 17:29:11.390 In main
//2012-07-26 17:29:11.890 In myTimerProc2
//2012-07-26 17:29:12.390 In main
//2012-07-26 17:29:12.390 In myTimerProc1
//2012-07-26 17:29:12.890 In main
//2012-07-26 17:29:12.890 In myTimerProc1
//2012-07-26 17:29:13.390 In main
//2012-07-26 17:29:13.890 In myTimerProc2
//2012-07-26 17:29:14.390 In main
//2012-07-26 17:29:14.390 In myTimerProc1
//2012-07-26 17:29:14.890 In main
//2012-07-26 17:29:14.890 In myTimerProc1
//2012-07-26 17:29:15.390 In main
//2012-07-26 17:29:15.890 In myTimerProc2
//2012-07-26 17:29:16.390 In main
//2012-07-26 17:29:16.390 In myTimerProc1
//2012-07-26 17:29:16.890 In main
//2012-07-26 17:29:16.890 In myTimerProc1
//2012-07-26 17:29:17.390 In main
//2012-07-26 17:29:17.890 In myTimerProc2
//2012-07-26 17:29:18.390 In main
//2012-07-26 17:29:18.390 In myTimerProc1
//2012-07-26 17:29:18.890 In main
//2012-07-26 17:29:18.890 In myTimerProc1
//2012-07-26 17:29:19.390 In main
//2012-07-26 17:29:19.890 In myTimerProc2

64,648

社区成员

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

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