• 締切済み

ActiveXDLL(VB)にウィンドウハンドルを受け取るメソッドを用意したい

VB6で作成したActiveXDLLに、ウィンドウハンドルを渡すためのメソッドを実装したいと思います。 ActiveXDLLを使用するクライアントはCで作成しており、クライアント側で表示するウィンドウのボタンを押下した際にActiveXDLLのCOMコンポーネントをインスタンス化して、クライアントのウィンドハンドルをCOMコンポーネントに渡したい次第です。 VBでウィンドウハンドルを受け取るFunctionを作成したことがなく、また調べてみたものの解決策を見出すことができませんでしたので、よい方法や参考HPがあれば教えていただきたいと思っております。 よろしくお願いいたします。

みんなの回答

回答No.1

ぜんぜんわからないけど、なんとなく・・ VBは function XXXmethod(ByVal hWnd AS LONG) Cは COMObj.XXXmethod(wndObj.GetSafeHwnd()) なのでは?

関連するQ&A

  • VB2005でActiveXを作成したいです

    はじめまして。 VB2005でActiveXのCOMを作成したいですが、 新規作成プロジェクトに ActiveXコンポーネントの項目がありません。 どのようにして作成するのでしょうか?

  • COMコンポーネントの構造の本質的理解ができない

    プログラミングを始めて間もない初心者です。 windowsアプリケーションを制御対象として扱おうと、win32oleライブラリをrequireしてCOMコンポーネントを扱う方法をネット上で色々調べてみたのですがどうも腑に落ちない点・分からない点があるので質問します。 rubyリファレンスマニュアルからリンクされているサイト(http://jp.rubyist.net/magazine/?0003-Win32OLE)において、以下のような記述があります。 >COM ではインスタンスを生成するときに「COM コンポーネント」を指 >定するための ProgID を引数として WIN32OLE.new メソッドを実行し >ます。 COM コンポーネントとは、Windows に登録された、ある機能 >(たとえば、IE や MS Office の制御機能) を提供するためのもので >す。この「COM コンポーネント」を利用して作成したインスタンス を>「COM オブジェクト」とこの記事では呼んでいます。 COM オブジェク>トを作成した後は、その COM オブジェクトで定義されている「メソッ>ド」を実行することでそのコンポーネントが提供する機能を実現する >ことができます。 この文に従えば、作成したCOMオブジェクトを扱う方法を知るためにはCOMオブジェクトで定義されているメソッドを参照すれば良いこととなります。そこで自分もWIN32OLE.new("InternetExplorer.Application") によって得たCOMオブジェクトにWIN32OLE.ole_methodsを適用することでメソッドの一覧を取得しましたが、前述のサイトで紹介されているie.document.all.Item()というメソッドを探してみてもどこにも見つかりません。 これはどういうことなのかと思い、ネット上で色々とCOMとは何か、タイプライブラリとは何かなどを調べて見ましたが、いまだCOMの全体像の把握ができません。 たとえばrubyの場合、あるオブジェクトに対して使えるメソッドというのはそのオブジェクトが該当するクラスに於いて定義されているメソッド((1))及びkernelモジュールで定義されている組み込みメソッド((2))ですよね。 (初心者なのでこの理解にも間違いがあるかもしれませんがその場合はご指摘お願いします) このような考え方でいくとWIN32OLE.ole_methodsによって取得したメソッドの一覧は(1)にあたり、document.all.Item()というのは(2)にあたるのではないかという考えもできるかと思うのですが誰か正しい理解をご教授いただきたいです。 質問が長くなってしまいましたがie.document.all.Item()というメソッドがどこに定義されているのか、そういったメソッドの定義場所はCOMにおいてどのように見つけるのか、そこだけでもいいのでよろしくお願いします。

    • ベストアンサー
    • Ruby
  • インスタンスハンドルは何の役に立つものですか?

    C言語でWINDOWSのプログラムを作成したさい、WinMainの引数としてインスタンスハンドルが渡されます。 XPで作成したアプリケイションを複数同時に立ち上げると、インスタンスハンドルの値はすべて同じとなります。仮想メモリが導入される前のOSでは、異なる値になるようです。 仮想メモリを使う現在、インスタンスハンドルは何の役に立つのでしょうか。旧来からの書式を変えないためだけに存在するのでしょうか。

  • モードレスフォームが開かない

    モードレスフォームとモーダレスフォームを開く二つのメソッドを実装したActiveXDLLを作成しました。フォームはクラスモジュールのグローバル変数として定義し、DLLがロードされた際にフォームもNEWし、上記二つのメソッドでは単にshow(モーダル/モードレス)を指定している単純なDLLです。 そのDLLをCで作成したクライアントから使用した際に、モードレスウィンドウ表示メソッドは正しく動作してウィンドウも開くのですが、モーダレスウィンドウの場合は画面が開かず、またエラーメッセージも表示されないまま処理がCクライアント側に戻ってきます。 エラーメッセージが出ないので原因が特定できないのですが、対処方法でなくとも、調査するポイントやヒントを教えていただきたいと思っております。 よろしくお願いします。

  • ClientBase<TChannel> クラスの Dispose() メソッドについて

    お世話になっております。 http://oshiete1.goo.ne.jp/qa5572673.html に引き続き、 Dispose() メソッドの実装について不明な点があるので、よろしければご教示願います。 環境は、Visual C# 2008 Express Edition です。 .NET 3.5 まず、公開されているWebサービスに対して、 ソリューションエクスプローラより、サービス参照の追加で、Clientクラスを自動生成いたしました。 その自動生成されたクラス(仮に XSoapClient)が、System.ServiceModel.ClientBase<TChannel> クラスを継承しています。 ClientBase クラスは、IDisposable インタフェースを実装しているのですが、XSoapClient にも ClientBase にも、Dispose() メソッドの実装が見当たりません。 (自動生成のため、別の場所に作成されているのかもしれません。) using (XSoapClient client = new XSoapClient()) {  // ここにコード } とした場合に、client の Dispose() の実装がわからないため、 しっかりとコネクションが切れているのかが不明です。 Dispose() メソッド内では、Close() メソッドが呼ばれているのが普通なのでしょうか。 以上、よろしくお願いいたします。

  • VC++のDLLをVB6.0からVB.NETへ移行する方法

    はじめて投稿します。 今、現状VB6.0のプログラムで使用しているVC++のDLLを VB.NETで使用できるように、VB.NETのソースの改修をしています。 (開発環境は、VisualStudio.NET 2003) たいていのDLLは、DllImportを行うことで VB.NETから使用できることを確認しました。 /*--(例)------------------------------------------*/ Imports System.Runtime.InteropServices <DllImport("DLLTest.dll")> _ Private Shared Function DLLTestMethod() As Integer End Function /*------------------------------------------------*/ しかし、苦戦しているDLLファイルがあって、 そのソースを見ると、COMで実装されているようで、 コンパイルしたらタイプライブラリファイルが作成されています。 またDLLのレジストリも登録されているようです。 VB6.0でどう使われているか確認したところ、 そのDLLの参照設定をしていて、 "Public obj As New クラス名"でクラス宣言した後、 obj.関数名()で処理を行っています。 VB.NETでいろいろ試行錯誤してみましたが 参照設定はできるものの、その後で手詰まりになっています。 (参照設定しても、灰色になっているクラス名が存在するので 正しく設定できているかも怪しい状態) (1)----------------------------------------------- 参照設定後、オブジェクトブラウザから見えるクラスをNewして そのメンバ関数を使用する方法 -------------------------------------------------- (結果) レジストリ登録をしていないと 「CLSID{・・・}のCOMオブジェクトが有効でない」云々というエラーに。 それを受けて手動で該当するDLLのレジストリ登録を行った後だと 「オブジェクト参照がオブジェクトインスタンスに設定されません」というエラー。 (ということは、クラス生成に失敗している?) (2)----------------------------------------------- 上記のようにDllImportで実装する方法 (ちなみにそのDLLがエクスポートしている関数は DllCanUnloadNow, DllGetClassObject, DllRegisterServer, DllUnregisterServerの4つ) -------------------------------------------------- (結果) DllGetClassObject以外については関数を呼ぶことができている。 DllGetClassObjectは、引数設定に苦戦して今のところうまくいっていない状態。 (3)----------------------------------------------- インスタンス生成ができていないようなので どこかで調べて見つけてきたCoCreateInstance関数を使用する方法 -------------------------------------------------- (結果) これも引数に何を渡してよいかわからず試行錯誤中。 DLLの読み込みの時点でこけているかと予測して そのあたりが解決すればよいのかな・・・といろいろ試していますが WindowsプログラミングやCOMがよくわかっていないので 何が正解で何が間違っているのかさっぱりわからず、 周りに聞いても精通している人がいないためどうしようもなくなっています。 どんな些細な手がかりでもよいので 突破口になりそうなアドバイスがあれば教えてください。 よろしくお願いします。

  • VB.Netでexe間のアクセス方法

    VB.Netでexe間のアクセス方法を教えて下さい。 おそらく、ウィンドウハンドルを取得してから、 ハンドルを元に、exeにアクセスすると思うのですが、 ウィンドウハンドルの取得方法が分かりません。 または、そのexeのオブジェクトを作り、いつもの フォームみたいに、いろいろなプロパティ、メソッドの アクセスを試みたいのですが。 Shellでexeを実行する方法もお願いします。

  • VB2005でOCXを動的に呼び出すには?

    お世話になります。 当方の環境はWinXP SP2,VB2005Proです。 現在作成中のアプリで、とあるCOMコンポーネントを使っているのですが、 どうやら そのOCXが自由配布は出来ないようで、依頼元から 「OCXがインストールされている場合のみ、それを使用する機能を  生かしてほしい」 と言われました。 依頼元曰く「たぶんコンポーネントを参照設定せずにコーディング しないといけないと思う」との事なのですが、それは可能なのでしょうか? また、可能であれば、方法(または方針)を教えていただけると有難いです。 (もしかしてOCXと処理を完全に分離してDLL化しないとダメ?)

  • ノーツのウィンドゥハンドル取得方法

    ノーツのトップウィンドゥのハンドルを取得したいのですが上手くいきません。 Enumwindowを利用したのですが、なぜかノーツが取得できません。 NTのタスクマネージャのアプリケーション欄には表示されているので方法はあると思いますが分かりません。お知恵を拝借させて下さい。 私のやりたい事:VBより起動済みのノーツクライアントを前面に表示させたい。 タスクマネージャーの切り替えと同じ機能です。

  • イベントディスパッチングスレッドの振る舞いについて

    はじめまして。 質問があります。 例えばイベントキューに、イベントディスパッチングスレッドによって コンポーネントに文字列などをsetTextする処理を実装したrunメソッド をもつRunnableインターフェースを実装したのクラスのインスタンスを invokeLaterメソッドで複数個格納させ、イベントディスパッチングス レッドにイベントキューの1つ1つのイベントを処理させたとき、 各イベントの処理ごとにコンポーネントに文字列 が表示されると思っていたのですが、実際に動かしてみると、最後に格 納したイベントの表示だけが行われ、途中のイベントの表示が行われま せんでした。なぜなのでしょうか?ご教授お願いします。

    • ベストアンサー
    • Java