[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/05/25(Wed) 11:32
投稿者名:
Eメール:
URL :
タイトル:
VBで作成したDLLの利用法
いつも参考にさせていただいてます。

今回、VB6でDLLを作成しているのですが
このDLLをレジストリ登録せずに利用する方法はあるのでしょうか?

投稿時間:2005/05/25(Wed) 12:52
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: VBで作成したDLLの利用法
> 今回、VB6でDLLを作成しているのですが
> このDLLをレジストリ登録せずに利用する方法はあるのでしょうか?

XP限定で、こんなのとか。
hhttp://www.microsoft.com/japan/msdn/thisweek/vbxp/vbxp2.asp

――求めている機能とは異なるかもしれませんが。

投稿時間:2005/05/25(Wed) 13:04
投稿者名:
Eメール:
URL :
タイトル:
Re^2: VBで作成したDLLの利用法
魔界の仮面弁士様、回答ありがとうございます。

作成するアプリは動作環境が2000orXPなのでXP限定だと具合が悪いです。
ActiveX DLLである以上、レジストリ登録は避けられないのでしょうか…。


> XP限定で、こんなのとか。
> hhttp://www.microsoft.com/japan/msdn/thisweek/vbxp/vbxp2.asp
>
> ――求めている機能とは異なるかもしれませんが。

投稿時間:2005/05/25(Wed) 13:36
投稿者名:じゃんぬねっと
Eメール:
URL :http://jeanne.wankuma.com/
タイトル:
Re^3: VBで作成したDLLの利用法
> ActiveX DLLである以上、レジストリ登録は避けられないのでしょうか…。

登録自体は避けられませんね。
まあ、素直に VB2002 以降に移行しましょうよ。(^^)

投稿時間:2005/05/25(Wed) 18:34
投稿者名:
Eメール:
URL :
タイトル:
Re^4: VBで作成したDLLの利用法
じゃんぬねっと様、回答ありがとうございます。

> 登録自体は避けられませんね。
> まあ、素直に VB2002 以降に移行しましょうよ。(^^)

VB6で開発しているのは、開発環境がVB6しかないからなのです…。
また、エンドユーザがPC初心者の場合もあり、WindowsUpdateがちゃんと当たっている保証も無いため
ランタイム等をインストール時にまとめて放り込めるという理由もあります。
(VB.NETでもランタイムごと一式インストールできるのかもしれませんが)

ここまで書いておいてなんですが「VB2002=VB.NET」という認識でアリですよね(汗

投稿時間:2005/05/25(Wed) 13:40
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: VBで作成したDLLの利用法
> 作成するアプリは動作環境が2000orXPなのでXP限定だと具合が悪いです。
やり方は異なりますが、2000にも Side by Side 実行の為の機能があります。
レジストリ登録を回避できるわけではありませんが、一応、調査/検討してみては。

> ActiveX DLLである以上、レジストリ登録は避けられないのでしょうか…。
一応、外部関数を公開して利用するという Undocumented な方法などもありますが、
その前に、何故「レジストリ登録をしないのか」というそもそもの理由がわかれば、
別の回避策が提案できる かも 知れません。

投稿時間:2005/05/25(Wed) 18:43
投稿者名:
Eメール:
URL :
タイトル:
Re^4: VBで作成したDLLの利用法
度々の回答ありがとうございます。

> やり方は異なりますが、2000にも Side by Side 実行の為の機能があります。
> レジストリ登録を回避できるわけではありませんが、一応、調査/検討してみては。
動作環境としましては実行モジュールとDLLは同一のフォルダに置くつもりです。

> 一応、外部関数を公開して利用するという Undocumented な方法などもありますが、
> その前に、何故「レジストリ登録をしないのか」というそもそもの理由がわかれば、
> 別の回避策が提案できる かも 知れません。
Undocumentedですか…非常に興味深いです。
レジストリ登録しない理由は明確には無いのです(お恥ずかしい話ですが)
自分がレジストリにあまり良い印象を持っていないというか、
設計者が画面単位でDLL化するとか言い出しているもので、
1つのアプリケーションで何個もDLLを登録するものなんだかなぁ…と思った次第です。

投稿時間:2005/05/25(Wed) 19:51
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^5: VBで作成したDLLの利用法
> > やり方は異なりますが、2000にも Side by Side 実行の為の機能があります。
> > レジストリ登録を回避できるわけではありませんが、一応、調査/検討してみては。
> 動作環境としましては実行モジュールとDLLは同一のフォルダに置くつもりです。
同じフォルダに置くならば、.localファイル(Win2000のSide by Side実装手順)が使えますね。

> Undocumentedですか…非常に興味深いです。
手順は記しませんが、元ネタは W.Stealride さんの記事です。

興味がおありなら、Visual Basic Magazine のバックナンバー(June 1998)を探して、
『Stealrideの逆襲 [Visual Basicで標準入出力を扱う]』という記事を読んでみてください。

> レジストリ登録しない理由は明確には無いのです(お恥ずかしい話ですが)
ならばあえて、「登録せずにDLLを使う」という茨の道を歩む必要は無いのでは? (^^;
「DLLを使わない」or「DLLを登録して使う」という選択肢が無いか、再検討してみましょう。

> 自分がレジストリにあまり良い印象を持っていないというか、
その理由は何でしょうか?

> 設計者が画面単位でDLL化するとか言い出しているもので、
> 1つのアプリケーションで何個もDLLを登録するものなんだかなぁ…と思った次第です。
問題があると思うのなら、その理由を添えて、今のうちに設計者と話し合った方が良いですよ。
あとから開発手法を変更するとなったら、大変でしょうし。(^-^

投稿時間:2005/05/26(Thu) 09:28
投稿者名:
Eメール:
URL :
タイトル:
Re^6: VBで作成したDLLの利用法
> 同じフォルダに置くならば、.localファイル(Win2000のSide by Side実装手順)が使えますね。
ちょっと調べてみましたが、「実行ファイル名.exe.local」ってファイルを置いておけばいいみたいで
すね。
コレって0バイトのファイルでいいんでしょうか?

> 興味がおありなら、Visual Basic Magazine のバックナンバー(June 1998)を探して、
> 『Stealrideの逆襲 [Visual Basicで標準入出力を扱う]』という記事を読んでみてください。
見付かるか判りませんが探してみる事にします。

> ならばあえて、「登録せずにDLLを使う」という茨の道を歩む必要は無いのでは? (^^;
> 「DLLを使わない」or「DLLを登録して使う」という選択肢が無いか、再検討してみましょう。
今現在はDLLを使わないバージョンがあることはあります。
「バグ修正時の対応をやりやすくするためにDLL化」というお達しがあって取り掛かっているのですが…
よく考えたらDLL化させる意味ってあまり無いような気もしてきました…

> その理由は何でしょうか?
感覚的に思い込んでるだけですのでなんとも言えません(汗

> 問題があると思うのなら、その理由を添えて、今のうちに設計者と話し合った方が良いですよ。
> あとから開発手法を変更するとなったら、大変でしょうし。(^-^
DLL化の是非も含めて、設計者と話し合ってみたいと思います。
ありがとうございました。

また判らないことが出てきたら質問させていただきます。

投稿時間:2005/05/26(Thu) 09:37
投稿者名:ビートル
Eメール:
URL :
タイトル:
Re: VBで作成したDLLの利用法
> いつも参考にさせていただいてます。
>
> 今回、VB6でDLLを作成しているのですが
> このDLLをレジストリ登録せずに利用する方法はあるのでしょうか?

 メニューバーのプロジェクト->参照設定でDLLを参照すれば
どうでしょうか?

Set mfopen = New clsFileOpen

でインスタンス生成であとはメソッド使用。

レジストリには登録されないと思います。

投稿時間:2005/05/26(Thu) 10:08
投稿者名:那岐
Eメール:
URL :
タイトル:
Re^2: VBで作成したDLLの利用法
>  メニューバーのプロジェクト->参照設定でDLLを参照すれば
> どうでしょうか?

ActiveXDLLとの事でしたので体験談を一つ。
ActiveXDLLの場合レジストリ登録がでうまくきてないとEXEから呼び出した際に
エラーが発生した記憶があります。
ActiveXコンポーネントが作成できませんでした云々、とかなんとか。

#その時のインストーラの設定も拙かったのかもしれないです。色々問題が出ましたので…ね…orz
#バイナリ互換でファイルだけ置き換えってActiveXDLLにも通用するのかしら?

投稿時間:2005/05/26(Thu) 10:30
投稿者名:ビートル
Eメール:
URL :
タイトル:
Re^3: VBで作成したDLLの利用法
> ActiveXDLLの場合レジストリ登録がでうまくきてないとEXEから呼び出した際に
> エラーが発生した記憶があります。

 EXEから呼び出した際には、参照パスが異なってしまうとだめですよね。
DLL固定のフォルダのパスを決めておけば、大丈夫だと思います。
それがだめなら、shell関数でbatファイルを実行してレジストリ登録、解除という感じ
ではどうでしょう。

●手順
1.プログラム起動時『Call Shell("a.bat", vbNormalFocus)』を実行
2.プログラム終了時『Call Shell("b.bat", vbNormalFocus)』を実行

●a.batファイル中身[レジストリ登録]
regsvr32 /s .\..\dll\sample.dll

●b.batファイル解除[レジストリ解除]
regsvr32 /u /s .\..\dll\sample.dll

投稿時間:2005/05/26(Thu) 15:04
投稿者名:那岐
Eメール:
URL :
タイトル:
Re^4: VBで作成したDLLの利用法
>  EXEから呼び出した際には、参照パスが異なってしまうとだめですよね。
> DLL固定のフォルダのパスを決めておけば、大丈夫だと思います。

起動するEXEから見たDLLの相対パスは変わらないのですが、レジストリの登録値がEXE側と
異なっているためにエラーが発生した様でした。
元々あったインストーラはバージョンが古いという事で、参照設定などを更新するために
新規にインストーラを作成してそれをインストールするとエラー発生。
(インストーラ作成はVisualStudioInstoller)

#元々登録してあったVBプロジェクトが既に存在しないインストーラもどうかと思いますが
#作った人はもういないので文句の言い様もないorz

VisualStudioInstollerで新旧インストーラの相違点を調べてみるとインストーラ側で
レジストリに登録する値が異なっていたため、上記の様な見解に達しました。
インストールせずに実行すると動くあたりが実に不思議でした。
インストール後にEXEとDLLを上書きしてみても動いてました。

#良ろしくない稼動方法である事は承知の上ですがその時はどうしても急いで動かさないと
#いけない状況だったのでやむを得ず…。おかげで開発環境を一つ壊してしまいました(馬鹿)
#スレ違いでなければ今後の参考のためにも上記動作の理由が知りたいものです。

投稿時間:2005/05/26(Thu) 11:26
投稿者名:
Eメール:
URL :
タイトル:
Re^2: VBで作成したDLLの利用法
ビートル様、回答ありがとうございます。

>  メニューバーのプロジェクト->参照設定でDLLを参照すれば
> どうでしょうか?
>
> Set mfopen = New clsFileOpen
>
> でインスタンス生成であとはメソッド使用。
>
> レジストリには登録されないと思います。

サンプルを作って試してみましたが、レジストリ未登録のDLLを参照設定で指定することで
確かに利用することができました。
しかし、参照していたDLLに「Regsvr32 /U」を実行してから再度実行するとエラーになりましたので
参照設定を行った時点でレジストリに登録されているようです。

投稿時間:2005/05/26(Thu) 12:00
投稿者名:ビートル
Eメール:
URL :
タイトル:
Re^3: VBで作成したDLLの利用法
> しかし、参照していたDLLに「Regsvr32 /U」を実行してから再度実行するとエラーになりましたの

> 参照設定を行った時点でレジストリに登録されているようです。

琴様、大変申し訳ございません。
レジストリに登録されていました。
お役に立てず残念・・・