不升级sdk = 一大堆东西未定义
升级sdk = uuid.lib(mshtml_i.obj) : fatal error LNK1103: debugging information corrupt; recompile module放到高版本vc编译都没问题,但我喜欢vc6
试过网上说的到tools-options里调整sdk路径顺序,各种排列组合都试了,结果就是在未定义和1103这两结果间徘徊
当然如果不生成Debug版本,直接生成Release是可以用的,但运行中经常会出错难道没有终极解决办法吗?另外我想知道这个问题出现的原因请各位大虾指教,谢谢了

解决方案 »

  1.   

    崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
      

  2.   

    谢谢 zhao4zhong1,红色字体部分的要求超出了本人基础知识范畴,同时进一步凸显了本人学习汇编能力和结项要求时限的巨大矛盾还有其他办法么
      

  3.   

    如果有mshtml不兼容,你即使编译过了,还是可能如你说的,运行的时候出错,而且这个错误如果是在mshtml中你根本没法避免。
      

  4.   

    有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行! 写日志到文件参考下面:
    //循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
    //a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
    //在处理的时候每次从新buffer中取两个字节打印
    #ifdef _MSC_VER
        #pragma warning(disable:4996)
    #endif
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #ifdef _MSC_VER
        #include <windows.h>
        #include <process.h>
        #include <io.h>
        #define  MYVOID             void
        #define  vsnprintf          _vsnprintf
    #else
        #include <unistd.h>
        #include <sys/time.h>
        #include <pthread.h>
        #define  CRITICAL_SECTION   pthread_mutex_t
        #define  MYVOID             void *
    #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 _MSC_VER
    void Lock(CRITICAL_SECTION *l) {
        EnterCriticalSection(l);
    }
    void Unlock(CRITICAL_SECTION *l) {
        LeaveCriticalSection(l);
    }
    void sleep_ms(int ms) {
        Sleep(ms);
    }
    #else
    void Lock(CRITICAL_SECTION *l) {
        pthread_mutex_lock(l);
    }
    void Unlock(CRITICAL_SECTION *l) {
        pthread_mutex_unlock(l);
    }
    void sleep_ms(int ms) {
        usleep(ms*1000);
    }
    #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}
    #define ASIZE    200
    #define BSIZE    240
    #define CSIZE      2
    char Abuf[ASIZE];
    char Cbuf[CSIZE];
    CRITICAL_SECTION cs_HEX;
    CRITICAL_SECTION cs_BBB;
    struct FIFO_BUFFER {
        int  head;
        int  tail;
        int  size;
        char data[BSIZE];
    } BBB;
    int No_Loop=0;
    void HexDump(int cn,char *buf,int len) {
        int i,j,k;
        char binstr[80];    Lock(&cs_HEX);
        for (i=0;i<len;i++) {
            if (0==(i%16)) {
                sprintf(binstr,"%03d %04x -",cn,i);
                sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            } else if (15==(i%16)) {
                sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
                sprintf(binstr,"%s  ",binstr);
                for (j=i-15;j<=i;j++) {
                    sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
                }
                Log("%s\n",binstr);
            } else {
                sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            }
        }
        if (0!=(i%16)) {
            k=16-(i%16);
            for (j=0;j<k;j++) {
                sprintf(binstr,"%s   ",binstr);
            }
            sprintf(binstr,"%s  ",binstr);
            k=16-k;
            for (j=i-k;j<i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            Log("%s\n",binstr);
        }
        Unlock(&cs_HEX);
    }
    int GetFromRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {
        int lent,len1,len2;    lent=0;
        Lock(cs);
        if (fbuf->size>=len) {
            lent=len;
            if (fbuf->head+lent>BSIZE) {
                len1=BSIZE-fbuf->head;
                memcpy(buf     ,fbuf->data+fbuf->head,len1);
                len2=lent-len1;
                memcpy(buf+len1,fbuf->data           ,len2);
                fbuf->head=len2;
            } else {
                memcpy(buf     ,fbuf->data+fbuf->head,lent);
                fbuf->head+=lent;
            }
            fbuf->size-=lent;
        }
        Unlock(cs);
        return lent;
    }
    MYVOID thdB(void *pcn) {
        char        *recv_buf;
        int          recv_nbytes;
        int          cn;
        int          wc;
        int          pb;    cn=(int)pcn;
        Log("%03d thdB              thread begin...\n",cn);
        while (1) {
            sleep_ms(10);
            recv_buf=(char *)Cbuf;
            recv_nbytes=CSIZE;
            wc=0;
            while (1) {
                pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);
                if (pb) {
                    Log("%03d recv %d bytes\n",cn,pb);
                    HexDump(cn,recv_buf,pb);
                    sleep_ms(1);
                } else {
                    sleep_ms(1000);
                }
                if (No_Loop) break;//
                wc++;
                if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
            }
            if (No_Loop) break;//
        }
    #ifndef _MSC_VER
        pthread_exit(NULL);
    #endif
    }
    int PutToRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {
        int lent,len1,len2;    Lock(cs);
        lent=len;
        if (fbuf->size+lent>BSIZE) {
            lent=BSIZE-fbuf->size;
        }
        if (fbuf->tail+lent>BSIZE) {
            len1=BSIZE-fbuf->tail;
            memcpy(fbuf->data+fbuf->tail,buf     ,len1);
            len2=lent-len1;
            memcpy(fbuf->data           ,buf+len1,len2);
            fbuf->tail=len2;
        } else {
            memcpy(fbuf->data+fbuf->tail,buf     ,lent);
            fbuf->tail+=lent;
        }
        fbuf->size+=lent;
        Unlock(cs);
        return lent;
    }
    MYVOID thdA(void *pcn) {
        char        *send_buf;
        int          send_nbytes;
        int          cn;
        int          wc;
        int           a;
        int          pa;    cn=(int)pcn;
        Log("%03d thdA              thread begin...\n",cn);
        a=0;
        while (1) {
            sleep_ms(100);
            memset(Abuf,a,ASIZE);
            a=(a+1)%256;
            if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop
            send_buf=(char *)Abuf;
            send_nbytes=ASIZE;
            Log("%03d sending %d bytes\n",cn,send_nbytes);
            HexDump(cn,send_buf,send_nbytes);
            wc=0;
            while (1) {
                pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);
                Log("%03d sent %d bytes\n",cn,pa);
                HexDump(cn,send_buf,pa);
                send_buf+=pa;
                send_nbytes-=pa;
                if (send_nbytes<=0) break;//
                sleep_ms(1000);
                if (No_Loop) break;//
                wc++;
                if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
            }
            if (No_Loop) break;//
        }
    #ifndef _MSC_VER
        pthread_exit(NULL);
    #endif
    }
    int main() {
    #ifdef _MSC_VER
        InitializeCriticalSection(&cs_log);
        InitializeCriticalSection(&cs_HEX);
        InitializeCriticalSection(&cs_BBB);
    #else
        pthread_t threads[2];
        int threadsN;
        int rc;
        pthread_mutex_init(&cs_log,NULL);
        pthread_mutex_init(&cs_HEX,NULL);
        pthread_mutex_init(&cs_BBB,NULL);
    #endif
        Log("Start===========================================================\n");    BBB.head=0;
        BBB.tail=0;
        BBB.size=0;#ifdef _MSC_VER
        _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);
        _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2);
    #else
        threadsN=0;
        rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
        rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
    #endif    if (!access("No_Loop",0)) {
            remove("No_Loop");
            if (!access("No_Loop",0)) {
                No_Loop=1;
            }
        }
        while (1) {
            sleep_ms(1000);
            if (No_Loop) break;//
            if (!access("No_Loop",0)) {
                No_Loop=1;
            }
        }
        sleep_ms(3000);
        Log("End=============================================================\n");
    #ifdef _MSC_VER
        DeleteCriticalSection(&cs_BBB);
        DeleteCriticalSection(&cs_HEX);
        DeleteCriticalSection(&cs_log);
    #else
        pthread_mutex_destroy(&cs_BBB);
        pthread_mutex_destroy(&cs_HEX);
        pthread_mutex_destroy(&cs_log);
    #endif
        return 0;
    }
      

  5.   

    谢谢!
    说到这个,我有个问题,我写的代码如果2-3周不看,会基本忘光,你们是怎么记的?而且工程越写越大,里面的逻辑有时也会越来越不清晰,如果日子久了回头看,感觉会有云里雾里的感觉,你们是怎么管理、记录工程的呢?再回头,vc6 到底有没有办法用上mshtml了?
    谢谢
      

  6.   

    升级下VS吧
    VC6都已经是快20前的东西了。
      

  7.   

    vc6 是
    MSHTML.DLL (IE4/MSHTML).
      

  8.   

    MSHTML没用过,是做什么的?
      

  9.   

    想用MSHTML解析下载下来的html直接搜我帖子的标题,看到个帖子:
    VC6.0 使用mshtml解析html - jinyaba的专栏 - 博客频道 - CSDN.NET
    http://blog.csdn.net/jinyaba/article/details/17097323结合akirya、schlafenhamster的回答,我想我也基本知道问题出在哪里了微软的编程框架让我们对这个系统的中间层,甚至是用户层依赖越来越严重了,多了很多方便,却少了很多自主
    就连使用htmlcxx最新版,也必须是vs2010编译,vc2013编译因ide版本过高,都找不到入口,编译好了htmlcxx.lib,放到vc6还是用不了,原因如上,真是我靠我靠我靠靠靠,要解决这个问题非得大牛水准了,我等伸手党日子越来越不好过了想改用vs2013的,毕竟asp都用它开发,也用得顺手,但做出来的mfc在xp、win7、win8都没法运行,提示无法运行,改编译属性为xp平台,改静态链接,拿到xp、win7环境运行,又提示缺这个dll缺那个dll,这样的ide升级还让不让菜鸟活了,只有用vc6写的东西通用性最强,但想用GetIfTable2()这样的函数,还又要用新的ide和新系统,我的天啊,真是矛盾大家有什么好建议啊,你们是怎么处理这种矛盾的啊,谢谢大家的指教了
      

  10.   

    不知道能不能 用 GetIfTable 函数
      

  11.   

    GetIfTable能用,xp下正常,高版本的系统就不能返回数据了,要用GetIfTable2,但这函数在xp + vc6 + 98SDK环境下提示未定义
      

  12.   

    XP 都停止更新几年了?另外解析html印象有开源的解析库,ms不方便用,用开源的啊。
      

  13.   

    VC6支持的SDK版本最高只到XP Sp2。升级编译器或者降级SDK。