- PR -

ActiveX OCXを使用したActiveX DLLをVB.NETから参照

1
投稿者投稿内容
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-09-04 02:02
お世話になります。
ActiveX OCXを使用したVB6で作られたActiveX DLLがあり
このDLLをVB.NET2005から参照しています。
このDLLにはフォームがありOCXのコントロールが配置されています。
使用しているOCXはグレープシティのINPUTMANのTEXT.OCXです。

VB.NETからこのDLLを参照し、OCXコントロールに文字を入力すると
全角文字が文字化けてしまいます。
VB6から同じDLLを参照して入力すると正しく入力できます。

このOCXをVB.NETから参照した状態で
文字を入力すると正しく入力できます。

OCXをVB.NETから参照するとAxTEXT.OCXとなり
AxHOSTによってラップされているものと思われます。

このようにActiveX Dll経由でActiveX OCXを使用する場合でも
AxHOSTによってラップする必要があるのでしょうか?
そうなるとActiveX Dll で使用しているOCXをすべて
ラップすることになりなります。。。

ActiveX DllをOCXを使用していない別のActiveX Dllで
ラップしてからVB.NETで参照することで回避はできました。

・すべてのOCXをAxHostでラップする
・OCXを使用していない別のActiveX Dllでラップする
以外になにかよい方法はありますでしょうか?






Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-09-05 01:13
その後、調査を続けた結果
引用:


ActiveX DllをOCXを使用していない別のActiveX Dllで
ラップしてからVB.NETで参照することで回避はできました。


は勘違いでVB.NETから直接、OCXを使用したActiveX Dllを参照した時と同じで
文字化けしておりました。

よって、現状では
・すべてのOCXをAxHostでラップする
をしか回避方法がない状況です。

OCXをAxHostでラップした場合もActiveX DLLから呼び出されるOCXは
元のOCXになると思うのですが、
VB.NETでAxOCXを参照するとなぜ正常に動作するのかわからず悩んでおります。

VB.NET -> ActiveX Dll -> ActiveX OCX
ではなく
VB.NET -> ActiveX Dll -> ActiveX OCX
      -> AxOcx    -> ActiveX OCX
になるということでしょうか?


Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-09-06 23:58
推測に基づいて発言します。

引用:

OCXをAxHostでラップした場合もActiveX DLLから呼び出されるOCXは
元のOCXになると思うのですが、
VB.NETでAxOCXを参照するとなぜ正常に動作するのかわからず悩んでおります。

VB.NET -> ActiveX Dll -> ActiveX OCX
ではなく
VB.NET -> ActiveX Dll -> ActiveX OCX
      -> AxOcx    -> ActiveX OCX
になるということでしょうか?


そういうことです。
Ax〜.dllは.NETで使うためのラッパーに過ぎませんので、.NET以外のところには効果がありません。
恐らく、VB.NETで直接参照して配置したコントロールと、ActiveX DLL経由で配置されているコントロール/フォームでは挙動が異なるのではないでしょうか。


ところで、INPUTMAN 7.0Jのトライアル版とVB6.0の組み合わせでXPにて試しましたが、再現できませんでした。
http://www.grapecity.com/Japan/support/database/P1_268_TrialVersions.htm#content

その他で気になる点
・ActiveX DLLのフォームに貼り付けた通常のテキストボックスでは問題が起きないのでしょうか?
→OCX特有の問題か、VB6 ActiveX DLL全体の問題かの切り分け。
・ActiveX DLLを作成している環境とVB.NET2005の環境は同一マシン上にあるのでしょうか?
→開発環境による差の切り分け。

多分違うとは思いますが、昔、vb6jp.dllがなく、msvbvm60.dllだけがある環境で日本語のVB6アプリを実行すると、日本語が文字化けた経験がありました。
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-09-07 02:49
Azuleanさま、回答ありがとうございます。

引用:

・ActiveX DLLのフォームに貼り付けた通常のテキストボックスでは問題が起きないのでしょうか?
→OCX特有の問題か、VB6 ActiveX DLL全体の問題かの切り分け。


VB標準のTextBoxでは正常に入力できます。
私の環境はINPUTMAN 5.0J(ActiveX)で
この現象はAllowAllプロパティを[全角]に設定したときにのみ発生しています。

引用:

・ActiveX DLLを作成している環境とVB.NET2005の環境は同一マシン上にあるのでしょうか?
→開発環境による差の切り分け。


はい。同一環境です。


VB.NETがOCXを使用しているわけではなく
DLLがOCXを使用しているので
VB.NETがOCXに対して何らかの不具合を及ぼしていることは考えていませんでしたが、
この考え自体、間違っているというこのなのでしょうか?
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-09-07 11:46
引用:

VB標準のTextBoxでは正常に入力できます。
私の環境はINPUTMAN 5.0J(ActiveX)で
この現象はAllowAllプロパティを[全角]に設定したときにのみ発生しています。


INPUTMAN 7.0J(ActiveX)のトライアル版のimTextではAllowAllプロパティが見つかりません。動きが近そうなFormatプロパティで試してみましたが、再現を確認できませんでした。
そのバージョンで起きる何らかの問題かもしれません。

引用:

VB.NETがOCXを使用しているわけではなく
DLLがOCXを使用しているので
VB.NETがOCXに対して何らかの不具合を及ぼしていることは考えていませんでしたが、
この考え自体、間違っているというこのなのでしょうか?


そのActiveXコンポーネントが必要なものをロードできないとか、.NETアプリから間接的に呼び出されることで不具合が生じているとか可能性は巡らせることができますが、確たることは言えません。

ただ、VB.NETから間接的に呼ぶことで悪影響を受けるのはそのOCXの作りが悪い可能性が高いとは思うのですが、実際の現象を解析したわけではないので断定はできません。

GrapeCityのサポートに問い合わせてはどうでしょうか。
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-09-10 00:06
INPUTMAN7.0Jで同じようなActiveXDLLを作成して試してみましたが
やはり、現象は発生しませんでした。

そもそもINPUTMAN5.0JはWindowsXPに対応していないため
VB6からActiveXDLLを参照した場合であっても正常に動作する保障が
ないことがわかしました。

お手数をおかけいたしました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)