大家不要笑我了,我不喜欢用那个人家写的串口类。

所以导出了MSCOMM32.OCX的类,然后在此基础上写了一个串口打印机的小工具类。

—————————————声明———————————————

本文原创,转载请保持文章的完整性(包括本声明),并显要的注明作者以及出处。

本文链接:http://blog.csdn.net/wlsgzl/article/details/41350357

===================================================

CPrinterGP3120TN m_Printer;
BOOL bRes;
bRes=m_Printer.Create(NULL,0,CRect(0,0,1,1),this,IDC_MSCOMM_PRINTER);
if (bRes==FALSE)
{
AfxMessageBox(TEXT("创建打印机控件失败,请退出重试。"),MB_OK|MB_ICONERROR);
ExitProcess(-1);
}

一切都是好好的,在具有VC2010开发环境中。

======http://blog.csdn.net/wlsgzl/article/details/41350357======

当我在测试机环境上运行时,发现无法创建控件,创建控件失败。

于是在if中添加了输出,发现返回0。

===================================================

进入开发环境,跟踪变量发现Create是成功的。

所以很难理解这到底是为什么。

-----------------------------------------------------------------------------------------

抱着试试看的态度,做了下列的更改:

添加了这个

void CXXXDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_MSCOMM_PRINTER, m_Printer);//<---This line.
}

删掉了这些

//BOOL bRes;
//bRes=m_Printer.Create(NULL,0,CRect(0,0,1,1),this,IDC_MSCOMM_PRINTER);
//if (bRes==FALSE)
//{
// AfxMessageBox(TEXT("创建打印机控件失败,请退出重试。"),MB_OK|MB_ICONERROR);
// ExitProcess(-1);
//}

这相当于通过向导工具添加了一个控件变量。

——————————————————————————————

终于客户机运行成功。

那么问题来了,是什么导致了先前的测试环境的失败?

20141123:

原来是许可的问题,解决方法见http://support.microsoft.com/kb/315501/zh-cn

下面是部分内容的截取:

本文介绍如何在 Microsoft Visual C++ MFC 程序中为 MsComm32 控件提供运行时许可证数据。Visual C++ 附带的自定义控件 MsComm32.ocx 是经过授权的控件。在安装 Visual Studio 6.0 时,在安装该控件的同时会安装一个设计时许可证。对于非开发人员的计算机,则需要运行时许可证。

要求

下表列出了推荐使用的硬件、软件、网络基础结构以及所需的 Service Pack:

  • Visual C++ 6.0

本文假定您熟悉下列主题:

  • Windows 的 C++ 编程经验

获取 MsComm32.ocx 的许可证密钥

  1. 从 Microsoft 下载中心获取 Licreqst.exe 文件。要下载此文件,请访问以下 Microsoft 网站:

  2. 双击自解压缩文件“Licreqst.exe”。
  3. 程序会提示您指定要将文件解压缩到的文件夹。请指定 Licreqst.exe 所在文件夹以外的另一个文件夹,因为在解压缩的文件中,也有一个名为 Licreqst.exe 的文件。单击“Unzip”。
  4. 运行解压缩的 Licreqst.exe 文件。许可证密钥请求程序即会启动。在“Registered Controls”框中,单击“MSCOMMLib.MSComm.1”。“License Key Data for Currently Selected Control”框会以 C/C++ 数组声明形式显示许可证密钥数据:

    /*
    Copyright (c) 1994
    */
    WCHAR pwchLicenseKey[] =
    {
    0x0043, 0x006F, 0x0070, 0x0079, 0x0072, 0x0069,
    0x0067, 0x0068, 0x0074, 0x0020, 0x0028, 0x0063,
    0x0029, 0x0020, 0x0031, 0x0039, 0x0039, 0x0034,
    0x0020
    };
  5. 单击“Copy Data to Clipboard”,将此文本复制到剪贴板上以供稍后在 C/C++ 程序中使用。

在 Visual C++ MFC 程序中使用许可证密钥

本节介绍如何生成一个可以在 MFC 程序中使用运行时许可证信息创建 MsComm32 控件实例的简单程序。

  1. 启动 Visual C++,然后创建一个名为 CommDemo 的新 MFC AppWizard (EXE) 项目。
  2. MFC AppWizard 向导即会启动。在步骤 1 中,用户界面类型必须为“单文档”。单击“完成”以接受此类型程序的所有默认值。
  3. 在“项目”菜单上,单击“添加到项目”。单击“组件和控件”以显示“组件和控件库”对话框。
  4. 单击“已注册的 ActiveX 控件”,然后单击“Microsoft Communications Control 6.0”。单击“插入”,然后确认要将该组件添加到项目。确认生成的 CMSComm 类名。单击“确定”,然后单击“关闭”以关闭库。
  5. 编辑 MainFrm.cpp 文件:
    1. 将以下包含文件添加到 MainFrm.h 的现有 #include 行后:

      #include "CMSComm.h"
      						
    2. 添加您先前使用许可证密钥请求程序工具放置在剪贴板上的 pwchLicenseKey[] 声明:

      /*
      Copyright (c) 1994
      */ WCHAR pwchLicenseKey[] =
      {
      0x0043, 0x006F, 0x0070, 0x0079, 0x0072, 0x0069,
      0x0067, 0x0068, 0x0074, 0x0020, 0x0028, 0x0063,
      0x0029, 0x0020, 0x0031, 0x0039, 0x0039, 0x0034,
      0x0020
      };
  6. 将以下代码添加到“CMainFrame::OnCreate”方法末尾的最后一个 return 语句之前。此代码将使用 pwchLicenseKey 中的运行时许可证数据创建“CMSComm”类的一个实例。本示例只是进行测试以确定是否可以创建,然后显示一条诊断消息。

    // Create the license string
    BSTR bStrLicense = ::SysAllocStringLen(pwchLicenseKey,
    sizeof(pwchLicenseKey)/sizeof(WCHAR)); // Create the CMSComm object with run-time license data
    CMSComm * pComm = new CMSComm;
    pComm->Create(NULL, WS_VISIBLE, CRect(0,0,0,0),
    this, 999, NULL, FALSE, bStrLicense); // Release the memory for license string
    ::SysFreeString(bStrLicense); // Display a success or failure message to the user
    ::MessageBox(NULL,
    (pComm->m_hWnd ? "Created OK" : "Not created"),
    "Debug", MB_OK);

验证

在开发环境中运行该程序。程序会显示一个包含“Created OK”文本的消息框。该程序在已安装 MsComm32.ocx 但不具有开发许可证的计算机上也可以正常运行。

其他信息

不要使用此技术来侵犯软件许可证。但可以对 MsComm32.ocx 使用此技术。对于已获得合法授权进行分发的控件,您需要有供应商提供的许可证密钥。



请注意,在已授权的计算机上运行 LicReqst 示例来获取某个对象的许可证密钥,然后分发该密钥以允许在其他未获得授权的计算机上开发程序,这样做可能违反既定的版权。要确定某个对象的许可证密钥是否可以合法地再次分发以及有关该对象的许可证密钥的详细信息,请参阅随该对象提供的许可协议,或与对象的创作者联系。

==========================================================

那么问题又来了,为什么会打雷下雨,为什么有冬天夏天?

哦不,是

为什么通过向导添加变量不需要许可,自己create就需要呢?

问题解决——基于MSCOMM32.OCX控件的类在客户机不能创建控件的更多相关文章

  1. 【转】线程间操作无效: 从不是创建控件“textBox2” 的线程访问它。

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  2. C#利用控件mscomm32.ocx读取串口datalogic扫描枪数据

    1).开发环境VS12,语言C# 2).扫描枪品牌:datalogic 4470 3).通讯协议:串口 1.首先,第一步创建一个新工程,windows窗体应用程序,命名为TestScanner,如下: ...

  3. 基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自动适应宽带高度

    在默认情况下,EasyUI的DataGrid好像都没有具备自动宽度的适应功能,一般是指定像素宽度的,但是使用的人员计算机的屏幕分辨率可能不一样,因此导致有些地方显示太大或者太小,总是不能达到好的预期效 ...

  4. 一个字体,大小,颜色可定义的自绘静态框控件-XColorStatic 类(比较好看,一共19篇自绘文章)

    翻译来源:https://www.codeproject.com/Articles/5242/XColorStatic-a-colorizing-static-control XColor Stati ...

  5. c#跨线程访问控件帮助类

    1.背景 对于winform程序来说,当我们点击按钮,需要消耗一定时长才能拿到数据后才能显示在界面上某个控件上的情况,我们通常会专门开一个线程去拿数据,这样不会造成界面处于假死状态 2.常规做法 // ...

  6. swift 字符转为类,代码创建控件

    在使用类之前要先获得 命名空间 通过json来获取 字符型的类名 然后创建类对象,这时候就要用到字符转类 // 从info字典中获取到 命名空间 转为字符型 let NS = NSBundle.mai ...

  7. 如何解决FormView中实现DropDownList连动选择时出现 "Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的错误

    原文:如何解决FormView中实现DropDownList连动选择时出现 "Eval().XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的 ...

  8. Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用

    原文:Eval().XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用 “/vs2005”应用程序中的服务器错误.--------------------------- ...

  9. VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

    一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...

随机推荐

  1. ASP.NET MVC 在控制器中接收视图表单POST过来的数据方法

    方法一:通过Request.Form [HttpPost]        public ActionResult Test()        {            string id=Reques ...

  2. ActiveMQ学习(一)——MQ的基本概念

    1) 队列管理器 队列管理器是MQ系统中最上层的一个概念,由它为我们提供基于队列的消息服务. 2) 消息 在MQ中,我们把应用程序交由MQ传输的数据定义为消息,我们可以定义消息的内容并对消息进行广义的 ...

  3. struts2基础——自定义拦截器

    一.自定义拦截器 默认的拦截器能实现的功能是有限的,Struts2 支持自定义拦截器. 二.拦截器类 1.实现 Interceptor 接口 2.继承 AbstractInterceptor 抽象类, ...

  4. 关于 CommonJS AMD CMD UMD 规范的差异总结

    一.CommonJS 主要是用于服务器端的规范,比如目前的nodeJS. 根据CommonJS规范,一个单独的文件就是一个模块.每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函 ...

  5. AutoMapper配置方法

    在Mvc开发中,我们经常需要构建一个viewModel出来供页面使用,在PO和VO之间相互传值的时候,如果实体字段比较多的时候,那么传值将变得异常麻烦,也使得代码非常的臃肿.AutoMapper可以帮 ...

  6. 在android设备上调试ionic应用

    方法1: ionic run android -l -c 将会在console中输出日志信息 方法2: (1).使用usb连接android设备,并打开android设备的调试功能 (2).在chro ...

  7. C#实现的18位身份证格式验证算法

    18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999<公民身份号码>中做了明确的规定. GB11643-1999<公民身份号码>为GB1164 ...

  8. 获取datatable更新之前的数据

    string dd = ds.Tables[0].Rows[0][0, DataRowVersion.Original].ToString() ;

  9. 百度FIS入门

    1.fis作为nodejs的模块来管理的,所以首先得安装nodejs,看我前面的安装nodejs的文章. 2.官方的案例下载包https://github.com/hefangshi/fis-quic ...

  10. #define lowbit(x) ((x)&(-x))原理详解

    #define lowbit(x) ((x)&(-x)) 也可以写成如下形式: int Lowbit(x) { return x&(-x); } 例如: 1> x = 1: 十进 ...