2012-05-11 5 views
0

メッセージと遅延をパラメータとして受け取るメソッドを持つ.Net COMサーバーがあります。遅延後、メッセージをクライアントに送り返すイベントを発生させます。FoxProクライアントから.Net COMサーバーを消費するときにタイプライブラリが見つかりません。

.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を取得見つかりません。私はハードコードTLBの場所することはできません

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

:予想通り、私はに実装ラインを変更した場合しかし、それは動作します。

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

.Net COMサーバーは、GACに登録されています。私は/コードベースの有無にかかわらず、/ tlbまたは/ tlb:ファイル名.tlbを付けて/なしで試しました

私はこれを一点でテストしていました。私はそれらの結果を今複製することはできませんが、私はそれが働いていたときに/ codebaseと/tlb:filename.tlbを使用しました。

答えて

0

と同様のパス指定は、私は自分の質問に答えることを嫌いIComServerEventsを実装しています。再び。しかし、私はそれを得た。

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

a。FoxProでネットCOMサーバーのイベント絶対に必要です:COM(PROGIDとCLSID)に登録さ

  • アセンブリを、おそらくレジストリにこのようなものを追加します。regasmにします。regasm
  • /コードベースフラグによって:

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

    アセンブリがGACからアクセスできる必要がある場合でも、コードベースが必要です。 VB6クライアントでは/ codebaseは不要です。例えば、

  • /tlb typelibを登録するフラグです。/tlb: "filename"は不要です。

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

あなたはGACにアセンブリを追加し、その後ます。regasm /コードベースを呼び出した場合は、レジストリでこれを取得する:

[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が同じディレクトリにあるTLBファイルを探しているかどうかを疑問に思いますdllは見つかりませんが、GACに.tlbはありません。または何か...

いずれにしても、問題は解決しました。

0

は、あなたは、テーブルにそれを置くテーブルからそれを選択し、パスが含まれています。この

tlbLocation(フィールドのようなものを使うことができれば、あなたは、ハードコードの場所、私が思っていたことができないことに言及します)

は(tlbLocation)

で、私は自分のアプリケーションのいくつかの

+0

私はFoxPro n00bです。私はImplementsラインがfxpにコンパイルされ、実行時に解釈されないと仮定していました。パスを調べなければならない場合は、レジストリをチェックしてマシンごとに異なる可能性があります。 (プログラムファイルとプログラムファイル(x86)) しかし、私はそれをやりたいとは思っていませんでした。なぜなら、少なくとも2回は正常に動作していたからです。 –

関連する問題