问题解决——基于MSCOMM32.OCX控件的类在客户机不能创建控件

时间:2021-06-25 23:06:54

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

所以导出了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就需要呢?