
へっぽこ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----
No.1ベストアンサー
- 回答日時:
VB6が DLLを離していないためですよ
VB6のインスタンスが2つある状態なのですよね
VB6-ActiveXとVB6-TextExeが起動している状態で
VB6-TestEXEが参照設定のため DLLをつかみっぱなしになっています
DLLが開発途上なら プロジェクトグループで開発したほうが良いと思います
DLLプロジェクトとテスト用EXEプロジェクトを1つのグループにして開発orデバッグします
どちらでも良いですからプロジェクトを開いて
ファイル > プロジェクトの追加 で他方のプロジェクトを追加します
テスト用EXEプロジェクトに参照設定をして開発します
DLL側の修正はそのままコードウィンドウを開いて編集します
DLLファイルの作成し直しは
プロジェクトウィンドウで DLLプロジェクトをアクティブにして
ファイルメニューからDLL作成をします
テストEXEのデバッグには プロジェクトウィンドウでEXEプロジェクトをアクティブにしてからデバッグ実行などをします
早々のご回答ありがとうございます。
ご助言の通りグループプロジェクトを作成しましたが、
DllプロジェクトにてExeを起動させる設定をしないと、
何も実行されません。
(Exeプロジェクトウィンドウをアクティブにして「開始」しても、
どうやらDLLプロジェクトの設定しか有効でないようで)
設定をしてしまうと、
DllプロジェクトでExe起動するパターンと同現象が発生します。
私自身、
グループプロジェクトは、
Dllプロジェクト単体でEXE起動設定をした場合と、
同じ状態にしかもっていけなかったので、
グループプロジェクトを使っていなかったという経緯があります。
>もちろん列挙型を設定していないDLLの場合ですと、上書きは可能です。
の通り、列挙型をPublic設定しているからが要因かと思っていましたが・・・。
申し訳御座いませんが、
グループプロジェクトについて、もう少しご説明頂けないでしょうか?

No.3
- 回答日時:
列挙型だけを記述したDLLを別に作成するのがおすすめです。
ExeからもDLLからも、そのDLLを参照設定しておけば、
どちらからも同じ列挙型が使えますし、インテリセンスも効きます。
以前、そのような構成の開発を経験したことがあるので。
ご回答ありがとうございます。
なるほど、スマートな方法ですね。
DLLとExeの関係(クラス構造?)がなるべく煩雑にならないように・・・
と考えましたが、甘い考えかもしれませんね(笑)
どこまで部品化するか・・・、考えればキリがなさそうです。
今の業務は、システムが幾つも散在していて、
無駄だらけです。
コーディング技術というよりも、
詳細・概要・・・その上の設計を学ぶべきところでしょうか。
余談ですが、
回答には回答日時がありますが、
お礼にはお礼日時がありませんね。
運用でカバーしましょう(笑)
2007/10/05 9:45:16
尚、ANO2のお礼は、上記数分前です。
No.2
- 回答日時:
テストEXEプロジェクトをアクティブにすると プロジェクトウィンドウのテストEXEプロジェクトが太字になるかと思いますがなりませんか?
そのプロジェクトを選択して右クリック > スタートアップとして設定で出来ると思います
ここが太字になっていないと DLL側のデバッグ設定が使われると思います
何度もご回答本当にありがとうございます。
Exeプロジェクトが「開始」していることを確認しました。
が、やはりDLLは上書きできませんでした。
このパターン(列挙型使用)だと、
Exeが参照設定でDLLを離さない理由がわかりません。
・・・というか、たった今解決してしまいました。
(?暫定対応?代替案?)
DLLのコンパイルを、
バイナリ互換でなく、プロジェクト互換でやると、
問題なく上書きできました。
(以下、こちらのサイトで「プロジェクト互換」で検索した結果の一部)
VB DLLプロジェクトについて
http://oshiete.nikkeibp.co.jp/qa1648268.html
インターフェイスIDを変えずにVBのDLLをリコンパイルするには?
http://oshiete.nikkeibp.co.jp/qa13566.html
プロジェクト変換
インターフェースIDが変更されるから、
参照設定しているVBのAPは、リコンパイルが必要。
→運用を考えると、好ましくない。
(APが増えれば、作業は甚大だし、管理が煩雑になる恐れ有・・・。
しかしながら、DLLとAPの関係を把握していないわけはないので、
作業面だけが問題か?)
バイナリ互換
インターフェースIDが変更されないから、
参照設定しているVBのAPは、リコンパイルが不要。
但し、(下記「VB DLLプロジェクトについて」抜粋)
1.実装済みメソッドの戻り値の型を変更できない。
2.引数の型及び個数を変更できない。
3.メソッドを追加した場合、COMクライアントの再コンパイルが必要。 (CreateObjectは別)
であるので、結局はリコンパイルが付き纏う。
(COMクライアントが、
COMを使っているAPのりコンパイルを指すのか、
コンポーネントサービス>COM+アプリケーション>コンポーネント の 再設定を指すのか、不明。)
上記と、今回の現象と、開発のし易さを考慮すると、
DLL・・・開発中はプロジェクト互換で、リリース時にはバイナリ互換で。
DLL使用するAP等・・・開発中は参照設定で、リリース時にはCreateObjectで。
という結論に落ち着くでしょうか。
「理由は何だかわからないけど、こうすればうまくいく」
という危ない状態でしょうが、方向が間違ってなければ良しとする。
・・・悪い傾向です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual studio2017で、2回目の...
-
visual studio 2019 についての...
-
VB6.0を使用しています
-
VB6 exe作成時のアイコン変更方法
-
デバッグとビルドは何が違うの...
-
DLL参照時に指定されたモジュー...
-
eclipseでプログラムが実行でき...
-
visual studio2019でデバッグが...
-
VB.netを実行するとデバック プ...
-
C#、C++間のDLLの呼び出しについて
-
vb ver6 でformat文やTrim文の...
-
Eclipseのブレークポイントが○...
-
eclipseでデバックするとエラー...
-
visual studio 2008 のデバッグ...
-
デバッガでステップ実行してい...
-
標準関数が見つからない
-
ブレークポイントは現在の設定...
-
ダイアログなどの文字列が文字...
-
VB6のデバッグ
-
vbprojファイルが開けません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
visual studio2019でデバッグが...
-
DLL参照時に指定されたモジュー...
-
eclipseでデバックするとエラー...
-
Visual studio2017で、2回目の...
-
デバッガでステップ実行してい...
-
起動時に何のダイアログも表示...
-
デバッグとビルドは何が違うの...
-
Eclipseのブレークポイントが○...
-
ソリューションをまたがるデバ...
-
VB.netを実行するとデバック プ...
-
visual studio 2019 についての...
-
visual studio 2008 のデバッグ...
-
vb ver6 でformat文やTrim文の...
-
vb2010にてASPWEBシステムを作...
-
VB6.0を使用しています
-
VC++でDeugモードOKで、Release...
-
VB6 exe作成時のアイコン変更方法
-
vbprojファイルが開けません
-
Visual Studio 2017 ビルドする...
-
ASP.NETでデバッグができない
おすすめ情報