環境:Win2000+VB6SP5

自作のDLLのVBPとそれを参照するEXEのVBPがあるのですが、
EXE側からDLL呼び出し、呼出し後もDLL内のソースをステップ実行するにはどうすればよいのでしょうか?

よろしくお願いしますm(__)m

A 回答 (2件)

ActiveX DLLの作成・デバッグ方法はMSDNの



Visual Basic の使用方法
└コンポーネント ツール ガイド
 └ActiveX コンポーネントの作成方法
  └ActiveX DLLの作成
   └テスト アプリケーション TestThing の実行

当りが参考になります。

要は「Ctrl + F5」で実行です。
    • good
    • 0
この回答へのお礼

なんだかんだでグループ化した後に、DLL側をコンパイルし
それをEXE側で参照設定させるとデバッグできるようになりました。
ありがとうございました。

お礼日時:2003/10/15 11:51

プロジェクトグループ

この回答への補足

にしてもブレークポイントで止められないのは、何か問題があるのでしょうか?

補足日時:2003/10/14 17:43
    • good
    • 0

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

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

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

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

QVB6.0を使用しています

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

Aベストアンサー

System32に無いので、やはりカレントを探しています。
EXEになっている方は同じフォルダ内にあるDLLを使って
いると思われますが、デバッグ中のカレントは規定では
VB自体が起動した所なので、探す場所が違っていると
考えられます。試しに、CurDirをメッセージボックスで
表示するコードを入れてみるとハッキリします。
そこで、DLLの関数を使用する前にカレントを自分の
プロジェクトのフォルダ(ここには最新DLLを置く)に
移動しておきます。これでDLLを探す場所を変更できます。

本当はDLLの定義をClassモジュールで定義し、ここを
通して間接的に呼び出す方が、より好ましいのです。
標準モジュールですと、DLLはプロセス空間にロードされる
ため、一度でも実行(ロード)されるとリフレッシュでき
ませんが、Classモジュールで定義すると、インスタンスを
作り直す(一度、Nothingをセットしてから再度、Newを行う)
ことで、DLLをリフレシュできます。特にWinSockのように、
障害で内部データが壊れると、リフレッシュしない限り復旧
しない作り(内部データを保持する)のDLLでは尚更です。

System32に無いので、やはりカレントを探しています。
EXEになっている方は同じフォルダ内にあるDLLを使って
いると思われますが、デバッグ中のカレントは規定では
VB自体が起動した所なので、探す場所が違っていると
考えられます。試しに、CurDirをメッセージボックスで
表示するコードを入れてみるとハッキリします。
そこで、DLLの関数を使用する前にカレントを自分の
プロジェクトのフォルダ(ここには最新DLLを置く)に
移動しておきます。これでDLLを探す場所を変更できます。

本当はDLLの定義をClassモジ...続きを読む

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 で割った時の余りを求める関数

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プロジェクトをアクティブにしてからデバッグ実行などをします

QVBAで呼び出した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)

VB2010で、COM相互運用機能を使って作成したDLLを
VBAから呼び出すことはできるのですが
この状態でこのDLLをデバッグすることはできないでしょうか。

本来ならば、DLLをデバッグするテストプログラムを
VB2010のVB.NETのWindowsフォームアプリケーションか
ConsoleApplication1で作成して、
同じソリューションの中に
DLLとテストプログラムのプロジェクトを配置して
参照の追加でDLLを参照設定して
両者をデバッグをすると思われますが、

テストプログラムを作るのがかなり大変なのと、
今回作成したDLLは、元...続きを読む

Aベストアンサー

1.VB2010の方で、プロジェクトのプロパティ→デバッグ→外部プログラムの開始
  を選んで、該当するExcelやWordのEXEを指定
2.VB2010からデバッグ実行
3.起動したExcelやらWordやらで対象のファイルを開いてマクロを実行

で出来ます。

Qオブジェクト(dll)のレジストリ登録について

いつもお世話になっております。

dllの使い方について教えてください。

vb5.0で開発を進めているのですが、
dllを呼び出す際に、レジストリ登録を
しなければいけないのでしょうか?

いくつかのサイトでは、参照設定際すれば、
実行できているようです。。

実行環境では、レジストリ登録しないと
動かない場合があるということでしょうか?

ご教授、よろしくお願いします。

Aベストアンサー

何のDLLか、によるが。

・あなたがVB5.0で作成したDLLを、開発に使ったマシン以外で使う。
→該当するマシンでレジストリに登録する必要があります。

・あなたがVB5.0で開発を行うにあたり使用するDLLを開発に使ったマシン以外で使う。
→VB5.0で参照設定できるのであれば、それと同じ方法で該当するマシンにDLLをインストールすれば同様にレジストリに登録済みとなる事でしょう。

よくわかんなければ次のようにしてみれば良いだろう。コマンドプロンプトを開いて
C:\>regsvr32 hogehoge.dll
これで「Successful」と出ればActiveX DLLだ。エントリポイントが見つかりません云々と言われたらそれはWin32ネイティブDLLという事。登録に失敗して環境を壊すという事はないのでとりあえず登録を試みてみれば良いのではないかな。

現在では大きく分けてDLLは3つある。
・Win32ネイティブDLL:レジストリ登録不要。パスの通った所に配置する。
・ActiveX DLL:レジストリ情報によって呼び出すDLL。レジストリに登録する。インプロセスCOMサーバと言っても差し支えないかもしれないがあるかもしれない。
・Microsoft .Net アセンブリ:レジストリの登録は不要。単純に実行ファイルと同じパスに配置するか、.Netにおけるレジストリといえるグローバルアセンブリキャッシュに登録する。

何のDLLか、によるが。

・あなたがVB5.0で作成したDLLを、開発に使ったマシン以外で使う。
→該当するマシンでレジストリに登録する必要があります。

・あなたがVB5.0で開発を行うにあたり使用するDLLを開発に使ったマシン以外で使う。
→VB5.0で参照設定できるのであれば、それと同じ方法で該当するマシンにDLLをインストールすれば同様にレジストリに登録済みとなる事でしょう。

よくわかんなければ次のようにしてみれば良いだろう。コマンドプロンプトを開いて
C:\>regsvr32 hogehoge.dll
これで「S...続きを読む

QActiveX DLL と ActiveXコントロールの違い

VB6で開発をしています。
複数のEXEファイルを使用するシステムです。
各EXEファイルの共通のモジュールをライブラリ化しようと思っています。

これは [ActiveX DLL] 又は、[ActiveXコントロール] のどちらでも実現できると思うんですが、どちらで作成した方が良いのでしょうか?

それぞれのメリット、デミリットを教えて下さい。

Aベストアンサー

混乱させますw

私も最近まで知らなかったのですが、任意のタイミングでOCXもインスタンスの生成が可能みたいです。
WinSockを張らずにPGを書き上げ、WinSockコントロールを使用する方法がわたしの利用しているメーリングリストに出ておりました。
その結末は、「あまり公開はされてはいないけど、ほとんどのコントロールはEXEにしてからOCXとして取り込むことができる」ということです。


ActiveXDLLも参照設定をしなければ、DLLバージョンが違っても大丈夫です。
ただし宣言が
As HogeHoge←(DLLの定義)を
As Object
として、CreateObject("DLL定義")のように行うと、引数が一緒ならEXEはリコンパイルしないでもいいです。実例として、エクセルを参照設定して[as Excel]と宣言していたら、その参照設定に対応したExcelしか操作できませんが、[As Object]と[CreateObject("Excel.Application")]とすると、EXCEL95~XPまで扱えます。
不便なのは、タイプライブラリが未設定になるので、Excelの各プロパティ/メソッドを知らないといけないし、Excel固有の定数が宣言もされてないので、自分で定数値を調べなければいけません。でもバージョンの違いを気にしないでいけるのは、非常に便利です。


速さのことを言ったら、当然DLLが早いです。
OCXはプロパティにRight/Leftなどを持っています。変えて言うと実体を持っていると言うことです。非表示にしていても実体をもっています。DLLはインスタンスは生成されますが、OCXだって生成されるので、表示しないで使用するなら、OCXの意味があまりありません。


んで、私(個人)の考えとしては、、、
※オリジナルボタンなどの、画面上必要ならOCX
  理由:画面に必要だから
※画面に表示を行う必要がなくても、配布する気ならOCX
  理由:配布先のユーザが扱いやすい
※そうじゃなければDLL
  理由:OCXにする理由が見つからないから


余談です。
私はいつもCommonコントロールは使用しません。
  理由:簡単なAPIでも実現できるのに、機能が少ないCommonコントロールを追加して、EXEの容量を大きくしたくないから

混乱させますw

私も最近まで知らなかったのですが、任意のタイミングでOCXもインスタンスの生成が可能みたいです。
WinSockを張らずにPGを書き上げ、WinSockコントロールを使用する方法がわたしの利用しているメーリングリストに出ておりました。
その結末は、「あまり公開はされてはいないけど、ほとんどのコントロールはEXEにしてからOCXとして取り込むことができる」ということです。


ActiveXDLLも参照設定をしなければ、DLLバージョンが違っても大丈夫です。
ただし宣言が
As HogeHoge←(DLLの定...続きを読む

QVB6 配列を初期化したい

VB6でループさせて配列に値を入れて、計算させて最終的に求めたい値をRとします。そのときループで繰り返すためか同じ配列に値を入れてどんどん値がでかくなりRの値がおかしくなってしまいます;
おそらく問題は一回前に入れた配列がそのままのこってしまってるからなのだと思うのですが;
配列の中の値をクリアする方法はないものでしょうか?
一応、配列=0として初期化しようとしても値は変わらず前のが残ったままになってしまっています;
どなたかわかる方いらっしゃいましたらご回答宜しくお願いします

その他何かいい方法があればそれも教えていただけたらと思います

Aベストアンサー

Eraceステートメントを使用

  Dim a() as Long
  Dim s(100) as String
  Dim x() as Long

  Erase a     ’要素が0になる
  Erase s     ’要素が""になる

  Redim x(100) as Long

  Erase x      ’メモリを解放

注)VB2005の場合は動作が異なるので注意して下さい。

QVB6.0で、DLLを動的に参照したい

VB6.0では、DLLを利用する際の宣言部分で、パスを""で括った静的な記載でなく、動的な記載にできるのでしょうか。
色々と調べてみたのですが、イマイチピンとくるものがなかったので質問させていただきました。

例:Public Declare Function Ztest Lib "C:\Test1\Test2" Alias "Test3" (ByVal data1 As Long) As Long
                          ↓動的に変更したい
  Public Declare Function Ztest Lib "○○:\Test1\Test2" Alias "Test3" (ByVal data1 As Long) As Long

Aベストアンサー

できません。
Declareの場所は大域変数の宣言、つまり定数などを定義する
領域です。これをプログラム実行中に変更しようという行為
ですから、ダメな理由は分かると思います。
Basicではポインタを使用してメソッドを呼び出す手段が
ありません。よって、動的なDLLのロードを行い、関数の
アドレスを得ることはできますが、そこへ制御を移す手段が
無いのです。

但し、同じファイル名のDLL(中身は異なる)を別フォルダに
保存しておき、動的にどちらのフォルダからロードさせるかを
決めることはできます。方法はクラスオブジェクトを使います。
例えば、Class1に以下のような定義をします。
Private Declare Function Ztest Lib "Test1\Test2" _
Alias "Test3" (ByVal data1 As Long) As Long
Public Function ZCall(ByVal data1 As Long) As Long
ZCall = Ztest(data1)
End Function

呼び出し側は次のようにします。
Dim C As Class1
Dim A1 As Long, A2 As Long
SetCurrentDirectory "C:\AAA" 'カレント切り替え
Set C = New Class1 'インスタンス生成
A1 = C.ZCall(0) 'メソッド実行
Set C = Nothing 'インスタンス消滅
SetCurrentDirectory "C:\BBB" 'カレント切り替え
Set C = New Class1 'インスタンス生成
A2 = C.ZCall(0) 'メソッド実行
Set C = Nothing 'インスタンス消滅

DLLがシステムディレクトリになければカレントを探します。
クラスオブジェクトはインスタンス生成の度にDLLをロード
しますので、その時にカレントを切り替えておくと似たような
処理にすることができます。標準モジュールは静的な空間なので、
ここでDLLを定義すると、ロードされたDLLを解放できません。

できません。
Declareの場所は大域変数の宣言、つまり定数などを定義する
領域です。これをプログラム実行中に変更しようという行為
ですから、ダメな理由は分かると思います。
Basicではポインタを使用してメソッドを呼び出す手段が
ありません。よって、動的なDLLのロードを行い、関数の
アドレスを得ることはできますが、そこへ制御を移す手段が
無いのです。

但し、同じファイル名のDLL(中身は異なる)を別フォルダに
保存しておき、動的にどちらのフォルダからロードさせるかを
決めることはできます。方法...続きを読む

QVB6のユーザーコントロールの受け渡しでプロパティ

自作のユーザーコントロールをフォームに貼り付け、
それをクラスに渡してクラス内でそのコントロールのVisibleを制御しようとしておりますが、

フォームからコントロールのVisibleプロパティにアクセスできますが、
クラスからだと、
メソッドまたはデータメンバが見つかりません
とコンパイルエラーが出ます。

そこで、コントロールをControlやUserControlにキャストしてみましたが
型が一致しません
というエラーとなってしまいます。

コントロールにVisibleプロパティの追加を試みましたが、
ActiveXコントロールインタフェースウィザードの使用できる名前に於いて
それらのプロパティが列挙されません。

対象がユーザーコントロールでなく、ボタンなどの標準コントロールの場合は
できたのですが・・・

なにか方法をご存知でしたらご教授ください。

Aベストアンサー

Visibleプロパティを管理しているのがコンテナ側だからですよ
FormやPictureBoxはコンテナになりますのでフォームにはったUserControlの場合はVisibleプロパティが操作可能です

クラスに渡した UserControlですとこのコンテナが提供するExtenderプロパティを直接操作することが出来ないのではと思います


UserControlにVisibleを操作するプロパティを追加してみましょう

private bVisible as Boolean
Public Property Let MyVisible(value as Boolean)
  bVisible = value
  ' Extenderを通してVisibleを操作
  Extender.Visible = value
  PropertyChanged "MyVisible"
End Property

Public Property Get MyVisible() as Boolean
  MyVisible = bVisible
End Property

Private Sub UserControl_InitProperties()
  ' プロパティの初期化
  bVisible = Extender.Visible
End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  bVisible = PropBag.ReadProperty("MyVisible", Extender.Visible)
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  PropBag.WriteProperty "MyVisible", bVisible, Extender.Visible
End Sub
といった具合のコードを追加しておきます

クラス側では
obj.MyVisible = True
または
obj.MyVisible = False
といった具合で操作してみましょう

Visibleプロパティを管理しているのがコンテナ側だからですよ
FormやPictureBoxはコンテナになりますのでフォームにはったUserControlの場合はVisibleプロパティが操作可能です

クラスに渡した UserControlですとこのコンテナが提供するExtenderプロパティを直接操作することが出来ないのではと思います


UserControlにVisibleを操作するプロパティを追加してみましょう

private bVisible as Boolean
Public Property Let MyVisible(value as Boolean)
  bVisible = value
  ' Extenderを通してVisibleを操...続きを読む

QVB6.0でのOCX・DLLの作り方

VB6.0でのOCX・DLLの作り方を
詳しくご存知の方
もしくは
HP等ご存知の方
教えてくださいませんか?
よろしくお願いいたします。

Aベストアンサー

↓ こちらのサイト等はいかがかな !? ↓(^o^)丿

参考URL:http://hp.vector.co.jp/authors/VA014162/hitch/ActiveX/activex.htm


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

人気Q&Aランキング

おすすめ情報