博文
error LNK2005: _DllMain@12 already defin(2008-09-02 17:21:00)
摘要:
error LNK2005: _DllMain@12 already defined in MSVC
编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误。弄清楚它形成的原因,就可以轻松解决它了。 造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量。可能存在两种情况: A、对于一些初学编程的程序员,有时候会以为需要使 用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test即可,如果还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c?book@@3HA already defined in BBB.obj。切记的就是不能给变量赋值否则还是会有LNK2005错误。 这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义: (1)声明必须使用extern关键字;(2)不能给变量赋初值 所以,下面的是声明: extern int a; 下面的是定义 int a; int a = 0; extern int a =0; B、对于那么编程不是那么严谨的程序员,总是在需要使用变量的文件中随意定义一个全局变量,并且对于......
Big-Endian 和 Little-Endian 两者概念的区别(2007-12-03 14:50:00)
摘要:
PS:看了下面各位的讨论后,对字节顺序有了一点了解,因为之前为此问题困扰过。
Intel沿用的是Little-Endian,即低字节在前,高字节在后。而我所处理的通讯中,
是高字节在前,低字节在后。接收后数据总不对。后来才发现是对Big-Endian 和 Little-Endian 了解不够。
再网上查阅了很多资料(包括中英版的MSDN),反复体会,才基本弄明白一些Big-Endian和Little-Endian的含义,先总结如下:
Big-Endian 和 Little-Endian 字节排序
字节排序
含义
Big-Endian
一个Word中的高位的Byte放在内存中这个Word区域的低地址处。
Little-Endian
一个Word中的低位的Byte放在内存中这个Word区域的低地址处。必须注意的是:表中一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来处理字节。一个例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为 big-endian little-endian0x0000 0x12 0xcd0x0001 0x34 0xab0x0002 0xab &n......
在main()前后执行代码(C++版本)(2007-12-03 14:26:00)
摘要:
转自 乾坤一笑
给出程序:#include
int main(int argc, char* argv[])
{
std::cout << "Hello, world !\n";
return 0;
}
修改它,使之产生输出:before main()
Hello, world !
after main()
但不要对main()做任何修改。
---------------------------------------------------------------------------#include
struct Foo
{
Foo() { printf("before main()\n"); }
~Foo() { printf("after main()\n"); }
};
Foo smallFoo;
int main(int argc, char* argv[])
{
std::cout << "Hello, world !\n";
return 0;
}
哈哈,就这么就搞定了。这利用了C++的一个特性——一个全局对象在“程序开始时”建立一次,在“程序终止时”销毁一次。(参见《C++程序设计语言(特别版)》10.4.3节 构造和析构)
注意,不要把Foo函数中的printf()换成cout,不然你会哭的!(不信你试试:p) 七猫说,这是因为在smallFoo析构前,中的类已经被析构了。有什么问题问七猫,偶不知道。^_^
相关文章:jozu 《Run before CRT 》
--------------------------------------------------------------------
2004-11-14 补充:
今天我做了MWEP,测试了一下,发现在MingW的g++ 3.1.0下,编译这段代码:#include <iostream>
using namespace std;
struct Foo
{
Foo() { cout << "before main" << endl;}......
重建"显示桌面"的快捷方式(2007-12-03 14:17:00)
摘要:
转自 乾坤一笑 VC知识库BLOG
偶也有过把“显示桌面”的快捷方式删掉后不知道怎么恢复的经历。那时候唯一解决的方法就是去别人机器上copy一个过来。其实呢,重建这个快捷方式也不难,说穿了不值一文钱。:)
新建一个文本文件,在里面写上下面几句:
[Shell]Command=2IconFile=explorer.exe,3[Taskbar]Command=ToggleDesktop
然后保存为ShowDesk.scf(只要求扩展名是scf就可以了)。PS:如果你是在notepad.exe中操作,那么保存文件的时候,在文件名那一项里面填入:”ShowDesk.scf”即可。如果你不加双引号,notpad会自动给你加上.txt的扩展名的。
# 相同的方法还适应于其他几个工具
lishengg_blog
SCF文件是“WINDOWS资源管理器命令”文件,它也是一种可执行文件. 该类型文件由Windows Explorer Command解释,标准安装,包括下面3个该类型的文件 =========================================================================== 1) Explorer.scf(资源管理器) [Shell] Command=2 IconFile=explorer.exe,1 [Taskbar] Command=Explorer =========================================== 2)Show Desktop.scf(显示桌面) 格式类似如下: [Shell] Command=2 IconFile=explorer.exe,3 [Taskbar] Command=ToggleDesktop =========================================== 3)View Channels.scf(查看频道) [Shell] Command=3 IconFile=shdocvw.dll,-118 [IE] Command=Channels
附:
kin
......
使用ADO封装类的数据库程序开发实例(上)(2006-11-29 18:03:00)
摘要:
使用ADO封装类的数据库程序开发实例(上)作者:成真下载本文示例源代码源代码运行效果图如下: 一、前言用过ADO的人都知道, 调用ADO要处理很多"麻烦"的事情,如异常处理等,要写很多try - catch块. 有点不甚其烦。我干脆把常用的函数都封装起来,免去老是要写try - catch块的麻烦。做起来虽然没有什么技术含量,但也比较烦琐,所以只完成了一部分,且由于时间及个人水平有限,没有对封装的东西作全面测试,并必定有很多错误,但想到对某些朋友可能有用。所以先"捐"出来了。^-^.在介绍这两个类之前,让我们先来了解一下ADO,本文假设你已有一定的编程能力:二、了解ADO的结构体系ADO(ActiveX Data Object, Active 数据对象)是Microsoft提供的一种面向对象,与语言无关的数据访问应用编程接口。据大部分资料介绍,它有如下主要特点:一:易于使用。二:可以访问多种数据源。三:访问速度快,效率高:四:方便Web应用。五:技术编程接口丰富。六:低内存支出和占用磁盘空间较少.正是看到ADO这么多优点,使我对用ADO开发数据库产生了兴趣.ADO用起来也如前面所说的一样,确实不难。总的来说,ADO模型包括了下列对象:连接(Connection)、命令 (Command)、记录集 (Recordset)、字段 (Field)、参数 (Parameter)、错误 (Error)、属性 (Property)、集合 、事件.它们之间的关系如下图: (1)我们最常用的主要是Connection、Recordset及Command这三个对象.(2)对于访问一个数据库来说,我们一般先建立一个ADO连接.(3)ADO连接可以直接执行SQL语句来操纵数据库,但如果我们要对数据在应用程序和数据源之间进行存取的话,就需要用到记录集对象。一个ADO连接可以有多个ADO连接,但一个ADO连接一般只能对应一个且必须对应一个ADO连接.(4)另外如果你可进行更高级别的访问的话,还可能要用到命令对象。例如要调用存储过程等。(5)一个记录集包含有一个字段集,一个字段集则包含有多个字段对象。(6)同样一个命令对象也包含一个参数集,一个参数集则包含有多个参数对象。(7)连接对象也有一个错误集并包含有多个错误对象。这就是ADO各对象之间大致的关系.三、了解ADO连接在使用......
MFC消息映射雏形(2006-11-29 12:28:00)
摘要:MFC消息映射雏形
1.MSGMAP_ENTRY结构与dim(x)宏
MSGMAP_ENTRY{ UINT nMessage; LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);};
#define dim(x) (sizeof(x) / sizeof(x[0]))
其中,pfn是函数指针,此函数用来处理nMessage消息。
2.组织两个数组, _messageEntries[] 和 _commandEntries[],把欲处理的消息及消息处理函数的关联性建立起来:
//消息与处理例程的对照表格struct MSGMAP_ENTRY _messageEntries[] ={ WM_CREATE, OnCreate, WM_PAINT, OnPaint, WM_SIZE, OnSize, WM_COMMAND, OnCommand, WM_SETFOCUS, OnSetFocus, ...}
//Command-ID与处理例程的对照表格struct MSGMAP_ENTRY _commandEntries[] ={ IDM_ABOUT, OnAbout, WM_PAINT, OnPaint, WM_SIZE, OnSize, WM_COMMAND, OnCommand, WM_SETFOCUS, OnSetFocus, ...}
于是窗口映射函数可以这样设计:
//窗口函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ int i; for(i=0; i<dim(_messageEntries); i++){ //消息对照表 if(message == _messageEntries[i].nMessage) return( (* _messageEntries[i].pfn......
ADO编程手记(2006-11-29 10:43:00)
摘要:1._RecordsetPtr
1)初始化
HRESULT hr = 0;
try
{
hr = m_pRs.CreateInstance(__uuidof(Recordset));
if (FAILED(hr))
throw (_com_error(hr,NULL));
}
catch(...)
{
//
}
2)关闭
bool CloseRSet(void)
{
try
{
if(!is_RSetClosed())
{
m_pRs->Close();
}
}
catch(...)
{
 ......
VC用ADO访问数据库全攻略(2006-11-29 09:09:00)
摘要:文章标题:VC用ADO访问数据库全攻略原 作 者:相生昌原 出 处:不详发 布 者:loose_went发布类型:转载发布日期:2004-12-20今日/总浏览:6/22767
关键字 ADO访问数据库大全原作者姓名 相生昌
介绍VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象及各方法,很经典,也很实用,很值得一看。
正文一、ADO概述ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据库服务器中的数据。ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。
OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。您需要的API 应该是一座连接应用程序和OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
二、在VC中使用ADO(开发步骤好下:)
1、引入ADO库文件
使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:
用#import引入ADO库文件......
在Visual C++中用ADO进行数据库编程(2006-11-29 09:08:00)
摘要:1. 生成应用程序框架并初始化OLE/COM库环境
创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)。本例为: BOOL CAdotestDlg::OnInitDialog() { ::CoInitialize(NULL); //初始化OLE/COM库环境 } 程序最后要调用 ::CoUninitialize();//释放程序占用的COM 资源。
另外:m_pRecordset->Close(); 注意!!!不要多次关闭!!!!!!!!!!!!m_pConnection->Close();m_pRecordset = NULL;m_pConnection = NULL; 2. 引入ADO库文件
使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下:#import "C:\Program Files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF") ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。类型库描述了自治接口,以及C++使用的COM vtable接口。当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,读者可以在项目的目录下找到这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。 程序的第三行指示ADO对象不使用名称空间。在有些应用程序中,由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。如果要使用名称空间,则可把第三行程序修改为: rename_namespace("AdoNS")。第四行代码将ADO中的EOF(文件结束)更名为adoEOF,以避免与定义了自己的EOF的其他库冲突。
3.利用智能指针......
在VC中使用ADO开发数据库应用程序(2006-11-29 08:59:00)
摘要:一、ADO概述
ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO 使您能够编写应用程序以通过 OLE.DB 提供者访问和操作数据库服务器中的数据。ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。
OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。您需要的API 应该是一座连接应用程序和 OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
二、在VC中使用ADO
1、引入ADO库文件
使用ADO前必须在工程的stdafx.h文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:
代码1:用#import引入ADO库文件
#import "c:\program files\common files\system\ado\msado15.dll" no_namespaces rename("EOF" adoEOF")
这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。
2、初始化OLE......
