• ベストアンサー

プロシージャ名の取得

教えてください。 VBで現在実行しているプロシージャ名を取得指定のですがkのようなことは可能ですか? 可能ならばどのようにすればいいか教えてください。 現在実行ファイルにて起動しているのですが、どこかで「実行エラー」が発生しています。 この実行エラーの場所の特定のために、現在起動中のプロシージャ名をログに保存しようかと考えています。 また、その他このようなエラー箇所特定方法などがありましたら教えてください。 環境:VB6.0  Win2000

質問者が選んだベストアンサー

  • ベストアンサー
  • takasebou
  • ベストアンサー率42% (61/144)
回答No.4

残念ながら出来ません。 私のプロジェクトでは全てのプロシージャに On Error コーディングをして、そこでログにどのプロシージャかを書いてました。 そういう方法しかないと思います。

その他の回答 (5)

  • kiyama_t
  • ベストアンサー率25% (19/74)
回答No.6

#1です。 なるほど。 だとすると、やはり、#4さんがご指摘のように、On Errorでエラーを回避して、それぞれにプロシージャ名を手動で書き込んでいくしかないと思います。 月1で発生するエラーなら、頻度は高いといえますし、だからといって、実行ログは取っていられないでしょうから、エラーログで対応するしかないですね。 でも、そのエラーが発生するタイミングに、共通点はないか、とか、エラー発生時の実行環境の状況、エラーメッセージ(メッセージが出ないとお手上げですが)などから、大体の絞込みは出来ないものでしょうか? いえ、難しいなら、エラーログを取るしかありませんが。

回答No.5

さらにさらに失礼しました。 >CodeModule 実行したら、「関数名」は取れないようです。 実行していない状況に限るようです。 関数名ではなく、モジュール名なら取れそうです。 以前に「GetModuleFileNameEx」をどこかで拾いました。 実行できないのですが、そのまま張っておきます。 http://support.microsoft.com/default.aspx?scid=kb;ja;228469 Option Explicit Private Declare Function WindowFromPoint Lib "user32" _  (ByVal xPoint As Long, _   ByVal yPoint As Long) As Long Private Declare Function GetCursorPos Lib "user32" _  (lpPoint As POINTAPI) As Long Private Declare Function GetWindowThreadProcessId Lib "user32" _  (ByVal hwnd As Long, _   lpdwProcessId As Long) As Long Private Declare Function GetParent Lib "user32" _  (ByVal hwnd As Long) As Long Private Declare Function EnumProcessModules Lib "psapi" _  (ByVal hProcess As Long, _   ByRef hMod As Long, _   ByVal sizehMod As Long, _   ByRef dwlpdwPIDsize As Long) As Long Private Declare Function GetModuleFileNameEx Lib "psapi" _  Alias "GetModuleFileNameExA" _  (ByVal hProcess As Long, _   ByVal hMod As Long, _   ByVal szFileName As String, _   ByVal nSize As Long) As Long Private Declare Function OpenProcess Lib "kernel32" _  (ByVal dwDesiredAccess As Long, _   ByVal bInheritHandle As Long, _   ByVal dwProcessId As Long) As Long Private Declare Function CloseHandle Lib "kernel32" _  (ByVal hObject As Long) As Long Private Const PROCESS_QUERY_INFORMATION = &H400 Private Const PROCESS_VM_READ = &H10 Private Const MAX_PATH = 260 Private Type POINTAPI  x As Long  y As Long End Type Private Sub Form_Load()  Timer1.Interval = 1000  Timer1.Enabled = True End Sub Private Sub Timer1_Timer()  Dim lngApiRet As Long  Dim lnghProcess As Long  Dim lnghModule(512) As Long  Dim strModuleName As String  Dim lngcbNeeded As Long  Dim lngStrLen As Long  Dim i As Integer  Dim lngProcessID As Long  Dim pp As POINTAPI  Dim lngParent As Long    List1.Clear  lngApiRet = GetCursorPos(pp)  lngParent = getTopParent(WindowFromPoint(pp.x, pp.y))  lngApiRet = GetWindowThreadProcessId(lngParent, lngProcessID)  lnghProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or _               PROCESS_VM_READ, _               0&, lngProcessID)   If lnghProcess Then    If EnumProcessModules(lnghProcess, lnghModule(0), _               UBound(lnghModule), lngcbNeeded) Then     For i = 0 To lngcbNeeded / 4 - 1      strModuleName = String(MAX_PATH, Chr(0))      lngStrLen = GetModuleFileNameEx(lnghProcess, _                      lnghModule(i), _                      strModuleName, _                      Len(strModuleName))      strModuleName = Left(strModuleName, lngStrLen)      List1.AddItem Format(lngProcessID, "00#") & _             vbTab & strModuleName     Next i    End If   End If   lngApiRet = CloseHandle(lnghProcess) End Sub Private Function getTopParent(ByVal lnghWnd As Long) As Long  getTopParent = IIf(CBool(GetParent(lnghWnd)), getTopParent(lnghWnd), lnghWnd) End Function

参考URL:
http://support.microsoft.com/default.aspx?scid=kb;ja;228469
回答No.3

すいません。 VBEはEXCEL用の場合に限るようです。 VBは CodeModuleオブジェクトがキーとなるようです。 参考URLのコメント付加アドインのサンプルがヒントとなると思います。 ただし、やはり開発環境に限りで、コンパイルしたらだめっぽいです。

参考URL:
http://www.galliver.co.jp/writing/nikkei_tokushu/adn002/page7.html
回答No.2

とおーい記憶で話しております。 VB6ならデバッグ限定で、確か取れたと思いますよ。 ただしコンパイルしたら取れなかったと思います。 キーワードは「VBE」だったと思います。 「思います」ばかりですいません。

  • kiyama_t
  • ベストアンサー率25% (19/74)
回答No.1

質問の回答としては、「そんなことはできません」だと思います。 ところで、質問を拝見するところ、実行エラーとのことですが、まず、実行ファイル(ってことはexeですか?)にする前に、デバッグできませんか? デバッグでは起こらない現象ですか? また、エラーログのとり方を、どのようにお考えですか? 補足をお願いします。

TeamMSY
質問者

補足

実行ファイルとはEXEのことです。 エラーというのが、1ヶ月に1回出るかでないようなものです。デバック環境では現状出ていません。 実行マシン(PC)にはVB6の開発環境をインストールしていません。 エラーログは現在下記のように考えています。 あるプロシージャに入ると、そのプロシージャ名をtxt形式でファイルに保存しようと考えています。 以上、説明不足ですみません。

関連するQ&A

専門家に質問してみよう