これは私を際限なく苛立たせています。RFID カードを読み取る OPOS プログラムがあります。2 つの C# COM ライブラリを作成しました。どちらも Windows 7 で問題なく動作します。そのうちの 1 つは作業を行うのがかなり困難でしたが、ようやく取得できました。COM ライブラリを OPOS プログラムで動作させるには、ターゲット プラットフォームが x86 であることを確認する必要がありました。私はwin7 proを持っていて、この同じプログラムをx86でWin XPを実行している他のコンピューターで実行しているので、仮想マシンを起動しました。これを機能させるために何百万ものことを試しましたが、役に立ちませんでした。私が試したこと
私の 1 つの C# ライブラリ (キーボード) では、最初は regasm を使用するだけでなく、そのライブラリを Service オブジェクトおよび実行可能ファイル (つまり、私の OPOS プログラム) としての場所に配置する必要がありました。レジストリの GUID には、基本的にライブラリの場所である CodeBase と呼ばれるキーがあります。同じキーを XP マシンに入れれば、ライブラリを両方の場所に置く必要はありません。それをテストし、それはうまくいきます。
そのため、別のライブラリが必要になりました。ほぼ同じ設定で C# (キーボードと同じ) で記述されています。ComSourceInterfaces(typeof(ITapEvents)
2 つの唯一の違いは、インターフェイスを継承し、 Log4Net を使用するネットワーク ライブラリ クラスです。Log4Net を使用したことがありません。しかし、それをコンパイルするには取得する必要があったため、すべてのライブラリを Program Files フォルダーにコピーしてコンパイルしました。私はインストーラーを実行しませんでした(存在するかどうかさえわかりません)が、私が言ったように。Win7で動作します。
XPではまったく動作しません。返される HResult は通常 0x80040154 です。何が起こっているのか手がかりはありますか?確認すべきことはありますか?
EDIT COMオブジェクトのインスタンス化を表示
BOOL hasit = FALSE;
try
{
CString str1;
CString str2;
str1.Format("%llu", sid); //send as decimal
str2.Format("%llX", uid);//send as hex
_bstr_t uidStr(str2);
_bstr_t sidStr(str1);
INetworkPtr obj = NULL;
HRESULT hRes = obj.CreateInstance(_uuidof(Network));
hasit = SUCCEEDED(hRes);
if (hasit)
{
CNetwork cti(obj);
cti.SendStrings(sidStr, uidStr);
cti.ReleaseDispatch();
}
else
{
LogWriter::WriteError(__FUNCTION__, "Error sending Strings", (int)hRes);
}
}
catch(...)
{
LogWriter::WriteError(__FUNCTION__, "Error sending Strings");
hasit = FALSE;
}
return hasit;