現在開発中の .net アプリケーション (VS 2010、c#) で PCAnywhere の Ole オートメーションを使用しようとしています。PCA 12.5 にはいくつかの tlb ファイルが付属しており、VS を介して参照として追加しようとすると、両方で「'E:\Dev\PcaOle\awrem32.tlb への参照' を追加できませんでした」というエラーが表示されます。ファイルにアクセスできること、およびそれが有効なアセンブリまたは COM コンポーネントであることを確認してください。わかった。ここに私がこれまでに持っているコードのビットがあります:
Thread pcat = new Thread(delegate()
{
CRemoteDataManagerClass mng = new CRemoteDataManagerClass();
RemoteDataExClass data = null;
data = (RemoteDataExClass)mng.RetrieveObjectEx("temp.chf", (short)2, null);
if (data == null)
data = (RemoteDataExClass)mng.CreateObjectEx("temp.chf");
data.ConnectionType = "TCP/IP";
data.PhoneNumber = host.IP;
data.AutoLoginName = host.Nombre.StartsWith("WS") ? "usrwksvc" : "admonadn";
data.AutoDomain = "dom" + actual.numec.PadLeft(4, '0');
data.WriteProtection = false;
data.WriteObject(null);
AWREM32.Document doc = new AWREM32.Document();
});
pcat.SetApartmentState(ApartmentState.STA);
pcat.Start();
pcat.Join();
CRemoteDataManagerClass、RemoteDataExClass、および AWREM32.Document は、アセンブリ内のクラスです。
data = (RemoteDataExClass)mng.RetrieveObjectEx("temp.chf", (short)2, null);
そのため、5 行目 ( ) で次のような例外が発生します。
タイプ「winawsvr.CRemoteDataManagerClass」の COM オブジェクトをインターフェイス タイプ「winawsvr.IRemoteDataManager」にキャストできません。IID '{82A1A806-8BA9-11CF-B95F-00A02412C812}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが次のエラーのために失敗したため、この操作は失敗しました: Interfaz 互換性がありません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。
ここで何が欠けているのでしょうか? COM コンポーネントの登録方法に問題があるのでしょうか。以前は、regasm.exe に登録しようとする前に、CLSID だけが LocalServer32 キーを持っていました。regasm.exe を実行した後、InprocHandler32 と InprocServer32 の 2 つが作成されたと思います。前後に同じ例外が発生しました。
STA アパートメント状態に設定されたスレッド内で呼び出しコードを実行する必要があることをどこかで読みました。だから私はしました。まだ変化なし。
私が気付いたもう 1 つのことは、失敗したクラスが配置されている相互運用アセンブリに対して ildasm.exe を実行したときに、IRemoteDataManager 内に次の行が表示されることです.custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 38 32 41 31 41 38 30 36 2D 38 42 41 39 // ..$82A1A806-8BA9 ...
。TLB を使用する IRemoteDataManager には82A1A806-8BA9-11CF-B95F-00A02412C812
、例外に記載されている GUID と同じ GUID があります。この GUID の最初の 2 つのセクションは、ildasm から言及したその行にあります (残りは表示の問題のために切り取られているだけだと思います)。そこでもすべて問題ないようです。
CRemoteDataManagerClass の代わりに CRemoteDataManager (IRemoteDataManager を実装するインターフェイス) を使用してみましたが、同じです。どちらの場合も、例外は常に CRemoteDataManagerClass に言及しています。ildasm で確認できることから、CRemoteDataManagerClass は CRemoteDataManager と IRemoteDataManager の両方を実装しています。QueryInterface が 2 つのうちの 1 つ、またはまったく別の何かで失敗している可能性があります。
知らない。私は明らかにここのいたるところにいます。
相互運用ログも調べて、正確に QueryInterface が失敗した理由を確認しましたが、.netcompactframework でそれを行う方法に関するドキュメントしか見つかりませんでした。