Access中OLE字段数据是用户直接打开Access把位图文件加入到字段中的,该字段显示为位图文件,怎么能够使用VC编程打开该位图文件?

解决方案 »

  1.   

    如果是简单的纯文件:存为临时文件,调用IPicture接口,当然如果你自己对图象格式很在行,可以自己解码,BMP的格式比较简单
    是包:那就麻烦了,自己解码看看吧
      

  2.   

    请参考;
    在用Visual     C++编写应用程序时,常会遇到如何存取数据库中大对象的问题。大对象文档以二进制数据形式保存在BLOB类型的字段中,这些大对象可能是Word、Execl或图片文件等,目前多数数据库都支持BLOB类型的字段。           
          
        VC存取这些大对象数据有众多方法,如OLE、ActiveX等,事实上VC的MFC提供了一个很方便的实现方法,即利用MFC提供的CLongBinary类可以方便地实现存取BLOB字段。下面笔者将举例说明。           
          
        首先用以下SQL语句建一个含BLOB字段的数据表:           
          
        CREATE     TABLE     REPORTTABLE(REGISTERNUM     CHAR(12)     NOT     NULL,REPORT     BLOB(5M),PRIMARY     KEY(REGISTERNUM));           
          
        建完该表后,配置好ODBC数据源,设定数据源名为ABCDB。           
          
        我们用VC的MFC     AppWizard建一个新的Project,设定项目名为ABC,下一步选Single     Document,在提示你想包含什么样的数据库支持时,选Header     files     only,然后完成建立。           
          
        接着在Resources的Dailog资源中新建一个FormView,打开该FormView,启用ClassWizard,建立一个新类,设定类名叫CReportRecordSet,Base     Class选CRecordSet,然后选ABCDB为数据源,再选择表REPORTTABLE,启动ClassWizrd,并建立新类CReportFormView,Base     Class为CRecordView,选Recordset时,选CReportRecordSet。           
          
        打开ReportRecordSet.h,找到该行:CString     m_REPORT;     改为CLongBinary     m_REPORT;这样程序就知道m_REPORT是和BLOB字段交换数据。同样,我们还需要修改另外几处,打开ReportRecordSet.cpp后,删除m_REPORT     =     _T("");一句。再找到RFX_Text(pFX,     _T("[REPORT]"),     m_REPORT);一句,将其改为RFX_LongBinary(pFX,     _T("[REPORT]"),     m_REPORT);     ODBC方法存取数据库时使用RFX_LongBinary;DAO方法则用DFX_LongBinary。           
          
        再次打开FormView,添加一个Edit控件,并用ClassWizard将它和member     variable     m_pSet-〉m_     REGISTERNUM关联,然后在FormView上增加三个按键,Caption名分别叫“取得Word文档”、“更新word文档”、“新增word文档”。并分别为这三个按键建立各自的Function,然后我们为这三个按键增加相应的代码。在按键“取得Word文档”的Function中加入如下代码:           
          
        try     //该程序的所在当前目录是e:\qc\abc\           
          
        {     if     (m_pSet-〉IsEOF())           
          
        AfxMessageBox("没有该小组的成果报告");           
          
        else     {//下面检测临时文件tyj.doc是否存在           
          
        HANDLE     hFind;           
          
        WIN32_FIND_DATA     findData     =     {0};           
          
        hFind=FindFirstFile("e:\\qc\\abc\\tyj.doc",&&findData);           
          
        //     FindFirstFile是Windows     API     函数           
          
        if(hFind     =     =     INVALID_HANDLE_VALUE)           
          
        AfxMessageBox("不存在临时文件");           
          
        else           
          
        {AfxMessageBox("有临时文件");           
          
        DeleteFile("e:\\qc\\abc\\tyj.doc");           
          
        //利用API函数删除该临时文件           
          
        }           
          
        CString     strFileName="e:\\qc\\abc\\tyj.doc";           
          
        CFile     outFile(strFileName,CFile::modeCreate     ¦CFile::modeWrite);           
          
        //modeCreate指示构造函数创建一个新文件           
          
        //下面这段把已经在内存中的BLOB字段数据内容写到临时生成的文件tyj.doc中           
          
        LPSTR     buffer     =     (LPSTR)GlobalLock(m_pSet-〉m_REPORT.m_hData);           
          
        outFile.WriteHuge(buffer,m_pSet-〉m_REPORT.m_dwDataLength);           
          
        GlobalUnlock(m_pSet-〉m_REPORT.m_hData);           
          
        outFile.Close();           
          
        ShellExecute(NULL,NULL,_T("tyj.doc"),NULL,_T("e:\\qc\\abc\\"),NULL);           
          
        //下面执行外部程序,Word会自动启动并打开tyj.doc}     }           
          
             catch(CExceptionpE)           
          
             {     pE-〉ReportError();           
          
             pE-〉Delete();           
          
             return;     }           
          
        在按键“更新word文档”的Function中加入以下程序代码:           
          
             m_pSet-〉Edit();     //     声明编辑当前记录           
          
             UpdateData(TRUE);           
          
             CFile     fileword;           
          
             CFileStatus     fileStatus;           
          
             CString     fileLocate;           
          
             static     char     BASED_CODE     szFilter[]     =     "WORD     Files     (.doc)     ¦.doc     ¦     ¦";           
          
        //     下面将弹出典型的打开文件对话框,您可以选择任何目录下的.doc文件           
          
             CFileDialog     dlg(TRUE,NULL,NULL,0,szFilter,this);           
          
             if(dlg.DoModal()=     =IDOK)           
          
             fileLocate=dlg.GetPathName();           
          
             else           
          
             fileLocate="";           
          
             if(fileLocate=     ="")           
          
             AfxMessageBox("您没选文件");           
          
             else{           
          
        fileword.Open(fileLocate,CFile::modeRead);           
          
        fileword.GetStatus(fileStatus);           
          
        m_pSet-〉m_REPORT.m_dwDataLength=fileStatus.m_size;           
          
             HGLOBAL     hGlobal     =     GlobalAlloc(GPTR,fileStatus.m_size);           
          
             m_pSet-〉m_REPORT.m_hData     =     GlobalLock(hGlobal);           
          
        fileword.ReadHuge(m_pSet-〉m_REPORT.m_hData,fileStatus.m_size);           
          
        //把您选择的文件的数据写入m_pSet-〉m_REPORT           
          
             m_pSet-〉SetFieldDirty(&&m_pSet-〉m_REPORT);           
          
             m_pSet-〉SetFieldNull(&&m_pSet-〉m_REPORT,FALSE);           
          
             m_pSet-〉Update();     //     更新记录           
          
             GlobalUnlock(hGlobal);     }           
          
        上述代码只要稍做修改,即可把Execl等各类文件存入数据库中。对应按键“新增word文档”只需要复制“更新Word文档”中的代码,并把m_pSet-〉Edit();换成m_pSet-〉AddNew();即可。完成上述步骤后,打开abc.cpp,把RUNTIME_CLASS(CAbcView));这句换成RUNTIME_CLASS(CReportFormView));     这样程序启动时就显示了该FormView。
      

  3.   

    先把二进制字段的内容读取到你开辟的空间里,然后分析一下是什么格式的图像文件.
    如果是BMP格式的,MFC里有一个LPBITMAPINFO对象,你查看一下他的用法,很简单.
    如果是其他的文件格式就比较麻烦,需要了解该格式的文件定义格式,自己解码.
      

  4.   

    我想楼主所说的问题关键是 用户是以包的形式存入到ACCESS中去的,该包实际上并不仅仅包含BMP文件数据,还有一些微软的说明,楼主需要知道的是包的格式,或者有什么程序办法来把包打开我也同样想知道
      

  5.   

    有没有哪位大侠会WIN32 API 读取位图的,麻烦告诉小弟一声,我QQ;170478872