DWORD dwFlags = OFN_EXPLORER | OFN_LONGNAMES | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT |OFN_HIDEREADONLY, MAXFILE = 2562; //2562 is the max CString file,filter; filter.LoadStringW(IDS_STRING_FILTER_GRAPHICS); CString fileName; const int c_cMaxFiles = 100;//最多选100个文件 const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1; CFileDialog dlg(TRUE,NULL,NULL,dwFlags,filter,AfxGetMainWnd()); dlg.GetOFN().nMaxFile = c_cbBuffSize;//存储路径和文件名的内存字符个数 dlg.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);//分配一段内存存储路径和文件名 dlg.GetOFN().lpstrFile[0]=NULL; INT_PTR erg = dlg.DoModal(); if(erg==IDOK) { CString varName; varName = dlg.GetFileName(); //MessageBox(a); //将图片存到ado数据库中 //Opent File CString strFilePath = dlg.GetPathName();//获得路径 //在image控件上显示此图片 if(strFilePath=="") //判断图片路径是否存在 { AfxMessageBox(_T("读取到图片路径")); return; } CRect rect; m_pic.GetClientRect(&rect); //m_pic为Picture Control控件变量,获得控件的区域对象 CImage image; //使用图片类 image.Load(strFilePath); //装载路径下图片信息到图片类 CDC* pDC = m_pic.GetWindowDC(); //获得显示控件的DC image.Draw( pDC -> m_hDC,rect); //图片类的图片绘制Draw函数 ReleaseDC(pDC); CFile fileImage; CFileStatus fileStatus; CFileException ex; if(!fileImage.Open(strFilePath, CFile::modeRead,&ex)) { TCHAR szError[1024]; ex.GetErrorMessage(szError, 1024); _tprintf_s(_T("Couldn't open source file: %1024s"), szError); return; } fileImage.GetStatus(fileStatus); //Alocating memory for data ULONG nBytes = (ULONG)fileStatus.m_size; //The logical size of the file in bytes,为ULONGLONG ,此处转化为ULONG HGLOBAL hGlobal = GlobalAlloc(GPTR,nBytes);//利用GlobalAlloc分配一块内存,返回句柄. //GPTR,分配一个固定内存块 ,新分配的内存块全部初始化成零 LPVOID lpData = GlobalLock(hGlobal); //锁定返回该内存指针 //Putting data in to file if(fileImage.Read(lpData,nBytes)!=nBytes) { AfxMessageBox(_T("文件读取失败")); return ; } fileImage.Close(); HRESULT hr; _variant_t varChunk; //最终Safe array会赋给此variant long lngOffset = 0; UCHAR chData; SAFEARRAY FAR *psa = NULL; //定义一个SAFEARRAY结构对象 SAFEARRAYBOUND rgsabound[1]; //定义一个SAFEARRAYBOUND对象 try { //Create a safe array to store the array of BYTES rgsabound[0].lLbound = 0; //设定下界 rgsabound[0].cElements = nBytes; //设定上限 psa = SafeArrayCreate(VT_UI1,1,rgsabound); //在堆上创建一维数组,VT_UI1指示byte,如果是VT_UI4指示 unsignedlong while(lngOffset < (long)nBytes) { chData = ((UCHAR*)lpData)[lngOffset]; //将lpData中索引位置lngOffset的字符取出 hr = SafeArrayPutElement(psa, &lngOffset, &chData);//传值到psa中 if(hr!=S_OK) //返回值为S_OK,则表示成功。 return; lngOffset++; } lngOffset = 0; //将Safe array赋给一个variant. varChunk.vt = VT_ARRAY|VT_UI1; //注意此处为 VT_ARRAY|VT_UI1 varChunk.parray = psa; fileName.ReleaseBuffer(); //存入数据库 ADOOperation operation; operation.AddByRecordset(varChunk,varName); } catch(_com_error &e) { MessageBox(e.Description()); return ; } }