C++ 实现COM接口C++;/VC++;6.0/MFC

C++ 实现COM接口C++;/VC++;6.0/MFC,c++,visual-c++,com,atl,C++,Visual C++,Com,Atl,这里的入门级程序员正在尝试实现COM接口。我正在开发一个与Aloha销售点系统接口的程序。Aloha使用COM与外部程序一起工作。我试图截取来自mag读卡器的卡数据,它是OPOS读卡器,而不是键盘楔块。我的文档没有解释如何实现这个特定的接口,但它确实解释了如何实现一个类似的接口。我已经试着效仿这个例子,但我还是一无所获。来自Aloha的支持是不存在的,他们的文档很差,过时,有时甚至是错误的,尽管我已经支付了许可证的费用 我试着制作一个简单的应用程序来测试这个功能。以下是我所做的: 1) 使用AT

这里的入门级程序员正在尝试实现COM接口。我正在开发一个与Aloha销售点系统接口的程序。Aloha使用COM与外部程序一起工作。我试图截取来自mag读卡器的卡数据,它是OPOS读卡器,而不是键盘楔块。我的文档没有解释如何实现这个特定的接口,但它确实解释了如何实现一个类似的接口。我已经试着效仿这个例子,但我还是一无所获。来自Aloha的支持是不存在的,他们的文档很差,过时,有时甚至是错误的,尽管我已经支付了许可证的费用

我试着制作一个简单的应用程序来测试这个功能。以下是我所做的:

1) 使用ATL COM应用程序向导在vc++6.0中创建新项目 2) 服务器类型dll 3) 插入新的atl对象->简单对象 4) 右键单击我的新类并选择ImplementInterface 5) 浏览类型库,选择Iber.tlb(Aloha的tlb) 6) 选择了我想要实现的接口

这将生成一个.h、.cpp和.rgs文件

.h文件具有:

public:
// IInterceptMagcard
    STDMETHOD(InterceptMagcard)(BSTR bstrAccountNumber, BSTR bstrCustomerName, BSTR bstrExpirationDate, BSTR bstrTrack1Info, BSTR bstrTrack2Info, BSTR bstrTrack3Info, BSTR bstrRawMagcardData, LONG * bWasDataHandled)
    {
        if (bWasDataHandled == NULL)
            return E_POINTER;

        return E_NOTIMPL;
    }
这就是我实现代码的地方吗?我在里面放了一些测试代码,写进一个txt文件来测试它。然后我使用:

HRESULT hr = CoCreateInstance(CLSID_AlohaMag, NULL, CLSCTX_INPROC_SERVER,
                                IID_IAlohaMag, (void **) &g_pIInterceptMagcard);
其中,g_-magcard是指向使用上述向导创建的接口类的指针

当我尝试注册时,我得到以下HRESULT:0x80040112 这是“未授权使用的类”


这是否意味着我的程序没有创建必要的注册表项?

这可能意味着在自定义类工厂创建类实例之前,您必须安装许可证。您是否尝试过在完全工作的POS系统上运行您的程序,并使用许可使用的磁卡刷卡?也许你需要其他许可证来做这类事情


如果是类未注册的问题,则结果将是“类未注册”。听起来您已经通过向导执行了必要的步骤来实现接口,并让它生成正确的注册表项。

这并不能解释您的问题,但是:g_-magcard变量不应该是指向接口类的指针,因为它将用指向实现类的指针覆盖它克莱希德·阿罗哈马。@弗兰克:不太清楚你的意思。返回时,g_磁卡将指向AlohaMag对象的IAlohaMag接口。我认为您的术语“接口类”并不清楚,因为接口与实现的分离在COM中是至关重要的。(没有“接口类”这样的东西)并且返回的指针指向一个对象,而不是一个类。(没有任何东西可以指向COM或C++中的一个类)。@ CiARAN:OP说:“GyPixTeTMGoCARD是指向上面向导创建的接口类的指针”。我认为这意味着在CoCreateInstance调用之前执行了类似于
g_pIInterceptMagcard=new MyInterceptMagcard()
的操作。我想指出的是,在调用CoCreateInstance之前分配g_pIInterceptMagcard的任何尝试都是徒劳的,因为CoCreateInstance用指向请求接口的指针覆盖了最后一个参数(即g_pIInterceptMagcard)的内容。@Frank:是的,我没有发现这是Bob的术语,不是你的。抱歉。@Bob更明确地说,如果您将磁卡设置为空,您应该会发现CoCreateInstance仍然返回错误。您的测试用例失败可能与IIInterceptMacard的实现无关—您只是在创建CLSID_AlohaMag类的实例时遇到了问题。同意。我对许可控件不是很熟悉,但您可能需要用对CoGetClassObject(IClassFactory2)和IClassFactory2::CreateInstanceLic的显式调用替换CoCreateInstance。通常,您不需要这些。如果每个对象都需要一些描述如何创建对象实例的附加文档,那么COM就不能很好地工作。类工厂是通过对象的定义创建的,这通常是许可证强制的地方。CoCreateInstance是一个包装函数,它代表您调用CoGetClassObject、IClassFactory::CreateInstance和IUnknown::QueryInterface。但是IClassFactory不支持许可-为此,您需要IClassFactory2。但是为了增加混合,Aloha的作者可能使用了他自己的自定义授权方案,与标准ActiveX授权无关。当你们说授权时,是在COM的上下文中,还是说授权就像我需要运行Windows的许可一样?如果是后者,这是否意味着我正在测试的POS系统必须拥有Aloha的许可证?是的,这是一个许可证问题。我的文件已经过时了。为了使用该类,我必须使用IClassFactory2并提供许可证字符串。