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

所以导出了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. WebGL on iOS8 终于等到了这一天

    WWDC2014刚结束,这次的大会是名符其实的开发者大会,更贴切的应该说的确是一次软件开发者的大会,对于OSX和iOS的更多功能特性让人兴奋,Swift新语言促成了如上图片 但我更感兴趣的是WebGL ...

  2. 【转】sql server开启全文索引方法

    利用系统存储过程创建全文索引的具体步骤: 1) 启动数据库的全文处理功能 (sp_fulltext_database) 2) 建立全文目录 (sp_fulltext_catalog) 3) 在全文目录 ...

  3. IOS开发UI基础UIImageView属性属性

    UIImageView属性 1.Image 设置图片,默认显示 UIImageView *_imageView = [[UIImageView alloc]init]; _imageView.imag ...

  4. 团队项目SCRUM项目6.0 7.0

    6.0----------------------------------------------------- sprint演示 1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉 ...

  5. 三分 --- CSU 1548: Design road

    Design road Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1548 Mean: 目的:从(0,0)到 ...

  6. ASP.NET MVC4 数据库连接(EF6.0)

    我的博客原文地址:http://www.star110.com/Note/ReadArticle/60641215331146140041.html 环境:.NET MVC4 + EF6.0 连接数据 ...

  7. jQuery中常用的元素查找方法

    $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div&q ...

  8. 重新想象 Windows 8 Store Apps (53) - 绑定: 与 ObservableCollection CollectionViewSource VirtualizedFilesVector VirtualizedItemsVector 绑定

    [源码下载] 重新想象 Windows 8 Store Apps (53) - 绑定: 与 ObservableCollection CollectionViewSource VirtualizedF ...

  9. Python正则表达式模块(re模块)

    Python是我接触到的第一门编程语言,虽然它足够简单,但是对于当时刚刚接触编程语言的我来说还是有些难度的,于是只是了解了一些Python的基本语法,稍微深入一点的地方都没怎么了解.不过,到现在为止, ...

  10. 【JVM】2、关于jdk7的MethodHandle类

    关于MethodHandle类,这个类是在jdk1.7之后加入的,这个类的作用类似函数指针的意思 这个类中有一个方法 这里我的jdk有一个问题,就是我在进行MethodHandle操作的时候,我们会发 ...