VB6とimputmanとspreadで画面が落ちる現象について。

解決


sino  2006-02-24 05:29:37  No: 130374

初めまして、以下の構成で画面が落ちる現象が発生します。
どなたか経験のある方、御教授いただけないでしょうか?

環境  :
Windows XP Pro(SP2)
(Windows 2000 再現済み)
VB 6 (SP6)
oRACLE 9
SPREAD Ver6(最新パッチ適用済み)
imputman Ver7(最新パッチ適用済み)
(IMTEXT,IMNUMBER )
ソースの書き方自体は以下の通りです。

☆SPREAdのGetArrayで動的変数を使って格納してspreadの行単位で値を返すライブラリがあります。
このライブラリを使ってIMPUTMANに値を渡します。
現象自体、一画面のみ(他の画面では現象が出ません。)ですがこの画面だけはspreadのヘッダが2つ確保されており、IMNUMBERを使っています。
IMPPUTMANの使用はIMTEXTが5つ、IMNUMBERが4つです。
IMTEXTの辺りで落ちている様な感じは受けますが、別のパソコンでは現象の再現が出なかったりします。

■このライブラリを使って以下の事を行った結果、画面が強制終了してしまいます。
1.spreadのクリックイベントを連打して使用した時。
2.新規・更新・削除を行う時。

☆現象はコンパイルを行ったもので再現します。
・デバック環境では再現が出来ません。
・コンパイルを行ったものでも、ソース自体は変えずにある部分にテキストログ吐かせると何故か現象が消えます。
・ログを吐かせた場所はスプレットの表示処理を行っている部分です。
ここの場所以外にログを入れても現象の回避ができません。
しかし、特定の場所に入れもログの内容によっては現象が発生します。
初めは参照する変数が原因かと疑いましたが変数をログに落とさなくても半角のaとスペースといったある特定の書式で固定文字を入れても回避が出来ます。
(一緒にIMPUTMANのボックスにも値を入れています。)
・現象が出る時となかなか出ない時があります。
・2000とxpで現象が確認できています。
・ソース自体は基本的に他の画面と同じ作りになっている為、疑わしい所が特に見当りません。

以上、宜しくお願い致します。


Dental  2006-02-24 21:56:04  No: 130375

ImputMan ではなく、InputMan でしょう?

> 以下の構成で画面が落ちる現象が発生します
コンポーネントのメーカーからは、回答を得られなかったのですか?

> 別のパソコンでは現象の再現が出なかったりします。
コンポーネントの依存ファイルのバージョンは一致していますか?

> 現象はコンパイルを行ったもので再現します。
シンボリックデバッグ付きでコンパイルしておき、そのexeファイルを
直接デバッグ実行してみては?


sino  2006-02-26 09:53:51  No: 130376

> 以下の構成で画面が落ちる現象が発生します
コンポーネントのメーカーからは、回答を得られなかったのですか?

今回の現象は色々なサイトを探しても実例が全くありませんでした。
又、メーカへの問い合わせをしても全く意味不明な現象が出るものに対して
問合わせても回答が貰える筈がない為、聞いていません。

> 別のパソコンでは現象の再現が出なかったりします。
コンポーネントの依存ファイルのバージョンは一致していますか?

全て一致しています、結果的にはどのPCでもある不明確な
タイミングで画面が落ちました。

> 現象はコンパイルを行ったもので再現します。
シンボリックデバッグ付きでコンパイルしておき、そのexeファイルを
直接デバッグ実行してみては?

結局、納品まで時間が無かった為、根本的な
問題は不明のまま取りあえず出しました。
きちんとした原因は不明確なのですがstring型の動的変数を多用
していて解放していなかったのが原因かもしれません。
只、stringで動的に取った部分をEraseで解放しても余り変化はありませんでした。
不明確のまま、spreadの項目を表示する部分のロジックで動的変数を
使っている部分にVariant 型で宣言しただけで何も変更が無くても
再現が出なくなった為、string型から変更を行って対処しました。

今一つふに落ちないのですが他に残った原因を考えるとすれば
以下の二つになります、可能性としては後述の方が強いかもしれません。
以上、有り難うございました。
明確な原因が解明できれば改めて書き込みます。

・SEが作った画面form自体には適当な名前がついていて、frx
とfrmしかなく、VBPはコピーして中身とファイル名を変更して作っています。
formの名前をテキストエディタでリプレイスした時に間違えてform自体のファイル名とフォームの名前を同じに書き換えてしまった。
(まだ未確認です。)

・frxにはコントロール系のバイナリイメージ(位置情報以外の設定)が含まれている(?)らしく、このファイルが何らかの事情で壊れてEXEを作る時に正常なコンパイルが出来なくなった。
(記憶が曖昧ですが別の画面を作成中、vssに登録済みのものとしていないformを混在してプロジェクトに追加した後、vssにチェックインして未登録のformをvssに登録。この状態で大元のformが壊れる現象が出ました。)


sino  2006-02-26 23:21:20  No: 130377

VSSの不具合でファイルが壊れたのかもしれません。

http://64.233.179.104/search?q=cache:BMxTWHP-guEJ:www.microsoft.com/japan/msdn/ssafe/download/sp/readmess.htm+%EF%BD%86%EF%BD%92%EF%BD%98%E3%80%80%E5%A3%8A%E3%82%8C%E3%82%8B&hl=ja&gl=jp&ct=clnk&cd=1


sino  2006-05-03 22:51:04  No: 130378

自己レスです。

上記の問題は社内で独自に作成したSpreadの項目から行単位で値取得する共通関数の型不一致によるものだとわかりました。

スプレットの項目には列毎に型を設定する事ができます。
SPREADのGetArrayはその型通りのものを行単位、或いは列単位で取得しますがこの時にstring型でXXXX()の様な事をして直接GetArrayに渡し、値(XXXX)をByrefにすると型不一致を起こします。
偶々、今まで他の画面のSpreadの設定がテキスト型になっていた為、現象が起こらなかっただけの話でした。

又、この時に適当にバタバタクリックしない時に現象が出なかったのは偶々、VBが使用できるメモリ領域に余裕のある時に勝手に判断して型変換してくれたのでしょう。メモリーを512MB以上積んだものとそれ以下のパソコンで再現の率に変化がありました。
又、ファイル操作などの制御系のソースを加えると再現が出なかったりしたのもVBのメモリ管理に関する部分での問題なのだという結論になりました。

対処としてはVariant型に変更して明示的に縦列、横列の配列を確保する事でで対応しました。

お騒がせしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加