Win XP
VB6 SP5

VB6で呼び出し元の情報を取得する方法について

VB6で
・呼び出し元の関数本体が宣言されているソースのファイル名
・呼び出し元の関数名
を取得する方法はありますでしょうか?

システムログを生成する時に利用しようかと考えています。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

#実は、回答ではないので気が引けてますが・・・


#私自身も同じ悩みを持つ、30代会社員です。

私の場合・・・(すべてのログをとることが、あまりなくて、大切そうなとこだけなので・・)
まず、ファイル毎に、Private SrcFileName = "xxxx.bas" を定義して、
ログとり関数呼び出し時に Log(SrcFileName)とやっています。

呼び出しもとの関数名も同様にできますが、面倒なのでやっていません。

おそらくCコンパイラでよくある。__LINE__、 __FILE__ マクロみたいなものを想定されているのではないか思いますが、VBでそのようなものは見当たりません。
#ここに回答を登録することで、いい方法を知ることが出来るんじゃないかと・・・、便乗させていただきます。
    • good
    • 0

VB6で呼び出し方がよくわからないので、別EXEをSHELL起動した場合で回答します。



SHELL起動を行う時に引数を指定あいてあげれば、呼び出されたEXEからコマンドライン関数(Command())により引数を取得できます。

詳しくは、VBのヘルプを見て下さい。

簡単な起動方法例

retVal=Shell(C:\Test.EXE Pata1 Para2..." , 1)

上記 Pata1 Para2...の所に引数を設定する。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

QVB.netである関数を呼んで、その関数内で呼び出し元関数を知る方法。

呼び出し元関数からある関数を呼びます。
その呼ばれた関数で、引数などで渡すのではなく、自然に前の関数の情報を取得できる方法はないでしょうか?
どこかに、自然に保持されているとか?
もし、不可能ならそういう答えもお待ちしてます。
よろしくお願い致します。

あと、もう一つ、普通のシステムでデバッグログなどはどうやって出すのでしょうか?
出す情報などがわかると幸いです。
ログについての詳しいことがのってるサイトでもあれば非常に助かります。

よろしくお願い致します。

Aベストアンサー

自然にというのが意味不明なのですが、普通引数で渡すものですし、その手続きが出来ないのなら、モジュールレベルで変数を宣言して情報?を共有してしまえばいいかなと。

---
dim a as integer

function aaa as integer
 a=0
 bbb()
end function

function bbb as integer
dim b as integer
 b=a
end function

デバッグログを外部ファイルに書き出したいということであるなら参考URLで。
ただ書き出す情報については開発する人が決めることですが・・・。一般的にこういう情報を書き出すなんてありませんよ。どういう情報を確認したいのかなんて開発者にしか分からないことでしょうに。
普通はあるエラーが発生した時に確認したい変数の値とか、環境情報だとか、そういうものを書き出すかと。
特に目的がないなら別に書き出す必要もないでしょう。

参考URL:http://dobon.net/vb/dotnet/programing/tracelisteners.html

自然にというのが意味不明なのですが、普通引数で渡すものですし、その手続きが出来ないのなら、モジュールレベルで変数を宣言して情報?を共有してしまえばいいかなと。

---
dim a as integer

function aaa as integer
 a=0
 bbb()
end function

function bbb as integer
dim b as integer
 b=a
end function

デバッグログを外部ファイルに書き出したいということであるなら参考URLで。
ただ書き出す情報については開発する人が決めることですが・・・。一般的にこういう情報を書き出すな...続きを読む

Qfrxファイルの役目

VB6の開発環境で、拡張子がfrxというVisual Basic Form Binary Fileが出来ますが、何に使われるのですか?
2台のPCで同じプロジェクトの開発をしている際、frmファイルだけをコピーすると、VBでファイルを開く時エラーになることがあります。
frxファイルも同時にコピーする必要があるのでしょうか?
2台のPCのOSは、Win2000とWinXP ProSP2で、XPから2000へコピーした際は問題なく、2000からXPへコピーした際のみ、上記の問題が発生します。
よろしくお願いします。

Aベストアンサー

「ほげ.frm」
「ほげ.frx」
があったとします。

「ほげ.frm」をテキストエディタで開いてみてください。
どこかに「ほげ.frx」の記述が存在していたら、その「ほげ.frm」は「ほげ.frx」を必要とします。

主に、拡張コントロールのプロパティ情報が記載されています。
W2K←→XPsp2
のコピーに関しては、本来どちらもいけると思うのですが、、、
VBのサービスパックや、何かの拡張コントロールのサービスパックが異なっていたりしませんか?

QForm_Load と Form_Activate のタイミング

あるデータ入力アプリを作っています。
親フォーム(Form0)で番号を決め、子フォーム(Form1,Form2,Form3,Form4) でデータ入力し、それぞれの子フォームを出るとき(Unload Me) に、変数にsaveしています。それを親フォーム(Form0)で登録を選択したとき、入力データをチェックしてDBに格納しています。
すでにDB格納済のデータの場合、親フォームでDBから変数に読み込み、子フォームのForm_Loadで展開しています。
そこで困っているのは、親と子のフォームを行き来するときにデータの表示で前のが残っていたり、消えてしまったりします。
Form_LoadとForm_Activateを通過するタイミングが、ちゃんと理解できていないためコードの記述位置が不適切なのだと思います。

Form_Load と Form_Activate の実行タイミングについて、お教えください。

Aベストアンサー

Form_Loadは、フォームがロードされたときです。
ロードされる条件は、
1.フォームがスタートアップに指定されているとき、アプリが実行された直後。
2.Show メソッドが呼ばれたとき
3.Loadメソッドが呼ばれたとき
4.フォームに貼り付けられたコントロールのプロパティが参照されたとき
5.フォームに貼り付けられたコントロールのメソッドが呼ばれたとき
です。

ただし、一度ロードされると、Unloadされるまで呼ばれません。


Form_Activateは、フォームがアクティブになったとき、つまり、キャプション(ウィンドウのタイトルバー)の色が変わったときです。

Qモーダルフォームとモードレスフォーム

この二つの違いはどういう違いがあるのでしょうか?
どなたか教えてください。お願いいたします。

Aベストアンサー

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォーム2が表示されたあと
にメッセージボックスが表示されます。
つまりCommand1はShowのあとのロジックを、フォーム2が閉じるまで、未処理のままとなるわけです。

画面上はフォーム2が前面、フォーム1が背面になるどちらも似たような表示に見えますが、
Command1の場合はフォーム1はフォームをクリックしても、フォーカスを持たない
Command2の場合はフォーム1はフォームをクリックすると、フォーカスを持ちえる
という点も違います。


簡単にまとめると、
vbModalの場合はフォーム2だけに作業処理を固定させたい時に使用します。vbModelessの場合はフォーム2はポップアップ的な使用方法の時に使います。

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォー...続きを読む

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

よろしくお願いいたします。

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

QVB6 ClassにてEnum(列挙型)のうまい使い方

へっぽこPGです。
今まで私の質問にご回答を頂いた方々、改めてお礼申し上げます。

最近VB6でActiveXDLLにて、DLLを作り始めました。
Classについて勉強を始めたばかりで、
実現できそうな機能と実現できない力量のギャップに苦労しています。

さて、いろいろと便利なDLLを作ってやるぞ!と意気込み、
ExeからDLLを参照してプロパティに値を設定する時に、
インテリセンスが出るようにしたく、ClassにEnum(列挙型)を使うやり方を見つけましたが・・・・。

その先困ってます。

VB6でデバッグをしているわけですが、
Class(Dll)とExeは別プロジェクトで生成しており、
Dllはバイナリ変換、デバッグはExeを実行するように設定済です。
これでActiveXDLLプロジェクトで「開始」をすると、Exeを実行してくれます。

Exeのプロジェクトから、
「開始」・ステップ実行して確認しましたが、
正常に動作しているようです。(記述した文がそれぞれ機能しているという意味で)

ActiveXDLLプロジェクトから、
「開始」後、「停止」をして、Dllを上書きしようとすると、
「書込みできません。"~DllのPath~"」とMsgboxのBouttonのでいうvbMsgBoxStyle=vbCriticalの形式で、
Msgboxが表示されてしまいます。
どうやらExeがDLLを離していないのでしょうか?
もちろん列挙型を設定していないDLLの場合ですと、上書きは可能です。
(他にも上書きできないパターンを見つけましたが、話が脱線するので割愛します。もしご存知でしたら、併せて教えて頂くと幸いです。)


困っている点としては、
1 デバッグする上で、Dll(書出)⇔Exe(開始)を繰り返したく、都度プロジェクトを閉じて、開いてDLL書出しするのは、非効率。
(DLLを書き出して、インターフェースを変えてしまえば、Exeはリコンパイルが必要なので、あんまり意味ないかも・・・とも)

2 読み取り専用プロパティを作って、Initializeで初期値を設定してしまう方法を考えたが、非常にかっこ悪いし、運用が大変。

3 1を我慢したとしても、作成したDLLはCOM+に登録して、WebサーバでASPから使用するつもりなので、DLLを離してくれないと、無駄なプロセス動き続けてしまう(?)→未テスト

です。


いろいろとツッコミどころがあるかもしれませんが、
忌憚なくご意見下さい。


---Class-(test_Class)----
'列挙宣言
Public Enum Chiiki
Hokkaidou = 0
Aomori = 1
Akita = 2
End Enum

'プロパティ値を格納しておく変数
dim aaa as integer

'プロパティでEnum宣言した型を引数に指定します、
Public Property Get Shusshin() As Chiiki
Shusshin = aaa
End Property
Public Property Let WindowState(ByVal NewValue As Chiki)
aaa = NewValue
End Property
---Class-End--------------------

---Exe-----------------
'Classは参照設定にて
'参照設定にしている理由としては、インテリセンスでロパティ・メソッド等を利用したいから。開発側の怠慢?

Sub a
'Class宣言
Dim a_class as test_Class
Set a_class = New test_Class

'プロパティ設定 ↓ = と打つと、Classの列挙で設定した値がプルダウン
a_class.WindowState = Aomori

'プロパティ値表示(処理自体に意味無し)
'「1」 と表示される
Msgbox a_class.WindowState

'Class開放
Set a_class = nothing

End sub
---Exe-End----

へっぽこPGです。
今まで私の質問にご回答を頂いた方々、改めてお礼申し上げます。

最近VB6でActiveXDLLにて、DLLを作り始めました。
Classについて勉強を始めたばかりで、
実現できそうな機能と実現できない力量のギャップに苦労しています。

さて、いろいろと便利なDLLを作ってやるぞ!と意気込み、
ExeからDLLを参照してプロパティに値を設定する時に、
インテリセンスが出るようにしたく、ClassにEnum(列挙型)を使うやり方を見つけましたが・・・・。

その先困ってます。

VB6でデバッグをし...続きを読む

Aベストアンサー

VB6が DLLを離していないためですよ
VB6のインスタンスが2つある状態なのですよね
VB6-ActiveXとVB6-TextExeが起動している状態で
VB6-TestEXEが参照設定のため DLLをつかみっぱなしになっています
DLLが開発途上なら プロジェクトグループで開発したほうが良いと思います
DLLプロジェクトとテスト用EXEプロジェクトを1つのグループにして開発orデバッグします

どちらでも良いですからプロジェクトを開いて
ファイル > プロジェクトの追加 で他方のプロジェクトを追加します
テスト用EXEプロジェクトに参照設定をして開発します

DLL側の修正はそのままコードウィンドウを開いて編集します
DLLファイルの作成し直しは
プロジェクトウィンドウで DLLプロジェクトをアクティブにして
ファイルメニューからDLL作成をします

テストEXEのデバッグには プロジェクトウィンドウでEXEプロジェクトをアクティブにしてからデバッグ実行などをします

QVB6.0-整数と余りを求める

表題の通り、整数と余りを求める関数を教えてほしいです:例:100/60=1余り40
整数:1
余り:40
よろしくお願いいたします。

Aベストアンサー

Dim A,B,C,D as integer
A=100
B=60
C=Int(A/B) <---答は1
D=A mod B

●IntはAをBで割った時の整数部分を求める関数ですが、答が負の場合は
注意が必要です。 例 Int(-100/40)=-2
これを回避する場合 Fixがいいです

●mod は A を B で割った時の余りを求める関数

Qコンパイルエラー:ユーザ定義型は定義されていません、と出るのですがどのライブラリファイルかわかりません。

VB6で以前誰かが作ったプログラムの修正をしているのですが、コンパイルができません。

コンパイルエラー:ユーザ定義型は定義されていません。と表示されてしまします。

参照設定のライブラリファイルにチェックを入れればいいと思うのですが、どのライブラリファイルにチェックを入れればいいのかわかりません。
どなたか教えていただけないでしょうか?

現在チェックが入れてあるのは
Visual Basic For Applications
Microsoft Access 10.0 Object Library
OLE Automation
Microsoft Visual Basic for Applications Extensibility5.3
Microsoft DAO3.6 Object Library
の五つです。

ソースは以下のとおりです。

-------------------------------------------
Private Sub timTimer_Timer()
Dim objCmpct As PharmitCompact

timTimer.Enabled = False

Set objCmpct = New PharmitCompact
objCmpct.DatabaseFolder = App.path & "\Database"
objCmpct.DBCompactType = phrCmpTypeAll
objCmpct.Exec
Set objCmpct = Nothing

Unload Me

End Sub
---------------------------------------------
上のソースで
objCmpct As PharmitCompact
の部分の色がエラーで変化します。

原因が違っていたらごめんなさい。
どうぞよろしくお願い致します。

VB6で以前誰かが作ったプログラムの修正をしているのですが、コンパイルができません。

コンパイルエラー:ユーザ定義型は定義されていません。と表示されてしまします。

参照設定のライブラリファイルにチェックを入れればいいと思うのですが、どのライブラリファイルにチェックを入れればいいのかわかりません。
どなたか教えていただけないでしょうか?

現在チェックが入れてあるのは
Visual Basic For Applications
Microsoft Access 10.0 Object Library
OLE Automation
Microsoft Visual Basi...続きを読む

Aベストアンサー

#1です。


PharmitCompact型のクラスまたは構造体が、どこにあるかは
わかりませんが、どこかにコードがあるようですね。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング