使用capCreateCaptureWindowA编写拍照功能

zhou4521 2015-01-24 10:06:43
使用capCreateCaptureWindowA编写的拍照功能软件,在win8平板电脑上运行时出现
“ACCESS violation at address 691578BB in module ‘AVICAP32.DLL’.Read of address 00000020”
请问怎么解决呀,我编程时调试都能正常运行的。
...全文
1150 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
有时想起 2015-07-16
  • 打赏
  • 举报
回复
API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL 同求啊 win8.1真心坑
赵4老师 2015-02-02
  • 打赏
  • 举报
回复
请判断每次函数调用的返回值。
zhou4521 2015-02-02
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
我猜搜→我才搜
能帮我看看我的代码有问题没有吗
bool CVFWCap::Start()
{
        _hWndc = capCreateCaptureWindowA( "Capture Window",WS_CHILD | WS_VISIBLE ,
           0,0,_panel->Width,_panel->Height,_panel->Handle,0);
        if (_hWndc != 0)
        {
            capDriverDisconnect( _hWndc);
LABEL_RETRY:
            bool hr;
            int i=0;
            do
            {
                hr = capDriverConnect(_hWndc, 0);
            }
            while (++i < 10 && !hr);
            if ( hr )
            {
                CAPDRIVERCAPS gCapDriverCaps;
                capDriverGetCaps(_hWndc, &gCapDriverCaps, sizeof(CAPDRIVERCAPS));
                if (gCapDriverCaps.fHasOverlay)   //检查驱动器是否有叠加能力
                {
                    try
                    {
                        capOverlay(_hWndc,true);   //启动Overlay模式
                    }
                    catch (Exception &exception)
                    {
                        Application->ShowException(&exception);
                    }
                }
                else
                {
                    capPreview(_hWndc,true);    //启动Preveiew模式
                    capPreviewRate(_hWndc, 1);
                    capPreviewScale( _hWndc, true );
                }
            }
            else
            {
                if ( Application->MessageBoxA("捕捉驱动创建失败,是否重试!","Failed",21) == 4 )
                {
                    goto LABEL_RETRY;
                }
                isRun = false;
                return false;
            }
        }
        ErrorCount = 0;
        isRun = true;
        return true;
}
现在运行问题是在win8平板上运行没有视频捕捉窗口,跟踪运行发现摄像头是链接成功,选择的是overlay模式
zhou4521 2015-01-30
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
用depends.exe查看Debug和Release版分别依赖哪些dll
大致明白了是win8.1系统的问题,没有这些dll API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL EXT-MS-WIN-NTUSER-UICONTEXT-EXT-L1-1-0.DLL IESHIMS.DLL 我在网上只找到5个 这个API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL找了半天没找到,各位有遇到过吗?
赵4老师 2015-01-30
  • 打赏
  • 举报
回复
我猜搜→我才搜
赵4老师 2015-01-30
  • 打赏
  • 举报
回复
引用 14 楼 zhou4521 的回复:
[quote=引用 13 楼 zhao4zhong1 的回复:] http://api.dllzj.com/search/search.aspx?name=API-MS-WIN-CORE-SHUTDOWN
你发的这个是API-MS-WIN-CORE-SHUTDOWN-L1-1-0.DLL[/quote] 没有API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL,我猜搜API-MS-WIN-CORE-SHUTDOWN的。 再试试这个: http://www.baigoogledu.com/s.php?hl=zh-CN&q=%A1%B0API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL%A1%B1
zhou4521 2015-01-30
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
http://api.dllzj.com/search/search.aspx?name=API-MS-WIN-CORE-SHUTDOWN
你发的这个是API-MS-WIN-CORE-SHUTDOWN-L1-1-0.DLL
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
用depends.exe查看Debug和Release版分别依赖哪些dll
cutmelon 2015-01-29
  • 打赏
  • 举报
回复
按照我的经验,调试不出错而运行出错,最大的可能就是某个或某些变量没赋初值,debug版默认弄成0的,release版就不知道是什么了,然后就各种crash
zhou4521 2015-01-29
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行! 写日志到文件参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    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,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef WIN32
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
    }
#ifdef WIN32
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}
//1-78行添加到你带main的.c或.cpp的那个文件的最前面
//81-85行添加到你的main函数开头
//89-93行添加到你的main函数结束前
//在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中
非常感谢这位大哥
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行! 写日志到文件参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    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,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef WIN32
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
    }
#ifdef WIN32
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}
//1-78行添加到你带main的.c或.cpp的那个文件的最前面
//81-85行添加到你的main函数开头
//89-93行添加到你的main函数结束前
//在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中
zhou4521 2015-01-29
  • 打赏
  • 举报
回复
这是在平板上使用报错的情况
这是调试时候的正确情况
zhou4521 2015-01-29
  • 打赏
  • 举报
回复
有懂的人吗,这问题搞了2周了,快疯了
zhou4521 2015-01-29
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 使用“驱动精灵”软件升级能升级的显卡或摄像头驱动。
我是编译好了 在平板上使用的,平板上哪来按键啊
赵4老师 2015-01-27
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 使用“驱动精灵”软件升级能升级的显卡或摄像头驱动。
zhou4521 2015-01-27
  • 打赏
  • 举报
回复
引用 2 楼 coding_hello 的回复:
这怎么跟你说怎么解决啊。。。。把bug找出来解决。。。定位出错的位置,靠打印什么的,然后再仔细分析相关代码。只能这样了
问题是调试没有错呀,只是在win8平板上使用出现这个错误提示 我在win8平板上使用时摄像头能够找去到的
野男孩 2015-01-26
  • 打赏
  • 举报
回复
这怎么跟你说怎么解决啊。。。。把bug找出来解决。。。定位出错的位置,靠打印什么的,然后再仔细分析相关代码。只能这样了
砖家的谎言 2015-01-25
  • 打赏
  • 举报
回复
高手都是多啊

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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