VC 6.0回転VVS 2005問題及び解決方法


この文の主な内容は転載されています.http://www.cnblogs.com/sunliming/archive/2011/05/08/2040152.html.
私は原文の内容を整理して、読みやすくします.これからは新しい転換問題を発見し、引き続き補充します.
皆さんの投稿を歓迎して、新しい問題を解決してください.引き続き改善してください.ありがとうございます.
一.  関数プロトタイプの変更による問題
1.errorC 2440:CMainFrame NMTOOLUTBARAからNMHDRに変換できません.
    VC 6下のOnToolbar DropDownの関数原型:
  voidCMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr) 
   変更が必要です
  void CMainFrame::OnToolbarDropDown(NMHDR*pnmhdr, LRESULT *plr)
  {
    LPNMTOOLBAR pnmtb =reinterpret_cast<LPNMTOOLBAR>(pnmhdr);     
    // ...
  }  

2.error C 2668:'sqrt':ambiguouscall to overloaded function
    理由:VSS 2005にsqrt関数の重負荷があります.コンパイラがsqrt(int)を見た時、該当する関数が見つからないので、sqrt(flooat)とsqrt(long double)の2つの関数があります.コンパイラはプログラマがどの関数を必要としているか分かりません.エラーが発生します.
    解決方法:sqrtf()を使って代替できます.
3.error C 2039:'ReadHuge':is not a member of'CFile'
    理由:VSS 2005には、readhugeがreadに含まれています.
4.error C 2668:'pow':ambiguguoscall to overloaded function    VSL 2005では、pow(double)i,2と書く必要がありますが、原因は分かりませんでした.
    VSL 2005では、関数のプロトタイプはdouble_u uである.cdecl pow(__in double X,__in double_)
    VC 6において、関数の原型は_である.CRTIMPドビルcdecl pow;
5.ON_WM_NCHITTEST(and other MF Cmacros)won't copile in VS 2005.
    VSL 2005において、ON_WM_NCHITTESTマクロコンパイルができません.
    error C 2440:'static_cast':cannot convertfrom'UNT(_thiscal CMenuBar:*)'to'LRESULT(*)'Cast from band reived quires dynamic_cast or static_cast
    解決方法:ONcHitTestの原型を修正する:
    VC 6:afx_msg UNT ONcHitTest(CPoil point);->
    VSL 2005:afx_msg LRESULT ONcHit Test(CPoil point);
6.error C 2440:'static_cannot convert from'void(*)(BOOL、HANDLE)'to'void(*)
    ONするWM_ACT IVATEAPPのメッセージ処理関数のプロトタイプ:
    VC 6:afx_msg void OnActivate App(BOOL、HANDLE);
    VSL 2005:afx_msg void OnActivateアプリ(BOOL、DWORD);
二.  その他の問題
1.以前はtryをこのように使ってもいいです.
  catch(CException*e)
  {
      pApp->Warn("%s",e->GetErrorMessage);

       e->Delete();

       return FALSE;

  }
    現在は次のように修正しなければなりません.
  catch(CException*e)
  {
     TCHAR errormsg[255];
     e->GetErrorMessage(errormsg,255,NULL);
     pApp->Warn("%s",errormsg);
     e->Delete();
     return FALSE;
  }
2.strechは強制的に変換しなければなりません.
    VC 6:char*str 2=strech(line);
    VSL 2005:char*str 2=(char*)strichr(line,'|');
3.VSL 2005にはメモリのオフラインを引き起こす可能性のある関数は使用を勧めません.
  char c[10];
  strcpy(c, "testtestts"); //ok with VC6, but not in VS2005
  strcpy_s(c, _countof(c),"testtestt");//9 chars, ok inVS2005
  strcpy_s(c, _countof(c),"testtestt");//10 chars,assert!!!!! in VS2005
4.error LNK 2019:unresolovedexternal smbol"wchar t*_stdcal_commuutil:Co….
    解決方法:Property page->C/C+->Language->treatWchar-t   Noに変更
5.文字処理
    cで広く使われているstrcpy、stralなどは、より安全なstrcpyus、stractus、stststractusなどを使って代用することをオススメします.
6.数学関数の検査
VSL 2005では、数学関数のパラメータ検査がより厳格で、pow(2,45)のようにエラーメッセージが発生します.
    error C 2668:「pow」:重負荷関数の呼び出しが不明です.
    d:\program files\microsoff visual studio 8\vc\include\math.h(575):「long double pow」かもしれません.
    d:\program files\microsoff visual studio 8\vc\include\math.h(527):「float pow(float、int)」
    d:\program files\microsoff visual studio 8\vc\include\math.h(489):「double pow」
    パラメータリスト「(int,int)」にマッチしようとした場合は、pow(2.0,45)を正しく使用します.
7.C++の基準により適合する
    VC 6では、forサイクルにおける循環変数の定義の作用域が循環体の外に広がっており、VSS 2005ではこのようなバグが修正されている.
    VC 6において:
  for(int i=0;i<100;i++)
  {
    f2();
  }

  for(i = 1;i<10;i++)
  { //i    
    f1();
  }
    VSL 2005においては、第二のサイクルのiを再定義しなければならない.
8.Create問題
    CDlg*dmg=new CDlg;
    dmg->create(IDDuDgDLL、this);
    error C 2660:'Create':function does nottake 2 parametersそして私は第二のパラメータを削除するとまた表示されます.
    error C 2660:'Create':function does nottake 1 parameters 19.error C 2871:'System':a namespace with is name does notexist
    このエラーはVCコンパイラはまだ知能が足りないとしか言えません.
    使用前にCommon Language Runtime Supportを使用する必要があります.
    設定属性では、GEneral-」を選択してclc(ConfigrationProperties/General/Common Language Runtime support)を選択します.