使用capCreateCaptureWindowA编写拍照功能

zhou4521 2015-01-24 10:06:43
使用capCreateCaptureWindowA编写的拍照功能软件,在win8平板电脑上运行时出现
“ACCESS violation at address 691578BB in module ‘AVICAP32.DLL’.Read of address 00000020”
请问怎么解决呀,我编程时调试都能正常运行的。
...全文
1207 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,860

社区成员

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

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