■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#225-1
AddCodeで追加した変数がリソースから解放できない
ども、Sです。いつもいつもお世話になります。
下記のようなコードでユーザー側で関数が使えるようなコードを以前教えていただきましたが、
これを連続して行うとNothingしているにもかかわらず、システムリソースがガンガン減ってい
きます。MSDNで調べても書物で調べてもわかりません。(今回はちょっと余裕があるので自力
で解決しようと思いましたが、だめでした)
どなたかよろしくお願いしますぅー。

Dim SC As Object
Set SC = CreateObject("MSScriptControl.ScriptControl")
SC.Language = "VBScript"
SC.AddCode "Option Explicit"
SC.AddCode "Const A = -1"
MsgBox SC.Eval("abs(A)")
Set SC = Nothing

#226-1
RE#225:AddCodeで追加した変数がリソースから解放できない
自宅のマシンには VB が入っていないため、Excel(VBA) 及び VBScript での動作確認ですが
提示されたコードを 10、100,1000 とループさせてみましたが、おっしゃるとおり
確かに User リソースが減少したままになりますね。Excel では Excel 終了時、VBScript では
スクリプト終了時にオブジェクトが開放されるようです(この時点でリソース復活)。
Reset メソッドを入れたり、DoEvents を追加したり、WScript.Sleep なんかも試してみましたが
だめですね。AddCode メソッドや Eval メソッドをコメント化するとループ毎に正常に
開放されるようでリソースの減少という現象は発生しませんでした。ここからは推測ですが
AddCode や Eval などのメソッドを実行すると内部でオブジェクトの参照カウントが増えている
もかもしれません(VBでは参照カウントの追跡ができないので確認することはできませんが)。
Script Control は ウィンドウレスの ActiveX コントロールですから通常はフォームに貼り付けて
使うことを想定しているのかもしれません。この場合 Nothing キーワードが使われることは
ないですから、オートメーションオブジェクトとして呼び出した場合にもうまく働かないのかも。
でもヘルプには ActiveX コントロールとしてもオートメーションオブジェクトとしても使えるって
書いてあるんですよね。うーん、謎です。

回避策として Nothing を使わないようにしたらどうですか? Reset メソッドを利用して同一の
オブジェクトを初期化したあと使いまわせば少なくともオブジェクトひとつ分のリソースしか消費
しないはずです。

#240-1
RE#226:AddCodeで追加した変数がリソースから解放できない
ども、レスありがとうございます。

> 回避策として Nothing を使わないようにしたらどうですか? Reset メソッドを利用して同一の
> オブジェクトを初期化したあと使いまわせば少なくともオブジェクトひとつ分のリソースしか消費
> しないはずです。
Nothing使わないように工夫してみましたが、うまくいきません。DimとかSetとかちゃんと理解でき
ていない問題もあるかもしれませんが・・・。
結局小さなプログラムで関数は処理するようにしています。端から見てると変なソフトが出たり消え
たりとちょっと変な感じです。
VBスクリプトコントロールを使わずにほかの方法でユーザー側で関数が使えるようにできないもので
しょうか???
#244-1
RE#240:AddCodeで追加した変数がリソースから解放できない
>Nothing使わないように工夫してみましたが、うまくいきません。
どのように上手く行かないのか、書いていただけるともう少しお役に立てるかもしれません。

>DimとかSetとかちゃんと理解できていない問題もあるかもしれませんが・・・。
この部分の概念は少々難しいですがしっかりと把握しておいた方が後々のために良いと思います。

Visual Basic でオブジェクトを生成する方法は幾つかありますが(メソッド呼び出しの実行
速度が異なる)、Script Control は ActiveX コントロールなのであえて CreateObject 関数を
使わなくともフォームに貼り付ければメソッドを利用することができます(標準コントロールの
ように使えるということです)。

(1) 参照設定で Microsoft Script Control をチェック
(2) ツールボックスに Microsoft Script Control を追加(コントロールタブ内にあります)
(3) ツールボックスから ScriptControl を選択してフォームに貼り付け

この方法ではオブジェクトの生成や解放を意識しないでいいので簡単だと思います(インテリ
センス機能も働きますし)。
Language プロパティは初期値が VBScript ですから必要に応じてプロパティウィンドウ内の
Language を書き換えてください。
オブジェクトの生成方法によりメソッドの実行速度は三つに分けられますが、この方法では
中ぐらいの速さになります。

>VBスクリプトコントロールを使わずにほかの方法でユーザー側で関数が使えるようにできないもので
>しょうか???
まず上記の方法を試してみてください。少なくとも Script Control を使う方法がいちばん簡単な方法
だと思いますよ。
#254-0
RE#244:AddCodeで追加した変数がリソースから解放できない
お返事遅れまして申し訳ありません。
> (1) 参照設定で Microsoft Script Control をチェック
> (2) ツールボックスに Microsoft Script Control を追加(コントロールタブ内にあります)
> (3) ツールボックスから ScriptControl を選択してフォームに貼り付け
Setを使わずに上記のやり方でやればうまくいきました。って今のところですが・・・。
ありがとうございました。
このページと関連する記事:
#5772-0文字列の分割方法を教えて下さい1999-12-16(木) 21:06
#14392-0計算式文字列から計算結果を取得する方法2000-01-26(水) 19:07
#462-0JavaScriptのevalのようなもの2002-03-21(木) 16:08
#3652-0RE#3643:VBA6.0の関数をVB5.0で使用する方法1999-11-05(金) 10:51
#39358-0ユーザーコントロールの解放2001-02-22(木) 20:11
#36630-0タブ2001-01-11(木) 10:34
#13086-0VBでメモリの解放2000-01-13(木) 13:33
#46606-0リソースを大量に消費2001-09-06(木) 16:42
#6525-0メモリ不足1999-10-04(月) 12:37
#29748-0関係演算子の使い方2002-07-03(水) 00:30
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)