令我感到沮丧的是,我没有尽头。我有一个读取RFID卡的OPOS程序。我写了2个C#COM库。两者都可以在Windows 7中正常运行。其中一个很难开始工作,但我终于明白了。为了让我的COM库与OPOS程序一起工作,我必须确保目标平台是x86。由于我有win7 pro和我这个相同的程序在x86的其他计算机上运行并运行Win XP我启动了我的虚拟机。我已经尝试了一百万件事来试图让它发挥作用而无济于事。我尝试过的事情
我的一个C#库(键盘)起初要求不仅我使用regasm而且我必须在该位置将该库作为Service对象和可执行文件(即我的OPOS程序)我在Win7中发现如果我在注册表中搜索GUID有一个名为CodeBase的键,它基本上是库的位置。如果我将相同的密钥放入我的XP机器,我不必在两个位置都有这个库。经过测试,效果很好。
因此需要另一个库。它用C#编写(与键盘相同),几乎完全相同。两者之间的唯一区别是继承接口的网络库类具有ComSourceInterfaces(typeof(ITapEvents)
并且使用Log4Net。我从未使用过Log4Net。但是为了让它编译我必须得到它,所以我只是将所有库复制到我的Program Files文件夹并进行编译。我没有运行安装程序(甚至不知道是否存在),但就像我说的那样。它适用于Win7。
我无法让它在XP中全部工作。我回来的HResult通常是0x80040154。有什么线索是怎么回事?我应该检查一下吗?
修改 显示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;