• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 怎样用ATLCOM撰写serviceobject

怎样用ATLCOM撰写serviceobject

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了atlcom.h,service object,service object pair,objectservicefactory,object group service等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 怎样用ATL COM撰写 service object
描述:

最近接到一个任务
开发POS系统打印机的OPOS driver,用ATL COM撰写 service object
搞得头都大了,查了很多资料,知道了大致的流程。
CO组件是通用的,有现成的可以下。SO就要自已写了。
于是用VC写了一个ATL 的DLL(第一次写,什么都不懂),编译完成注册,先在VB中试一下,工程引用新建的ATL COM 库,在代码中可以new出来并调用相应的方法。但是通过OCX就不行了,未提供所需的方法。
资料介绍:
  应用程序调用 CO 的 open(deviceName)方法
  CO 通过RegQueryValueEx 读注册表,得到SO的ProgID, 再用CLSIDFromProgID 得到SO的 CLSID, 再
CoCreateInstance 和 QueryInterface 得到SO的接口, 通过GetIDsOfNames,Invoke调用SO接口中的函数
OpenService(deviceClass,deviceName,pDispatch)打开设备。所有这些,都是现成的,不用做,我要做的只是一个SO
但问题来了,这个SO我是不是需要重写QueryInterface,GetIDsOfName和Invoke函数?要怎么写?还是根本不需要,IDE自动完成了?希望哪位大侠能拉小弟一把。
资料上写OCX固定在注册表项
[ HKEY_LOCAL_MACHINE\SOFTWARE\OLEforRetail\ServiceOPOS\POSPrinter ]
"Unit1"="MyPrinter"
[ HKEY_LOCAL_MACHINE\SOFTWARE\OLEforRetail\ServiceOPOS\POSPrinter\MyPrinter ]
@="XXXX.POSPrinter.1"
找到unit1对应的SO
我手工建好这些项了,"XXXX.POSPrinter.1"是ATL DLL注册后的ProID
但那个OCX就是报找不到,肯定是SO写的不好,但不知道问题出在哪里,好郁闷哦。
// SoCitaqPtr.idl : IDL source for SoCitaqPtr.dll
//
// This file will be processed by the MIDL tool to
// produce the type library (SoCitaqPtr.tlb) and marshalling code.
import "oaidl.idl";
import "ocidl.idl";
        [
                object,
                uuid(2BF8F234-1C69-451B-B70F-83237FDE7E29),
                dual,
                helpstring("Iposprinter Interface"),
                pointer_default(unique)
        ]
        interface Iposprinter : IDispatch
        {
                [id(1), helpstring("method OpenService")] HRESULT OpenService([in] BSTR DeviceClass, [in] BSTR DeviceName, [in] IDispatch*  pDispatch,[out,retval] long* pRC);
[id(2), helpstring("method GetOpenResult")] HRESULT GetOpenResult([out,retval] long* pRC);
        };
[
        uuid(641254CF-5ACA-4ECA-BCFF-327F69F3A13A),
        version(1.0),
        helpstring("SoCitaqPtr 1.0 Type Library")
]
library SOCITAQPTRLib
{
        importlib("stdole32.tlb");
        importlib("stdole2.tlb");
        [
                uuid(D4CB9470-7E8C-442D-8465-72B377BA865F),
                helpstring("posprinter Class")
        ]
        coclass posprinter
        {
                [default] interface Iposprinter;
        };
};
// posprinter.h : Declaration of the Cposprinter
#ifndef __POSPRINTER_H_
#define __POSPRINTER_H_
#include "resource.h"       // main symbols
/////////////////////////////////////////////////////////////////////////////
// Cposprinter
class ATL_NO_VTABLE Cposprinter : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<Cposprinter, &CLSID_posprinter>,
public IDispatchImpl<Iposprinter, &IID_Iposprinter, &LIBID_SOCITAQPTRLib>
{
public:
Cposprinter()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_POSPRINTER)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(Cposprinter)
COM_INTERFACE_ENTRY(Iposprinter)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
// Iposprinter
public:
STDMETHOD(OpenService)(/*[in]*/ BSTR DeviceClass, /*[in]*/ BSTR DeviceName, /*[in]*/ IDispatch*  pDispatch,/*[out,retval]*/ long* pRC);
STDMETHOD(GetOpenResult)(/*[out,retval]*/ long* pRC);
};
#endif //__POSPRINTER_H_


解决方案1:

打印的程序网上有现成的
可以参考《atl开发指南》
有电子版的 
还可以到codeproject上 http://www.codeproject.com/KB/atl/SimpleATLCom.aspx
照着做一遍就会了

解决方案2:

这个打印机厂家会提供的,不需要自己写

解决方案3:

ATL不是简单易用的东西,它设计给懂COM的人用的,强调的是性能。
如果想很快上手,建议用MFC。第一次写COM的话自己手动编写COM+nt service可能还要来得快些。
而后再用ATL才会发现它的妙味。

解决方案4:

这只是一个普通的com组件,如果要实现ocx,还要实现其它的接口。

解决方案5:

QueryInterface,GetIDsOfName和Invoke这些都不用写。
你可以按atl/com appwizard创建一个简单工程看看先,熟悉后再把已经有的代码加进来。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 为什么用向导生成的ATLCOM工程(dll)没有dlldatac文件
  • ATLCOM中能够用继承自CWnd的MFC类吗
  • ATLCOM事件,如何实现多个连接点的问题?
  • 如何在MFC程序中实现ATLCOM接口,并支持事件?
  • ATLCOM另我郁闷
  • 为什么我的ATLCOM控件中的输入框不能响应回车键?盼解答
  • 为什么我的ATLCOM控件中的输入框不能响应回车键?盼解答
  • 怎么样得到ATLCOM的DLL的路径????
  • 大家来说说ATLCOM、ActiveX、DLL三者有什么区别和联系?
  • ATLcom初学者求教关于VC编译错误

相关文章

  • 2017-06-05 请教c++/com高手:在多线程调用IDispatch::invoke会报错误问题,请告诉原因!!
  • 2017-06-04 给分贴,再请xmzzy进来拿分
  • 2017-06-05 询问使用过installshield的??
  • 2017-06-05 急!急!急!Dll编译错误。。。。。高人指教
  • 2017-06-04 拿到一个控件,除了在设计界面上添加以外,可否用代码让其显示在对话框上?(只有10分了。)
  • 2017-06-04 CreateinstanceEx函数需要什么头文件
  • 2017-06-04 高分请教一个简单问题:关于基于第3方ocx控件的开发问题
  • 2017-06-04 急!使用MicrosoftCommunicationsControl后程序编译链接通过,但是无法执行!为什么?
  • 2017-06-05 这个警告信息怎么消除?
  • 2017-06-05 请教CRichEditCtrl修改字间距问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请教:我编了个程序,为什么ULONG这个类型不能识别出来????急呀1!
    • ATLActiveX控件事件
    • 多线程服务程序用createthread怎么运行一个多小时怎么出错了?
    • API怎样实现串口全双工?
    • 多线程WaitForMultipleObjects一问
    • 在atl控件加载自制的控件
    • 如何在atl工程中创建浏览器
    • 抓狂!JS响应COM事件的问题
    • AfxBeginThread&thread,0;与AfxBeginThreadthread,0;有什么区别??
    • 各位达人帮帮忙!

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有