您好,我有个问题想请教尊驾
_StreamPtr pStm;
pStm.CreateInstance("ADODB.Stream");
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
pStm->PutType(adTypeBinary);
pStm->Open(varOptional,adModeUnknown,adOpenStreamUnspecified,_bstr_t(),_bstr_t());
pStm->LoadFromFile(m_Path);//读入文件
variant_t varBLOB=pStm->Read(adReadAll);
m_pRs->GetFields()->GetItem("image_data")->Value=varBLOB;//保存到数据集对象
如上,pStm->LoadFromFile(m_Path);当m_Path用"E:\\1.jpg"来代替的话,我的程序可以正常运行,但是如果我通过控件GetFilename来获得路径名时,定义CString mPath;_bstr_t m_Path=mPath.AllocSysString();mPath的值是通过GetFilename来得到的,其类型是CString,现在我运行的话,就会出错,能告诉我这是为什么吗,斗胆请教。

解决方案 »

  1.   

    你用的CFileDialog::GetFileName()吗?它只会返回不包含路径的文件名:
    "For example, GetFileName will return "TEXT.DAT" for the file C:\FILES\TEXT.DAT."
      

  2.   

    SORRY,我打错了,我用的是CFileDialog::GetPathName();
      

  3.   

    编译的时候是没有错误的,但是当我运行这个程序时,假设我在本地选择了某一路径,当我把这个路径传送给mPath,然后再转化为_bstr_t之后,pStm->LoadFromFile(m_Path);运行就通不过了。
      

  4.   

    看了一下LoadFromFile的文檔上只說了一種產生運行時錯誤的情況:文件不存在
    所以你還是應該從路徑的字符串上找原因
    BSTR m_Path=mPath.AllocSysString();試試看
    懷疑因爲 _bstr_t重載的=操作符 對右邊的BSTR視爲char*/wchar* 換言之你AllocSysString返回的值被當成char*/wchar* 而不會在右邊先構建一個_bstr_t_再用=(_bstr_t&)來賦值
      

  5.   

    类型问题: 
    _variant_t m_Path(FilePath); 
    _bstr_t m_Path(FilePath);       
    BSTR m_Path=FilePath.AllocSysString();   
    你都试试 估计能行
      

  6.   

    _StreamPtr pStm;
    pStm.CreateInstance("ADODB.Stream");
    variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    pStm->PutType(adTypeBinary);
    pStm->Open(varOptional,adModeUnknown,adOpenStreamUnspecified,_bstr_t(),_bstr_t());
    pStm->LoadFromFile(m_Path);//读入文件variant_t varBLOB=pStm->Read(adReadAll);
    m_pRs->GetFields()->GetItem("image_data")->Value=varBLOB;//保存到数据集对象1.这个问题解决的最佳办法,是你用于获取的路径 m_path可能是单斜杠

    sFileName.Replace("\\","\\\\"); 
    将你获得的路径名替换成双斜杠2 将你的这个函数用如ADDPICTURE来封装.封装的意思就是传递值进来.将你获得的路径传到这个函数体来运行,至于为什么我不太清楚.可能和地址冲突有关系.