mcrblog

vcpp-ml

2000年04月

29

[vcpp 00039991] Re: DLLのメモリリークを検出する方法について

中川さん、 こんにちは。
サイトウです。

すでに該当するリーク個所は解決していると思いますが、
私もデバッグ技法には関心があるので、識者がResを付けてくれるのを
待ってましたが、きませんね。

DLLの製作はやったことがありませんが、
以下は、自分が使ったことがある方法です。

class superbase {
  protected:
#ifdef _DEBUG
    char  name[32];
#endif
  public:
};
というクラスを全てのクラスの 基底クラスにする。
そして、全てのクラスのコンストラクタで

myclass::myclass()
{
#ifdef _DEBUG
    strcpy( name, "myclass");
#endif
ということをすると、リークしたのが myclassなら

 Detected memory leaks!
 Dumping objects ->
{54} normal block at 0x00AD15C0, 328 bytes long.
 Data: < BD myclass > AC 42 44 00 53 74 6F 70 42 75 74 74 6F 6E 55 49
 
てな感じ出力されるのでヒントになります。
インスタンスを特定したければ、
    strcpy( name, "myclass");
を微妙に変えれば。

リークしてるのが、クラスでなくても
C++なら new と delete をオーバーライドして、
(Cなら malloc と free を再定義して)
同じような仕組みを作れば良いと思います。


答えになっていなかったらすみません。

On Fri, 21 Apr 2000 15:58:08 +0900
"Masato Nakagawa" <n...@ojk.info.gifu-u.ac.jp> wrote:

> 中川@岐阜大学です。

> DLLのメモリリークの検出方法についてわからない点があります。

> コンソールアプリケーションを作成した場合に、メモリリークを検出するために、以
> 下のようなコードを作成しました。

> #if defined( _DEBUG )
>      int dbg_flag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
>      dbg_flag |= _CRTDBG_LEAK_CHECK_DF;
>      _CrtSetDbgFlag( dbg_flag );
> // _CrtSetBreakAlloc( 36 );   <===== (A)
> #endif

> このプログラムを実行するとプログラムの終了とともに、メモリリークの検出が行わ
> れて、

> Detected memory leaks!
> Dumping objects ->
> {36} normal block at ...

> というような出力が得られます。
> この「36」という値を上記の(A)の部分に与えてコメントをはずして、コンパイル、
> 実行すると、リークの原因となるメモリの獲得場所を特定することができます。何度
> プログラムを実行しても、プログラムを変更しない限り、同じ割り当て番号が得られ
> るので、この方法はうまくいきました。

> ところが、同様の作業をDLLに対して行うと、ソースを変更しなくても、プログラム
> の実行のたびに、ダンプ結果が異なる数字を出力します。
> そのため、一度実行して、得られた割り当て番号(例えば「36」)を(A)の部分に与え
> ても、意味がないのではないかという気がしているのです。確かに、ブレークポイン
> トは設定されて、プログラムも停止するのですが、これを目的のブレークポイントと
> 考えていいのかがよく分かりません。

> で、質問は次のようになります。

> DLLのメモリリーク検出の場合は特別なことをしなければいけないのでしょうか?
> それとも、コンソールアプリと同じようにメモリリークを検出できると考えていいの
> でしょうか?
> また、同じ方法でよい場合、毎回違う割り当て番号に対しては、どう対処したらよい
> のでしょうか?

> 何か情報をお持ちの方は教えていただけませんか?
> よろしくお願いします。

-----------------------------------
サイトウ ヒロシ
H...@pob.org
MP3プレイヤー "LinePlayer1.00"
http://www.din.or.jp/~saitoke/lineplayer/readme.html
28

[vcpp 00039990] Re: AVIファイルの再生:終了 + 関連追加質問

道化師(mailto:w...@mx1.tiki.ne.jp)です。

私はやったことないのですっとぼけた発言かもしれません。
ご注意ください。(^^;

┌【[vcpp 00039989] Re: AVIファイルの再生:終了~】 ─────
│Animate_xxxx関数で動作確認できました。
│------------------
│....略
│Animate_OPen(....);
│Animate_Play(....);
│....(処理実行)....
│Animate_Stop(....);
│Animate_Close(....);
│....略

│ただ、この方式だとAVI自体の大きさで再生され、
│また、透過型にもできませんでした。

│大きさや透過型で処理するにはどのような方法が
│あるのでしょうか?
│また、AVIをリソースに割り当てる方法(外部ファイル
│を使用しないで内部に取り込む)をご存知の方が
│いらっしゃいましたらご教授ください。
└──────────────────────────────

■大きさについて

 この大きさってどういうことなんでしょうか?
 もう少し具体的に何をどうされたいのかご説明願います。

■透過オプションの設定

 アニメーションコントロールを作成するときにAnimate_Create関数
 のdwStyleパラメータでACS_TRANSPARENTオプションの指定を行って
 もダメなのでしょうか?

 # ↑もっともこれって厳密には透過なんかじゃないですよね。

■AVIリソースのインクルード

 アイコンやビットマップなんかと同じ方法で出来ますよ。(^^;

□■□■ Wraith the Trickster ≫ http://mx1.tiki.ne.jp/~wraith/ □■□■
■□■□ ~I'll go with heaven's advantage and fool's wisdom.~ ■□■□
28

[vcpp 00039989] Re: AVIファイルの再生:終了 + 関連追加質問

自己レスです。

Animate_xxxx関数で動作確認できました。
------------------
.....略
Animate_OPen(....);
Animate_Play(....);
.....(処理実行)....
Animate_Stop(....);
Animate_Close(....);
.....略

ただ、この方式だとAVI自体の大きさで再生され、
また、透過型にもできませんでした。

大きさや透過型で処理するにはどのような方法が
あるのでしょうか?
また、AVIをリソースに割り当てる方法(外部ファイル
を使用しないで内部に取り込む)をご存知の方が
いらっしゃいましたらご教授ください。

> ------------------------------------------
> ノーベルプラン株式会社
> 櫻田 弘昭
> Hiroaki Sakurada
> Office e-Mail : s...@novelplan.co.jp
> Personal e-Mail : h...@topaz.ocn.ne.jp
> ------------------------------------------


28

[vcpp 00039988] Re: MACアドレス取得

樋口@raidwayです。

On Fri, 28 Apr 2000 13:13:28 +0900
Akihiro Hasegawa <h...@intelligent.co.jp> wrote:

>NetBIOSで取得する方法はKBに載っています。VC++のヘルプからも検索で探せば
>出てくるとと思います。

http://www.microsoft.com/JAPAN/support/kb/articles/J024/1/98.htm

ですね。
ただ、今回の場合「接続相手のMACアドレス」なので、これで取得できる
のかどうかはわかりません。

>ところでNetBIOSがない状態でMacアドレスをプログラムから取得する方法でいい
>方法をお知りでしたらぜひ私も知りたいので、教えてください。WINIPCFGなどで
>はNetBIOSがなくてもMacアドレスが表示されるので、きっと方法があると思うの
>ですが。。。

NTしか駄目みたいなのでいまいちですが、

http://www.microsoft.com/JAPAN/support/kb/articles/J045/5/05.htm

というのはありますね。
Win9xの場合は例によってVxD経由でそういうI/Fがあるのかもしれません。

-- 
Higuchi Yasushi (y...@mail.raidway.ne.jp)
http://www2.raidway.ne.jp/%7Eyzone/
28

[vcpp 00039987] Re:【便乗】 「空のドキュメントの作成に失敗しました」という警告について


神戸と申します.

私はSDIアプリケーションをWin98,VC50+SP3で開発
しておりますが,これをNT4.0+Sp5+IE5の環境で
動作させると起動時に
「空のドキュメントの作成に失敗しました」
となります.
#IE5もインストールされているのになぜ??
OLEとか設定にすると発生してしまうことが過去記事より
読めますが...どういった構成でProjectを構成したかも
忘れている次第です ^^;

現状これくらいしか通知できませんが,
本問題を回避するにはどのようにすればよろしいでしょうか?

御教授のほどよろしくお願いいたします.

----- Original Message -----
From: Shigeru Mabuchi <m...@allnet.ne.jp>
To: <v...@mserver.catnet.ne.jp>
Sent: Thursday, November 11, 1999 12:32 PM
Subject: [vcpp 00034530] Re: 「空のドキュメントの作成に失敗しました」という
警告について


>
> 馬渕です。
>
> Katsumi Yoshikubo wrote in [vcpp 00034525] 「空のドキュメントの作成に失敗
しました」という警告について:
>
> >お世話になります。吉久保といいます。
> >
> >現在、とあるWindowsアプリケーションの試験を行っています。
> >様々なOS、いろいろなバージョンでチェックを行っています。
> >同じOS(同じNT及び同じサービスパックのバージョン)でも、
> >特定のマシンだけで「空のドキュメントの作成に失敗しました」
> >という警告が出てしまい、アプリケーションが起動しないという状況です。
> >
> >この警告はどういう状況のときに出るのか、ご存知の方があれば、
> >教えてください。よろしくお願いします。
>
> Visual C++ 6.0 のMFCで開発したアプリ(おそらく OLE 使用時?)では、
> Win 98 か、MS IE 4.0 以上がインストールされた環境でないと
> 以上のエラーを起動時に出します。
>
> 具体的に言うと、MS IE 4.0 以上のインストールされていない
> Win 95 や NT でそうなります。
>
> ですから、Win95/NT の場合、MS IE 4/5 をインストールすれば
> 大丈夫です。
>
> =====================
> (株)ログ
> 馬渕
> http://www.log.co.jp/
> =====================
>
記事検索
Amazon.co.jp
  • ライブドアブログ