【发布时间】:2011-09-29 19:45:40
【问题描述】:
这里的入门级程序员试图实现一个 COM 接口。我正在开发一个与 Aloha 销售点系统交互的程序。 Aloha 使用 COM 来处理外部程序。我正在尝试从 mag 读卡器截取卡数据,它是 OPOS 读卡器,而不是键盘楔。我的文档没有解释如何实现这个特定的接口,但它确实解释了如何实现一个类似的接口。我试图遵循这个例子,但我没有得到任何地方。不存在 Aloha 的支持,他们的文档很差、过时,有时甚至是错误的,即使我已经支付了许可证费用。
我尝试制作一个简单的应用程序来测试此功能。这是我所做的:
1) 使用 ATL COM 应用程序向导在 vc++ 6.0 中创建一个新项目 2)服务器类型dll 3) 插入新的 atl 对象 -> 简单对象 4)右键单击我的新类并选择实现接口 5) 浏览类型库,选择 Iber.tlb (Aloha's 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_pIInterceptMagcard 是指向我使用上述向导创建的接口类的指针。
当我尝试注册时,我得到以下 HRESULT:0x80040112 那就是“未经许可使用的类”。
这是否意味着我的程序没有创建必要的注册表项?
【问题讨论】:
-
这并不能解释您的问题,但是:g_pIInterceptMagcard 变量不应该是指向您的接口类的指针,因为CoCreateInstance 将用指向实现 CLSID_AlohaMag 的类的指针覆盖它。
-
@Frank:不太清楚你的意思。返回时,g_pIInterceptMagcard 将指向 AlohaMag 对象的 IAlohaMag 接口。我认为您的术语“接口类”并不明确,因为接口与实现的分离在 COM 中至关重要。 (没有“接口类”之类的东西。)返回的指针指向一个对象,而不是一个类。 (在 COM 或 C++ 中没有指向类的指针。)
-
@ciaran:OP 说“其中 g_pIInterceptMagcard 是指向我使用上面的向导创建的接口类的指针”。我认为这意味着像
g_pIInterceptMagcard = new MyInterceptMagcard()这样的东西是在 CoCreateInstance 调用之前执行的。我想指出的是,在调用 CoCreateInstance 之前分配 g_pIInterceptMagcard 的任何尝试都是浪费努力,因为 CoCreateInstance 用指向所请求接口的指针覆盖了最后一个参数(即 g_pIInterceptMagcard )的内容。 -
@Frank:啊,是的,我没有发现这是 Bob 的任期,而不是你的。对不起。
-
@Bob 更明确地说,如果您将
g_pIInterceptMagcard设置为 NULL,您应该会发现 CoCreateInstance still 返回错误。您的测试用例失败可能与您的 IInterceptMagcard 实现无关,您只是无法创建 CLSID_AlohaMag 类的实例。
标签: c++ visual-c++ com atl