0

メッセージと遅延をパラメーターとして受け取るメソッドを持つ.NetCOMサーバーがあります。遅延後、メッセージをクライアントに送り返すイベントを発生させます。

.NetおよびVB6クライアントで動作します。

FoxProでCOMイベントをバインドするには、次のように、foxproでイベントインターフェイスを実装するクラスを作成して接続する必要があります。http: //www.west-wind.com/presentations/dotnetfromVfp/ DotNetFromVfp_EventHandling.asp

私はそのようなクラスを持っています:

DEFINE CLASS ComEventHandler AS session OLEPUBLIC
  IMPLEMENTS IComServerEvents IN "PcaTest.ComServer"
  * "C:\ComTest\PCATest.tlb"

  PROCEDURE IComServerEvents_TimerExpired(message AS STRING) AS VOID
  * add user code here
  ?message
  ENDPROC
ENDDEFINE

そしてこれを配線するためのコード:

loMM = CREATEOBJECT("PcaTest.ComServer")
loEvents = CREATEOBJECT("ComEventHandler")

EventHandler(lomm, loevents)

このコードを実行すると、タイプライブラリPcaTest.ComServerが見つかりません。ただし、実装行を次のように変更すると、期待どおりに機能します。

IMPLEMENTS IComServerEvents IN "C:\ComTest\PCATest.tlb"

tlbの場所をハードコーディングできません。

「CREATEOBJECT( "PcaTest.ComServer")」という行は実際には正常に機能します。ComEventHandlerオブジェクトをインスタンス化しようとしない場合、そのCOMオブジェクトがインスタンス化され、そのメソッドを呼び出してそのプロパティにアクセスできます。イベントハンドラークラスは、(ほとんど).tlbをフィードし、progIdをフィードしない場合にのみ機能します。

.NetCOMサーバーはGACに登録されています。/ codebaseを使用した場合と使用しない場合、および/ tlbまたは/tlb:filename.tlbを使用した場合と使用しない場合で、レガスムを試しました。

私はある時点でこれをテストで機能させていたので、そう思われました。現在、これらの結果を複製することはできませんが、機能させたときは/codebaseと/tlb:filename.tlbを使用していました。

4

2 に答える 2

0

場所をハードコーディングできないとのことですが、テーブルに入れてテーブルから選択し、次のようなものを使用できるかどうか疑問に思いました。

tlbLocation(パスを含むフィールド)

IComServerEvents IN(tlbLocation)を実装します

一部のアプリで同様のパス指定を行います

于 2012-05-12T03:49:02.570 に答える
0

私は自分の質問に答えるのが嫌いです。また。しかし、私はそれを手に入れました。

回答:アセンブリがGACに登録されているときにregasm / codebaseを使用すると、機能しなくなります。私の問題は、アセンブリをGACにインストールする前にレガスムを実行した場合は機能しますが、アセンブリが最初にGACに登録された場合、またはアセンブリがGACに登録され、後でレガスムが呼び出された場合、FoxProは混乱している。

FoxProで.NetCOMサーバーのイベントを使用するには、次のものが絶対に必要です。

  • おそらくregasmによってCOM(progIdおよびClsId)に登録されたアセンブリ
  • レジストリに次のようなものを追加するregasmの/codebaseフラグ:

    [HKEY_CLASSES_ROOT\CLSID\{A2DA47BD-15E8-48E3-BA54-4B1CED2D3C01}\InprocServer32]
    @="mscoree.dll"
    "CodeBase"="file:///C:/MACsWave/PCATest/pcatest.dll"
    

    アセンブリはGACからアクセス可能である必要がありますが、コードベースが必要です。たとえば、VB6クライアントには/codebaseは必要ありません。

  • typelibを登録するための/tlbフラグ。/ tlb:"ファイル名"は必要ありません。

/ codebaseフラグが使用されるため、GACにアセンブリを登録する必要はありません。

アセンブリをGACに追加し、続いてregasm / codebaseを呼び出すと、レジストリで次のようになります。

[HKEY_CLASSES_ROOT\CLSID\{A2DA47BD-15E8-48E3-BA54-4B1CED2D3C01}\InprocServer32]
@="mscoree.dll"
"CodeBase"="file:///C:/WINDOWS/assembly/GAC_32/PCATest/1.1.0.0__325ac2fec08eafa8/PCATest.dll"

FoxProがdllと同じディレクトリでtlbファイルを探しているのではないかと思いますが、GACに.tlbがないことがわかります。か何か...

いずれにせよ、問題は解決しました。

于 2012-05-14T14:36:50.193 に答える