1

顧客がCOM経由でアクセスする古いC/C++.dllがあります。

古い.dllをi.NETで記述された新しい.dllに置き換えようとしました。

お客様はクライアントを再コンパイルできないため、古い.dllをCOMの登録解除/新規登録(zippy32 / regasmを使用)するだけで置き換えることができることが重要です。

古いものと同じCOMインターフェイスで.NET.dllを構築したと信じています。GUID、名前、dispidなどはすべて一致します。独自のC++テストアプリケーションを作成することでこれを確認しました。古い.dllの登録を解除したり、新しい.dllを登録したりしても、引き続き機能します。

問題は、顧客のクライアントが起動に失敗することです。

不思議なことに、古い.dllを登録したままにしておくと(たとえば、両方の.dllが登録されている場合)、機能します。お客様のアプリケーションが起動し、新しい.dllのメソッドを呼び出します。ただし、古い.dllの登録を解除するとすぐに、アプリケーションの再起動に失敗します。

新しい.dllを登録するさまざまな方法を試しました。/ codebaseオプション、/tblなどでregasmを使用します。

OLE / COMビューアーで調べると、新しい.dllと古い.dllの間にいくつかの小さな違いがあります。たとえば、タイプライブラリの「名前」が異なります。しかし、私たち自身のC ++テストクライアントはどちらかの.dllで動作するので、COMインターフェイスは十分に似ていると思いますか?

どうか、誰かアイデアがありますか?別のクライアントが失敗したときに、1つのC ++クライアントが新しい.dllをロードすることはどのように可能ですか?古い.dllを新しいものと並行して登録したままにすると、両方が機能するのはなぜですか?2つのC++クライアントの動作が異なる理由について何か説明はありますか?


更新:クライアントのエラーメッセージは次のとおりです。

「実行中に失敗しました:CLSIDFromProgID。[myDll].dllが登録されているかどうかを確認してください。」

よろしくPT

4

1 に答える 1

1

多くの可能性があります。まず、新しいDLLのタイプライブラリを登録していることを確認します。古いものはDllRegisterServerの一部としてそれを行っているかもしれませんが、AFAIK、.NetDLLはそうではありません。REGTLB.exeに登録してください。

また、スレッドモデルが両方のDLLで同じであることを確認してください。

どちらも役に立たない場合は、OLEVIEWが同一であると言うまで続けることをお勧めします。クライアントが何をしているのか、自分とは異なるのかはわかりません。

于 2012-05-10T19:01:00.290 に答える