您好,我有个问题想请教尊驾
_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,现在我运行的话,就会出错,能告诉我这是为什么吗,斗胆请教。
_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,现在我运行的话,就会出错,能告诉我这是为什么吗,斗胆请教。
"For example, GetFileName will return "TEXT.DAT" for the file C:\FILES\TEXT.DAT."
所以你還是應該從路徑的字符串上找原因
BSTR m_Path=mPath.AllocSysString();試試看
懷疑因爲 _bstr_t重載的=操作符 對右邊的BSTR視爲char*/wchar* 換言之你AllocSysString返回的值被當成char*/wchar* 而不會在右邊先構建一個_bstr_t_再用=(_bstr_t&)來賦值
_variant_t m_Path(FilePath);
_bstr_t m_Path(FilePath);
BSTR m_Path=FilePath.AllocSysString();
你都试试 估计能行
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来封装.封装的意思就是传递值进来.将你获得的路径传到这个函数体来运行,至于为什么我不太清楚.可能和地址冲突有关系.