VB6での呼び出し元の関数名取得について

このQ&Aのポイント
  • VB6での呼び出し元の関数名を取得する方法について教えてください。
  • プログラムのデバッグのために、呼び出し元の関数名を取得したいです。
  • VB6での呼び出し元の関数名を直接文字列として埋め込む方法はありますか?
回答を見る
  • ベストアンサー

VB6での呼び出し元の関数名取得について

今更VB6・・・というのは承知の上で質問します。 プログラムのデバッグのために、表題の件のような機能を実装したいと考えています。 .NET以降では Dim callerMethod As String = New StackFrame(1).GetMethod.Name といった具合に容易に取得できるのはわかったのですが、VB6では容易ではないようです。 これに相当する機能は本当に実装されていないのか、といろいろ調べてみました。 今のところ正解にはたどり着けていません。 現在考えていること。これらが可能かどうかご教授ください。 1.VB6単体で完結したい。 2.それがだめなら何かしらDLLを作成すれば似た機能を利用することができるのか。 それでもだめなら関数名を直接”文字列”として埋め込む、という総当たり作戦を考えています。 個人的には・・・ ”呼び出し履歴では追えるのだから、なんとかなるだろう”と考えているのですが 安直すぎるのでしょうか。

  • t-aka
  • お礼率93% (75/80)

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

  • ベストアンサー
noname#212058
noname#212058
回答No.1

残念ながらできません。 呼び出し履歴は、開発環境がデバッグ実行で VB6 の コードの動作を『シュミュレート』しているので取れるの です。VB6 の本来の機能ではありません。 (開発環境のデバッグ実行は、あくまでシュミュレート なので、ビルドした exe を起動したときの動作とは 違うことがあります) VB6では面倒ですが、関数の引数に呼出元の名前でも 渡すようにするしかありません。 (引数が嫌なら、グローバル変数を使って自力で『呼出 履歴 (スタック)』を作る方法もあるかもしれませんが…)

t-aka
質問者

お礼

ありがとうございます。 やはり実現は困難ですか・・。 おっしゃる通り、エミュレーションするのも手ですね。 検討してみます。 しかし恒久的には、きっちりとVB6にて実装したのちに、 潔く.NET環境に移行しようと思います。

関連するQ&A

  • Cで作成したDLL関数をVBから呼ぶ(.NET)

    以前の質問に「Cで作成したDLL関数をVBから呼ぶ」(QNo.1703839)がありますが、下記のコードを見るとVB6での内容だと思います。 Dim keydata As String * 128 keydata = String$(128, Chr(0) & Chr(0)) VB.NETでVC++のDLLで変更した文字列を受けたいのですが、 どのようにすればよいのでしょうか? VB.NET2003 <DllImport("DllTest.dll")> Private Shared Function _ Test(ByVal s1 As String) As String End Function Private Sub btnTest_Click(...) ... Dim s1 As String = "abc" Dim s2 As String Dim s3 As String s2 = Test(s1) MessageBox.Show(s2) ' "1"が表示される s3 = StrConv(s2, VbStrConv.None) MessageBox.Show(s3) ' 同じく"1"が表示 end sub VC++のDLL extern "C" __declspec (dllexport) BSTR __stdcall Test(char* s1) { AfxMessageBox(s1); // "abc"が表示される OK strcpy(s1, "123"); CString s2; s2 = "123"; return s2.AllocSysString(); } また、文字列に全角を含めても大丈夫でしょうか? Unicodeの変換処理を行う必要があるのでしょうか? よろしくお願いします。

  • VB6.0を使用しています

    VB6.0を使用しています VC6.0でdefファイルで宣言してDLLを作成し VBのEXEよりDLLをCALLしています。 VBではDLLの関数をDeclareで宣言しています。 問題なのは ちょっと前まで問題なく動いたDLLですが 新規にDLL関数を追加したら EXEではちゃんと呼び出して処理を行なってくれておりますが VBのデバッグ起動で呼び出すと、その新規のDLLの関数がありませんと メッセージを通知して止まってしまいます、 EXEでは動くのにデバッグ起動ではだめなんでしょうか??不思議です もし、ご存知の方がいらっしゃいましたら教えてください。

  • VB2005 から DLL を呼び出す

    VB 初心者です。 今、VB の練習ということで VB 2005 Express Edition を使って、個人用ブラウザをつくっています。Web ページの表示は Webbrowser コンポーネントを使っています。 その仕様で、閲覧先によって HTTP Proxy を変更するようになっています。(自分で決めたんですが) いろいろ調べてみると、urlmon.dll の UrlMkSetSessionOption() を呼べば自分のアプリケーション限定で Proxy を変更できるようだ、ということがわかりました。 古い VB など(VB 6 とか?)では、 Private Declare Sub UrlMkSetSessionOption Lib "urlmon.dll" _ (ByVal dwOption As Long, ByVal pBuffer As Any, _ ByVal dwBufferLength As Long, _ ByVal dwReserved As Long) このような感じで宣言するとかあったんですが、VB2005 では Any がダメだとか、 Type INTERNET_PROXY_INFO Dim dwAccessType As Long Dim lpszProxy As String Dim lpszProxyBypass As String End Type で Type はダメだとか、呼び出し側で、LenB を使おうとしたら使えないだとか、INTERNET_OPTION_PROXY の値がわからないなど、問題が山積みです。 上記 DLL を VB 2005 で使ったことがある人がいたら(またはわかる人)、使い方を教えてもらえないでしょうか?

  • Cで作成したDLL関数をVBから呼ぶ

    以前にあった「Cで作成したDLL関数をVBから呼び 引数渡し方法」を試したのですがVB側でデータが受け取れません。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=711327 C側での値設定がわるいのでしょうか? VB側 Public Declare Function testAP Lib "C:\bin\test.dll" (ByVal lpKeyData As String) As Long --------------------------------------------------------------------------- Dim lngRc As Long Dim keydata As String * 128 keydata = String$(128, Chr(0) & Chr(0)) lngRc = testAP(keydata) VC側 __declspec(dllexport) long __stdcall testAP(char *lpdata){ →C側でlpdataに値を設定する lpdata="ABCDEF"; }

  • VBAで呼び出したVBのDLLのデバッグ方法

    VB2010で、COM相互運用機能を使って作成したDLLを VBAから呼び出すことはできるのですが この状態でこのDLLをデバッグすることはできないでしょうか。 本来ならば、DLLをデバッグするテストプログラムを VB2010のVB.NETのWindowsフォームアプリケーションか ConsoleApplication1で作成して、 同じソリューションの中に DLLとテストプログラムのプロジェクトを配置して 参照の追加でDLLを参照設定して 両者をデバッグをすると思われますが、 テストプログラムを作るのがかなり大変なのと、 今回作成したDLLは、元々はVBAの中のひとつのプロシージャ―で、 事情があって、このプロシージャ―だけをVBのDLLにしたものです。 このプロシージャ―は元々はVBAの中で正しく動作していたものです。 VBに書き直した時に何らかの不具合が起きていると思われます。 テストプログラムを作らずに、既存のVBAから呼び出して、 DLLの部分の動作だけを(できればVB2010で)デバッグできないでしょうか。 よろしくお願いします。 (WindowsXP SP3 , Excel2003のVBA , Visual Studio 2010)

  • DLL VBとC++

    VBAからVC++2005のDLLを呼び出すプログラムを書いています。 VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。 DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、 リターンを押すと、落ちました。 VB側の引数の値 String * 8192が悪いのでしょうか? return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか? ついでの質問ですが、DEFの @1は無くても動くのでしょうか? 意味が知りたいです。 // ----- C++ (DLL側) ----- int __stdcall cpp_proc(LPCSTR inp, LPSTR out) { ... 省略 MessageBox(0, "ここまで通過", "debug", MB_OK); return 0; } // ----- DEF ----- LIBRARY "example" DESCRIPTION 'テスト' EXPORTS ; 明示的なエクスポートはここへ記述できます cpp_proc @1 '----- VB側 ----- Public Declare Function cpp_proc Lib "example.dll" _ (ByVal inp As String, ByRef out As String) As Integer Public Sub Test() Dim ret As Integer Dim inp As String Dim out As String * 8192 ret = cpp_proc(inp, out) MsgBox("ret=[" & Cstr(ret) & "]"); End Sub

  • VBのString型の配列をVCで受け取るには?

    VBでString型の配列として定義されている変数を VCのプログラムで受け取るにはどうすればよいのでしょうか? 試しにVBでString型の配列を作って DLLのC_TESTというファンクションを呼び出すという 処理を作ってみたのですが、コンパイルエラーになってしまいます。 なにかおかしいところありますか? そもそもVCにはString型ってないんですよね? プログラミング初心者ですので、変な言葉遣いに なってるかもしれませんが宜しくお願いします。 VB Declare Function C_TEST Lib "\test.dll" (ByVal data() As String) As Integer Dim A(1) As String dim rtn as Integer A(0)="あああ" A(1)="いいい" rtn= C_TEST(A) VCのプログラム int _stdcall C_TEST(LPSTR A[2] ){ AfxMessageBox( A[0] ); return(0); }

  • Type.GetMethodで困っています

    文字列クラス名よりDLLの関数を呼ぶプログラムを作っています。 問題は関数取得を行っているところです。 呼び出し側で、 Dim metDll As MethodInfo = typDll.GetMethod("Main1", typParam) を行うとNothingが返ってきてしまいます。 原因はDLLのMain1の第2引数がByRefになっていることでした。 そこでByRefに対応するために、 Dim metDll As MethodInfo = typDll.GetMethod("Main1", BindingFlags.Public Or BindingFlags.Instance, Nothing, New Type() {System.Type.GetType("System.String"), System.Type.GetType("System.String&")}, Nothing)) にすると関数の取得ができました。 しかしこの場合、DLL側の関数パラメータ数分、型を定義しなくてはいけないし、オーバーライドしているMain関数すべてに対応できなくなってしまいます。そこで、 Dim typParam() As Type = Type.GetTypeArray(strParam) の定義時にByRefにあたる部分に"System.String&"型を定義することはできないのでしょうか? ご回答お願いします。 '**************************** 'DLL側(test.dll) '名前空間(test) '**************************** Public Class DLL_TEST Public Overridable Function Main1(ByVal Param1 As String, ByRef Param2 As String) As String Param2 = "参照返し" Return Param1 End Function Public Overridable Function Main1(ByVal Param1 As String, ByVal Param2 As String, ByRef Param3 As String) As String Param3 = "参照返し" Return Param1 & ":" & Param2 End Function '**************************** '呼び出し側 '**************************** Imports System Imports System.Reflection Public Class Form1 Inherits System.Windows.Forms.Form ・ ・ ・ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim strParam() As String = {"C", "VB"} 'Dim strParam() As String = {"C", "VB", "J"} Dim typParam() As Type = Type.GetTypeArray(strParam) Dim asm As [Assembly] = [Assembly].LoadFrom("上記で作ったDLLの絶対パス") Dim typDll As Type = asm.GetType("test.DLL_TEST") Dim objDll As Object = Activator.CreateInstance(typDll) Dim metDll As MethodInfo = typDll.GetMethod("Main1", typParam)  'ここで metDll が Nothing になってしまう '下記だとmetDll にMethodInfo が返ってくる 'typDll.GetMethod("Main1", BindingFlags.Public Or BindingFlags.Instance, Nothing, New Type() {System.Type.GetType("System.String"), System.Type.GetType("System.String&")}, Nothing) Dim Ret As String = metDll.Invoke(objDll, strParam) If Ret = "C" And strParam(1).ToString = "参照返し" Then MsgBox("成功") End If End Sub

  • Cで作成したDLL関数をVBから呼び 引数渡し方法

    /**** Cプログラム *****/ int testAP( char* a) aのポインタにアドレスを返します。 /**** VB プログラム****/ Public Declare Function testAP Lib "test.dll" (ByRef a As String) As Integer Dim keydata As String * 128 lngRc = testAP(keydata) 上記VBのAPを実行するとアプリケーションエラーになります。 Cプログラムのデバックをすると入口ではaのポインタにはアドレスがセットされていて 、値を設定出来、最後まで正常動作して、VBとのインタフェースで落ちています。 VB6.exeでアプリケーションエラーになっています。 恐らく、VBにはポインタという概念が無いと聞いていてCのAPとの受け渡しに失敗して そうなのですが、VBでの引き渡し方法が分かりません。 よろしくお願い致します。

  • VBからMFC-DLL呼び出し

    VC++6.0でDLLを作成してVBから呼んでいます。 VC++6.0 __declspec(dllexport) BSTR WINAPI FunA() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strA = _T("This is the テストです。.愛する</CsvData>"); return strA.AllocSysString(); } VB6.0 Private Declare Function FunA _ Lib "Communication.dll" () As String Dim strRet As String strRet = StrConv(FunA(), vbFromUnicode) これを実行すると 『This is the テストです。.愛す?</CsvData>』 がstrRetに格納されます。 『愛する』→『愛す?』になってしまうんですが、 どうしてでしょうか。

専門家に質問してみよう