手动注册:
大家知道,当我们安装VC++6.0/VB6.0时,如果选择了ACtiveX控件项(自定义安装),MSComm控件就会自动安装在计算机上了,并在系统文件夹下多了3个文件:Mscomm.srg, Mscomm32.ocx,Mscomm32.dep
注意,操作系统不同,则系统文件夹不同:
Win98: windows/system
Win2000: winnt/system32
那么用了MSComm控件的程序在发布时或者在VS2008开发环境下如何来注册MSComm控件呢?发布程序时可以用安装程序,我们这里不介绍,只谈谈如何手工来注册安装MSComm控件。
第一步:将Mscomm.srg, Mscomm32.ocx,Mscomm32.dep三个文件复制到系统文件夹中。要注意的是,MSComm控件是要授权的,所以必须将其使用“执照”Licence 在注册表中登记注册,下一步就是注册方法。至于为什么要这样做,可以看看下面的网页:http://support.microsoft.com/support/kb/articles/q151/7/71.asp
第二步:用Windows下的注册工具regsvr32注册该OCX控件,点击“开始”->"运行",再在中填入(假设操作安装在C盘,WIN2000):
Regsvr32 C:\winnt\system32\Mscomm32.ocx
第三步:在注册表中手工新建一个主键项:先在点击“开始”->"运行",再在中填入regedit命令打开注册表,找到HKEY_CLASSES_ROOT\Licenses,在其中添加主键
4250E830-6AC2-11cf-8ADB-00AA00C00905 并将内容设置为:
kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun
(注:这项内容也可以用记事本程序打开Mscomm.srg文件看到)
在VC(包括VC.NET)中应用,我已经介绍多次了,这里再说说在Delphi中的应用:进入Delphi环境中,选择菜单命令:Component->Import ActiveX Control,在列表中可以看到Microsoft Comm Control,version 6.0, 选中后点击Install按钮,就完成安装。在ActiveX控件页上可以看到MSComm控件的电话图标。
以上转自:http://www.gjwtech.com/scomm/manaualregistermscomm.htm
自动注册:
运行附件中的“注册.cmd”完成自动注册 MSComm控件。 MSComm
posted @
2013-03-20 10:23 王海光 阅读(1774) |
评论 (0) |
编辑 收藏
1、安装mysql-5.0.22-win32,mysql-connector-odbc-5.1.12-win32.msi 然后:开始菜单->设置->控制面板->管理工具->数据源(ODBC)->系统DSN->添加->选择MySQL ODBC 5.1 Driver
2、首先导入ADO类型库,您的环境中msado15.dll不一定在这个目录下,请按实际情况修改。或者把msado15.dll这个文件拷贝到你的工程目录下,直接#import "msado15.dll" \ no_namespace \rename ("EOF", "adoEOF")包含进来。
在stdafx.h加入如下代码:
#include <afxdb.h> // MFC Automation classes
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
3、代码示例:
.h文件:
/************************************************************************
*Copyright:
*FileName:ADOConn.h
*
*Author:wanghaiguang
*Date:2013-03-07
*Description:ADO Operate MySql DataBase
************************************************************************/
#pragma once
class CADOConn
{
public:
CADOConn(void);
~CADOConn(void);
public:
//添加一个指向Connection对象的指针:
_ConnectionPtr m_pConnection;
//添加一个指向Recordset对象的指针:
_RecordsetPtr m_pRecordset;
// 定义方法
public:
// 初始化—连接数据库
void OnInitADOConn();
// 执行查询
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);
// 执行SQL语句,Insert Update _variant_t
BOOL ExecuteSQL(_bstr_t bstrSQL);
void ExitConnect();
};
.cpp文件:
#include "StdAfx.h"
#include "ADOConn.h"
CADOConn::CADOConn(void)
{
}
CADOConn::~CADOConn(void)
{
}
/************************************************************************
*Function : OnInitADOConn
*Description: Init DataBase Connect
*param : bconString[in] ()
*return : void
************************************************************************/
void CADOConn::OnInitADOConn()
{
// 初始化OLE/COM库环境
::CoInitialize(NULL);
HRESULT hr;
try
{
// 创建Connection对象,可以通过配置文件获取连接信息
hr = m_pConnection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
m_pConnection->ConnectionTimeout=600;//设置连接超时时间
m_pConnection->CommandTimeout=120;//设置执行命令超时时间
m_pConnection->Open("DSN=MySqlTest;Server= localhost;Database=school","root","sa",adModeUnknown);
}
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
}
/************************************************************************
*Function : GetRecordSet
*Description: Select Data
*param : bstrSQL[in] SQL
*return : _RecordsetPtr
************************************************************************/
_RecordsetPtr& CADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
// 返回记录集
return m_pRecordset;
}
/************************************************************************
*Function : ExecuteSQL
*Description: Exec SQL For Insert Update _variant_t
*param : bstrSQL[in] SQL
*return : BOOL
************************************************************************/
BOOL CADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
// _variant_t RecordsAffected;
try
{
// 是否已经连接数据库
if(m_pConnection == NULL)
OnInitADOConn();
// Connection对象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}
/************************************************************************
*Function : ExitConnect
*Description: Exit Connect DataBase
*param :
*return : void
************************************************************************/
void CADOConn::ExitConnect()
{
// 关闭记录集和连接
if (m_pRecordset != NULL)
{
m_pRecordset->Close();
//m_pRecordset->Release();
}
m_pConnection->Close();
//m_pConnection->Release();
// 释放环境
::CoUninitialize();
}
其他连接数据库:
BOOL ConnectMySqlFun1()
{
CoInitialize(NULL); //初始化Com组件
conPtr.CreateInstance(__uuidof(Connection)); //Connection用于与数据库服务器的链接另一种方式
/******************连接数据库********************/
try
{
// MySqlTest为数据源名 localhost表示本地 root表示用户名 sa表示密码
conPtr->Open("DSN=MySqlTest;server=localhost;database=school;","root","sa",adModeUnknown);///连接MySql数据库(测试成功)
}
catch(_com_error e) //捕捉异常
{
printf("Connect Error : %s", e.Description());
return FALSE;
}
return TRUE;
}
BOOL ConnectMySqlFun2()
{
CoInitialize(NULL); //初始化Com组件
try
{
//创建连接对象实例
conPtr.CreateInstance("ADODB.Connection");
//设置连接字符串
//mdb------------------------------------------------
CString strConnect="DSN=MySqlTest";
//使用Open方法连接数据库
conPtr->Open((_bstr_t)strConnect,"root","sa",adModeUnknown);
}
catch(_com_error e)
{
printf("Connect Error : %s", e.Description());
return FALSE;
}
return TRUE;
}
操作MySql数据库:
CADOConn m_ADO;
m_ADO.OnInitADOConn();
//设置SELECT语句
_bstr_t vSQL, vInserSQL;
vSQL = "select name from teacher";
//设置INSERT语句
vInserSQL = "insert into teacher values(27, 'hai', '哈尔滨六中', '1998-05-05')";
///执行INSERT语句
if (m_ADO.ExecuteSQL(vInserSQL))
{
printf("Insert Data Successful!!!");
}
//执行SELETE语句
_RecordsetPtr m_pRecordset;
m_pRecordset = m_ADO.GetRecordSet(vSQL);
CString name0;
//返回各列的值
while (!m_pRecordset->adoEOF)
{
name0 = (LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("name");
//CString name=(CString)recordPtr->GetCollect(_variant_t("name")).bstrVal;
//int no=recordPtr->GetCollect(_variant_t("stuno")).intVal;
printf("name : %s\n", name0);
m_pRecordset->MoveNext();
}
//断开与数据库的连接
m_ADO.ExitConnect();
参考链接:http://www.cppblog.com/current/archive/2009/07/24/91069.html
posted @
2013-03-07 15:30 王海光 阅读(4841) |
评论 (0) |
编辑 收藏
方法1:
In the Options go into Projects and Solutions -> VC++ Directories page and place this rows:
$(SystemRoot)\System32
$(SystemRoot)
$(SystemRoot)\System32\wbem
适用VC8的各种工程项目(包括移动设备的项目),如果在加了以后还出现这样的错误提示,将上面的三句删除掉,重新加一次就可以。
方法2:在Visual Studio中,选择工具->选项->工程和解决方案->VC++目录 点击上方的像文件夹的按钮-新建行,然后在空白处添加cmd.exe所在的目录C:\Windows\System32\ (如果你是默认装在C盘的话)点击确定,就OK了。 In VS, go to tools>options>projects and solutions>VC++ Directories click the little folder button (new line) then in the new line that appears put:
本文转自:http://www.cppblog.com/zhangyq/archive/2009/02/16/73940.html
posted @
2013-03-07 10:49 王海光 阅读(1074) |
评论 (1) |
编辑 收藏
代码下载:
Socket编程示例_异步
Socket编程示例_同步
posted @
2013-03-01 16:10 王海光 阅读(903) |
评论 (0) |
编辑 收藏
代码示例:
#include <Sensapi.h>
#pragma comment(lib, "Sensapi.lib")
BOOL CheckNetIsOK(
const CString sUpdateIP)
{
//Judge Network is Connected
int nCount = 1;
do {
DWORD dw;
if( IsNetworkAlive(&dw))
{
break;
}
else {
Sleep(10000);
CString sNetWorkConnect;
sNetWorkConnect.Format("第%d次网络未成功连接, 10秒后重试", nCount);
m_recvCtrl.SetWindowText(sNetWorkConnect);
nCount++ ;
}
}
while (nCount <4);
if (nCount == 4)
{
m_recvCtrl.SetWindowText("网络连接失败, 共检测40秒");
return FALSE;
}
DWORD n = CCommonFun::WinExecAndWait32(_T("ping.exe"), sUpdateIP + " -n 2"
/*sCmdPara*/, NULL, 10000);
if (n == 0)
{
return TRUE;
}
else {
CString sNetWorkConnect;
sNetWorkConnect.Format("网络连接正常, Ping:%s 失败, 请检测此IP对应的服务器是否正常工作", sUpdateIP);
m_recvCtrl.SetWindowText(sNetWorkConnect);
return FALSE;
}
}
posted @
2013-03-01 15:51 王海光 阅读(7424) |
评论 (5) |
编辑 收藏
代码示例:
int LineNum=m_recvCtrl.GetLineCount();
if(LineNum > 100) // 超过最大信息显示行数
{
m_recvCtrl.SetSel(0, -1);
m_recvCtrl.Clear(); // 清空编辑框
}
CTime RevTime = CTime::GetCurrentTime();
CString Temp = RevTime.Format("[%Y/%m/%d %H:%M:%S]: ");
CString strEdit;
m_recvCtrl.GetWindowText(strEdit);
m_recvCtrl.SetSel(strEdit.GetLength(), strEdit.GetLength());
m_recvCtrl.ReplaceSel(Temp + sText + "\n");
posted @
2013-03-01 15:50 王海光 阅读(2644) |
评论 (0) |
编辑 收藏
代码示例:
CString GetPeerName_(SOCKET so)
{
struct sockaddr_in sa;
int len = sizeof(sa);
getpeername(so, (struct sockaddr *)&sa, &len);
return CString(inet_ntoa(sa.sin_addr));
}
posted @
2013-03-01 15:46 王海光 阅读(2674) |
评论 (0) |
编辑 收藏
本文转自:http://www.cnblogs.com/ggjucheng/archive/2012/11/02/2751119.html
posted @
2013-02-27 16:13 王海光 阅读(382) |
评论 (0) |
编辑 收藏
本文转自:http://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465625.html
posted @
2013-02-27 16:09 王海光 阅读(419) |
评论 (0) |
编辑 收藏
GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能:
- 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
- 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
- 当程序被停住时,可以检查此时你的程序中所发生的事。
- 动态的改变你程序的执行环境。
从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。
gdb基本命令列表:
![](/images/cppblog_com/wanghaiguang/gdb/gdb1.gif)
实例:
1 新建一个源文件vi swap.cc
![](/images/cppblog_com/wanghaiguang/gdb/gdb2.gif)
源文件内容如下:
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
int main()
{
int i,j;
cout<<endl<<"Input two int number:"<<endl;
cin>>i>>j;
cout<<"Before swap(),i="<<i<<" j="<<j<<endl;
swap(i,j);
cout<<"After swap(),i="<<i<<" j="<<j<<endl<<endl;
return 0;
}
直接复制粘贴生成源文件
2.生成可执行文件 g++ -g -o swap swap.cc,注意必须使用-g参数,编译会加入调试信息,否则无法调试执行文件
![](http://hi.csdn.net/attachment/201203/19/0_1332131674N111.gif)
3.启动调试 gdb swap
![](/images/cppblog_com/wanghaiguang/gdb/gdb3.gif)
3.1 查看源文件 list 1,回车重复上一次指令
![](/images/cppblog_com/wanghaiguang/gdb/gdb4.gif)
3.2设置调试断点 break 16,在第16行设置断点,info break查看断点信息(亦可使用缩写i b )
![](/images/cppblog_com/wanghaiguang/gdb/gdb5.gif)
![](/images/cppblog_com/wanghaiguang/gdb/13.gif)
3.3 调试 运行 输入run 或者r
![](/images/cppblog_com/wanghaiguang/gdb/gdb6.gif)
3.3 单步调试,step 或者 s进入函数内部
![](/images/cppblog_com/wanghaiguang/gdb/gdb7.gif)
3.4查看变量 print b 或者 p b
![](/images/cppblog_com/wanghaiguang/gdb/gdb8.gif)
3.5查看函数堆栈bt,退出函数finish
![](/images/cppblog_com/wanghaiguang/gdb/14.gif)
3.6 继续运行直到下一个断点或主函数结束continue或者c
![](/images/cppblog_com/wanghaiguang/gdb/gdb10.gif)
3.7 退出调试 输入q
本文转自:http://blog.csdn.net/wfdtxz/article/details/7368357其他链接:http://blog.csdn.net/zzymusic/article/details/4815142 http://blog.sina.com.cn/s/blog_7dc317590101bouz.html
posted @
2013-02-27 15:38 王海光 阅读(511) |
评论 (0) |
编辑 收藏