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

所以导出了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. JS魔法堂:IE5~9的Drag&Drop API

    一.前言     < HTML5魔法堂:全面理解Drag & Drop API>中提到从IE5开始已经支持DnD API,但IE5~9与HTML5的API有所不同,下面我们来了解一 ...

  2. 华为手机Edittext光标(cursor)颜色修改

    华为手机的emui系统经常让人发出“可以可以,这很华为”的感叹 这两天在edittext部分也发生了这样的事情 正常edittext光标的颜色和宽度都说可以修改的,只需要通过xml中的 textCur ...

  3. [操作系统实验lab2]实验报告

    static void * alloc(u_int n, u_int align, int clear) { extern char end[]; int i; u_long alloced_mem; ...

  4. Sprint总结和第八九十的读书笔记

    总结:经过这次的Sprint,我在从中收获了很多.作为产品负责人的我,主要责任就是合理分配任务给自己的队友,调动队友的积极性.虽然这其中也有些不尽人意的地方,但是我们都坚持的走了过来,团队合作真的很重 ...

  5. 移动前端页面与Chrome的远程真机调试

    一年不见,博客园都长草啦...... 前几日刚入手新手机小米5,系统真心流畅呀.为啥要买小米5呢,因为要提高生产力呀,好好玩移动前端开发呀哈哈哈 那么问题来了,要怎么调试手机上的前端页面呢? 很久很久 ...

  6. css3中的zoom元素属性值测试

    在样式表里头看到zoom:1的设置,很是好奇就去找了一些资料发现关于这个的讲述还是比较少. 理论知识 语法: zoom:normal | <number> | <percentage ...

  7. 无废话WCF入门教程一[什么是WCF]

    http://www.cnblogs.com/iamlilinfeng/archive/2012/09/25/2700049.html wcf技术交流,同学习共进步,欢迎加群:  群号:3981831 ...

  8. 在sap系统设置纸张打印格式(针式打印机)

    在sap做一个打印报表,要先设置一个纸张打印格式,下面以工厂中常用来打印的针孔纸为例,在sap设置该纸张的打印格式,以用于报表: 1.运行事务代码SPAD:选择工具栏上的[完全管理]按钮——>选 ...

  9. .NET 面试基本技术整理

    这篇文章主要 整理出来的大部分公司需要的技术 以及一些学习链接,进行恶补一下,以免面试官考倒你 其中也整理了一些面试题需要的可以点击链接 需要掌握的技术 基础概念需要 面向对象 OOD/OOP OOD ...

  10. LinearLayout嵌套

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...