VC++.NET2003への移行時エラーについて(CMemoryException)

[戻る]
すかっち 2005/06/22(水) 13:06:28
こんにちは、質問がありこちらに書き込みさせて頂きます。

現在VC++.NET(2002)からVC++.NET2003への移行をやっています。
しかし.NET2003になった時点でコンパイルエラーが大量に出てしまい困っています。

エラー内容は

@SmClient error C2316: 'CMemoryException' は、デストラクタまたはコピー コンストラ
クタにアクセスできないためキャッチできません。

ASmClient fatal error C1083: include ファイルを開けません。'fstream.h': No such 
file or directory

ばかりなのですが、何が悪いのかさっぱりわかりません。どこを修正すればいいのでしょうか。

    try {
        m_listTable.AddTail(pObjNew);
        } catch (CMemoryException /*e*/) {
        TRACE("CSmReferenceTables::operator = () : Memory exeption 
has been occurred...");
        delete pObjNew;
        }
        }

@のエラーは上記プログラムの中のCmemoryExceptionで出ています。

どなたか、ご教授よろしくお願いします。

επιστημη 2005/06/22(水) 13:24:05
try {
  ...
} catch (CMemoryException*  e) {
  // いろいろと尻拭い
  e->Delete();
}

じゃなくて?

> 'fstream.h': No such file or directory

#include <fstream.h> → #include <fstream>

wcup2006 2005/06/22(水) 13:24:16
1つ目はヘルプでC2316を調べましょう
2つ目はfstream.hの.hをとったらよいと思います

すかっち 2005/06/22(水) 13:37:27
早速のお返事ありがとうございます。

fstream.hについては解決できました。ありがとうございます!!

しかし一つ目のC2316エラーはヘルプで調べてもさっぱりわからないのです。
何か色んな方法がゴチャゴチャ書いてあるだけで結局どうすればいいのか不明なのです。

Aのやつは、↓こう書いてあればヘルプではOKが出るみたいに書いてたのですが、

try {
  ...
} catch (CMemoryException*  e) {
  // いろいろと尻拭い
  e->Delete();
}

私のプログラムでは } catch (CMemoryException /*e*/) {
になっています。 最後も delete pObjNew; です。

これだけ解決できません。

dairygoods 2005/06/22(水) 13:40:35
> これだけ解決できません。

指摘の通りに修正すればよいのでは?

Blue 2005/06/22(水) 13:46:55
>現在VC++.NET(2002)からVC++.NET2003への移行をやっています。
>しかし.NET2003になった時点でコンパイルエラーが大量に出てしまい困っています。
そもそも元のソースは、.NET2002でも動いていたのでしょうか?
どうもまずそうな気がするのですが。。。

# 丸付き数字は環境依存文字ですので、Web上では使わないようにしてください。

すかっち 2005/06/22(水) 13:47:41
すでに指摘していただいた方法で修正を行ってみたところ、
更に別の大量エラーが出てきました。

.NET2003は.NET2002とは全く違う性質を持っているのでしょうか?
今まで.NET2002でうまく動いていたのに、大量のエラーが出てくるので
何かリンカに貼り付けたりすればうまくいくんでしょうか??

Ban 2005/06/22(水) 14:50:19
> 更に別の大量エラーが出てきました。

例えばどんなものが出ていますか。数によって全ては難しいにしても、いくつか提示されてみては?

> 今まで.NET2002でうまく動いていたのに、大量のエラーが出てくるので

既に Blue さんもご指摘の通り、.NET2002 でもバグに気づいていなかっただけのように見えます。

提示ソースで実際に例外を起こしてみると delete pObjNew; が動かないことがわかると思います。
たまたまコンパイルが通っていただけで、CMemoryException を待ってもそこは通りません。

気づかなかった問題点が表面化したのであれば、地道に直すしかないと思います。

すかっち 2005/06/22(水) 15:05:13
VC++6.0から.NET化をしたのですが、その時に偶然ちょっと修正しただけで
コンパイルを通ったのかもしれません、皆さんのおっしゃる通りなのかも。。。

ちなみに今回修正を加えて更に大量に出たエラーの一部が下記のようなものです。

m_logFile.open(SMLOG_FILE_NAME, ios::ate);
「SmClient error C2065: 'ate' : 定義されていない識別子です。」

ifstream  fi(fname, ios::nocreate);
「SmClient error C2065: 'ifstream' : 定義されていない識別子です。」

m_logFile.close();
「SmClient error C2228: '.close' : 左側がクラス、構造体、共用体ではありません。」

DWORD dwFileSize = file.GetLength();
「SmClient warning C4244: '初期化中' : 'ULONGLONG' から 'DWORD' に変換しました。デ
ータが失われているかもしれません。」

などのエラーが約470件ほど出ています。

Ban 2005/06/22(水) 15:14:52
#include <iostream.h> は古い形式のヘッダです。

#include <iostream> など、C++ の現在の標準ヘッダは全て namespace std 内に
標準関数を定義しています。

上記を見る限り、標準ヘッダの直後に以下の文を入れていくと、
かなりのエラーが取れると思います。(提示エラーだと上から3個はこれで消せそうです)

using namespace std;

意味は、C++ の解説書なりを参照してください。

Ban 2005/06/22(水) 15:23:49
最後のものは、MFC のバージョンアップに伴うものと思われます。

CFile::GetLength をローカルの MSDN (古いもの)で見ると DWORD ですが、
オンラインでみると ULONGLONG になってます。

どう直すべきかは条件/状況にもよりますので一概にはいえませんが、
下位互換など余計な事を考えなくてよいなら、新しい型にあわせればよいのではないでしょうか。

すかっち 2005/06/22(水) 15:30:27
ありがとうございます!!

using namespace std; を貼り付けてコンパイルをし直したりしているのですが、
やればやるほどエラーが増えていきます。
地道に1つずつ消すしかやはり方法はにないのですよね^^;

Ban 2005/06/22(水) 15:50:21
> 地道に1つずつ消すしかやはり方法はにないのですよね^^;

おそらくは....。

すかっち 2005/06/22(水) 15:59:06
[[解決]]
ありがとうございました、皆さん!

とりあえず地道に1つずつ修正していくところから始めています。
また何か質問が出てきたら書き込みしますので
お力添えよろしくお願いします!!

古いスレッドには追加発言できません。