小弟写了一个涵数用来记录打开了的执行文件的文件名,专门用了一个容器vector来保存之,然后用messagebox显示出来,让我迷惑不解的是打开一个exe文件保存的记录是正常的,但是打开多个后保存的记录,读出来后始终是最后一次打开的.而不是不同的exe文件的文件名,现将代码如下:
vector<char *> ivec;void ReadHistoryFile(HWND hDlg)
{
 SetCurrentDirectory(szSavePath);
 TCHAR szFilenameR[MAX_PATH],szFileTitleR[MAX_PATH],szTitleR[MAX_PATH];
 OPENFILENAME OfnR; strcpy(szFileTitleR,"打开");
 strcpy(szTitleR,"打开"); szFilenameR[0] = '\0'; 
 
 ZeroMemory(&OfnR, sizeof(OfnR));
 OfnR.lStructSize     = sizeof(OPENFILENAME); 
 OfnR.hwndOwner       = hDlg; 
 OfnR.lpstrFilter     = TEXT("打开(*. exe)\0*.exe\0All Files\0*.*\0\0"); 
 OfnR.lpstrFile       = szFilenameR; 
 OfnR.nMaxFile        = sizeof(szFilenameR); 
 OfnR.lpstrFileTitle  = szFileTitleR; 
 OfnR.nMaxFileTitle   = sizeof(szFileTitleR); 
 OfnR.lpstrInitialDir = (LPSTR)NULL; 
 OfnR.Flags           = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 
 OfnR.lpstrTitle      = szTitleR;  GetOpenFileName (&OfnR);
 if(strlen(szFilenameR)>4)
 {
  strcpy(szReadFileName,szFilenameR);
 // MessageBox(NULL,szReadFileName,szReadFileName,MB_OK);
  ///////////////////////
    
  ///////////////////////
  char seps[]   = "\\";
  char szTMP[200];
  char *token;
  token = strtok( szReadFileName, seps );
  while( token != NULL )
  {
   if(strstr(token,".exe")||strstr(token,".EXE"))
   {
    
   strcpy(szExeName,token);
     
    ivec.push_back(szExeName);
    vector<char *> ::iterator iter=ivec.begin();
    vector<char *> ::iterator iter_end=ivec.end();
    for(;iter!=iter_end;iter++)
    {
       MessageBox(NULL,*iter,*iter,MB_OK);
    } 
   
   }
  
   token = strtok( NULL, seps );
  }
        bAddPro=true;
 }
// free( pitem );}

解决方案 »

  1.   

    vector 里面存的是 char * 指针,所以他的值一直是szExeName指向的地址,每做一次循环后面的值覆盖掉前面的值, 因此vector里的每个元素都是相同的等于最后szExeName指向地址的值不过没见到szExeName那定义的,呵呵
      

  2.   

    表述错误:应该是vector里的每个元素都等于szExeName指针的值,即他们指向同一块内存
      

  3.   

    你那个szExeName是什么?是个指针?指向一个固定的地方?你push到vector里面的所有指针都是指向szExeName的
      

  4.   

    程序中的一段代码 或许对你有帮助
    void CDlgMp3FileList::OnButtonAddfile() 
    {
        // TODO: Add your control notification handler code here
        CFileDialog dlg( TRUE, NULL, NULL,
            OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,
            "Mp3音乐文件|*.mp3||", this );      TCHAR szFiles[81920] = { 0 };
        dlg.m_ofn.lpstrFile = szFiles;
        dlg.m_ofn.nMaxFile  = 81920;    dlg.DoModal();    CString strFolder   = CString( szFiles );
        LPCTSTR pszFile     = szFiles + strFolder.GetLength() + 1;    // 加入到播放列表
        if ( *pszFile )
        {
            for ( strFolder += '\\' ; *pszFile ; )
            {
                m_ctlFileList.AddString( strFolder + pszFile );
                pszFile += _tcslen( pszFile ) + 1;
            }
        }
    }
      

  5.   

    szExeName是个全局变量char szExeName[100] 高手些怎么样才能让它指向不同的内存地址,我能保证每次存到szExeName里面的植都是不一样的,但是读出来就全部都是最后一次的值
      

  6.   


    std::vector<char [MAX_PATH]> ivec;
      

  7.   

    std::vector<_bstr_t>ivec;
    CString也行
      

  8.   

    把 vector<char*>改为vector<string>,用string来存放即可
      

  9.   

    zzz3265(zzz) 你好 厉害用 std::vector<_bstr_t>ivec;就可以了 
    用string的话我 不会用  
    ivec.push_back(szExeName);
        vector<string> ::iterator iter=ivec.begin();
        vector<string> ::iterator iter_end=ivec.end();
        for(;iter!=iter_end;iter++)
        {
           MessageBox(NULL,*iter,*iter,MB_OK);
        } 
    这行MessageBox(NULL,*iter,*iter,MB_OK);会报错
      

  10.   

    string的话,你要转换string一下的,MessageBox接受的是char *
    这么用:MessageBox( NULL, (*iter).c_str(), (*iter).c_str(), MB_OK );