Delphi XE3 WinXP SP3の環境で、VB6で動作するocxを使おうと考えています。
コンポーネントのインポート、ActiveXコントロールの取り込みから取り込む事はできたのですが
いざ実行して、プロパティなどにアクセスすると「ライブラリは登録されていません」と表示されます。
該当のocxはregsvr32.exeで登録していますし、レジストリを見ても登録されているようです。
そもそも、同じPCでVB6のEXEは動いているので登録されているはずだと思うのですが、原因が分かりません。
ただ1つ気になるのは、VBではフォームに貼り付けて使用しているのではなく
Private WithEvents jm As JMXCtrl
Set jm = New JMXCtrl
のようにして、動的に生成しているので、この辺にヒントがありそうなのですが、よく分かりません。
試しに、フォームに載せずに動的に生成したり
obj; variant;
obj := CreateOleObject('ocxのクラス識別子');
として
obj.<プロパティ> := ・・・
ともやってみたのですが、これもCreateOleObjectは成功しますが
プロパティへアクセスすると「ライブラリは登録されていません」と表示されました。
このocxを使用するにはどうすればいいでしょうか。
何かヒントをお願いできますでしょうか。
自己レスです。
その後、一部のプロパティやメソッドでは動作する事が判明し
その差を調べるべく、コントロールを取り込んだ時にできたソースを見たところ
動作するものをラップしている関数の中身は
DefaultInterface.<元のプロパティなどの名前>
となっていました。
そこで、動作しないプロパティなども全て同じ呼び出し方をしたら
エラーメッセージも無くすんなり動作しました。
どうも、このOCXは非ビジュアルのコンポーネントで、それを取り込む時に
強制的にフォームに載せられるようなビジュアルコンポのようにラッパーされたので
うまく扱えないような気がしてきました。
インターフェースの定義を使って、自前で生成すればうまく行きそうですが
勉強不足でインターフェース定義から、どうやってそのコントロールの
インスタンスを生成するのか、またどうやってプロパティなどを呼び出すのか分かりません。
インターフェース周りで参考になる情報がありましたらお願いいたします。
Quest さん,こんにちは,Mr.XRAY です.
残念ながら,これこれいった確実な知識はないのですが,
DefaultInterface.<元のプロパティなどの名前>
の方式で動作,アクセスできるのであれば,
obj := CreateOleObject('ocxのクラス識別子');
のあたりがポイントなのではないかと思っています.
例えば,同じエクセルのオブジェクトの生成でも,
ExcelObj := CreateOleObject('Excel.Application');
ExcelApp := CreateComObject(CLASS_ExcelApplication) as ExcelApplication;
などがあります.後,CoClass の CoXXXXX 等でも生成できます.
これは,XXXX_TLB_pas 内のインターフェイスの定義にもよりますので,
何とも言えません,理論的な内容が伝えることができればいいのですが,
大抵の場合,XXXX_TLB.pas のコードから判断してやってしまうので.
何かのヒントにでもなるといいのですが.
関係ないかな ?
外していたらゴメンナさい.
Mr.XRAYさん、こんばんは。
答えにくい質問に、レスありがとうございます。
obj := CreateOleObject('ocxのクラス識別子');
この辺りに糸口がありそうだとは思っていたのですが
この先の記述方法がサッパリで躓いていました。
いろいろググって見て、生成したオブジェクトをasで
キャストしてやって・・・かな?くらいで
何を生成して、何にキャストして、どう使うのかが判らず
COMとかインターフェースの知識が必要だろうという事だけは
なんとなく判りました。(^^;
とりあえず
DefaultInterface.<元のプロパティなどの名前>
の方法で、必要最低限の機能は呼び出せたので
機能検証デモとしては何とかなったのですが
本番までにはインターフェースを勉強してみます。
一応は解決としておいて、後日進展があれば報告します。
因みに、対象物はHITACHIの静脈認証装置です。
RATOCの指紋認証は簡単だったのになぁ。
おっと、言ったそばから「解決」し忘れた(^^;
ツイート | ![]() |