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

所以导出了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. 【第三课】ANR和OOM——贪快和贪多的后果(下)

    Out of Mana,法力耗尽. 内存就像法力,耗尽了就什么都不能做了.有时候一个应用程序占用了太大的内存,超过了Android系统为你规定的限制,那么系统就会干掉你,以保证其他app有足够的内存. ...

  2. Gradle学习系列之六——使用Java Plugin

    在本系列的上篇文章中,我们讲到了如何自定义Property,在本篇文章中,我们将讲到如何使用java Plugin. 请通过以下方式下载本系列文章的Github示例代码: git clone http ...

  3. 全球2/3的DNS瘫痪 顶级域名根服务器故障

    1月21日下午消息,据多家DNS服务商透露,今日下午3点,全国所有通用顶级域的根出现异常,导致部分国内用户无法访问.com域名网站,对全国互联网链接造成系统性影响.   根服务器主要用来管理互联网的主 ...

  4. Fluent Nhibernate and Stored Procedures

    sql:存储过程 DROP TABLE Department GO CREATE TABLE Department ( Id INT IDENTITY(1,1) PRIMARY KEY, DepNam ...

  5. UGUI之Toggle使用

    Toggle对象是一个开关.一般用于单选,可以用Toggle制作背包的选项卡 在场景中创建Toggle按钮.看看他有Toggle组件

  6. jsp中自定义Taglib案例

    一.使用TagSupport类案例解析 1.自定义Tag使用jdbc连接mysql数据库 1.1定义标签处理器类 package com.able.tag; import java.sql.Conne ...

  7. Linux里如何查找文件内容

    Linux查找文件内容的常用命令方法. 从文件内容查找匹配指定字符串的行: $ grep "被查找的字符串" 文件名例子:在当前目录里第一级文件夹中寻找包含指定字符串的.in文件g ...

  8. Google OKR 目标管理体系学习

    OKR 全称是「目标和关键成果」(Objectives and Key Results).它是Google在公司创立不足一年的时候,从Intel公司引入的目标管理系统,也常被认为是一套组织测评系统. ...

  9. H5调用Android播放视频

    webView.loadUrl("http://10.0.2.2:8080/assets/RealNetJSCallJavaActivity.htm"); js调用的Java文件中 ...

  10. android的Project has no default.properties file! Edit the project properties to set one. 的解决

    网上找来这种方法基本解决: 在我们导入Android工程时,有时候会出现如题所述的错误,打开工程目录可以看到,目录下的default.properties文件没有了或者多出了一个project.pro ...