0

これは私を際限なく苛立たせています。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;
4

0 に答える 0