何为DLL Hell?

DLL噩梦

DLL HELL字面意思是DLL”灾难”,是由于com组件升级引起的程序不能运行的情况。

 COM对象常常被编译为dll文件。COM组件模型虽然很不错,但是它自身存在致命的缺陷。由于COM对象可以被重用,这样多个程序可能使用一个COM对象 ,如果这个COM组件升级了,就很有可能出现其中某个程序无法使用新组件,导致程序不能运行的情况,这种情况被称为“DLL HELL”。有时安装了新的软件后很多其他的软件都无法使用,往往就是这个原因。
Windows系统是以Dynamic Link Library(动态链接库)的方式让系统和应用软件共用所有的系统文件的。
DLL Hell的意思就是因为系统文件被覆盖而让整个系统像是掉进了地狱(什么软件都不能运行了)。

可能的原因

很多windows的应用程序在发布的时候会将它们所有要用到的DLL都一起打包发布,很多应用程序的安装程序都不是很成熟,经常在安装的时候将一个旧版本的DLL覆盖掉一个更新版本的DLL,从而导致其他的应用程序运行失败。有些安装程序比较友好,如果碰到需要覆盖新版的DLL时,它会弹出一个对话框提醒用户是否覆盖,但是即使这样,有些应用程序只能运行在旧版本的DLL下,如果不覆盖,那么它可能无法在新版的DLL中运行。总的来说,有三种可能的原因导致了DLL Hell的发生:

一是由使用旧版本的DLL替代原来一个新版本的DLL而引起的。这个原因最普遍,是Windows 9X用户通常遇到的DLL错误之一。

二是由新版DLL中的函数无意发生改变而引起。尽管在设计DLL时候应该向下兼容,然而要保证DLL完全向下兼容却是不能的。

三是由新版DLL的安装引入一个新的Bug。

C语言学习视频第1集 | 开始做第一个C语言的程序

有些朋友反映视频看不清楚,下面提供两个视频源文件下载地址,非常清晰:

DBANK网盘下载地址:C语言也能干大事全集

VeryCD(电驴)资源地址:《计算机自学宝典之-九阳神功》(c语言也能干大事aspNET编程开放课程单片机java教程PDF电子书WEB开发eclipse实战C#rupeng软件公开课.net培训)更新第11季.net视频打包更新[压缩包]

注:有些朋友反映在线观看的视频看不清楚,而提供的DBANK下载地址和电驴下载地址下载速度又太慢。如果大家有相似情况,可以在本文下方评论中留下邮箱地址,注明“需要C语言学习视频教程:C语言也能干大事,邮箱地址xxxx@xxx”。我会在看到评论后将视频给大家发送到邮箱。

sqlite官方提供的shell命令行程序sqlite3.exe如何使用及操作数据库详解

不多作解释,开始介绍。

1、创建数据库

打开命令行窗口,确保当前路径能够执行sqlite3.exe。不明白的童鞋可以网上搜一下windows下环境变量path的设置。

sqite3 DBNAME.EXT

执行上面的命令,其中DBNAME为你要命名的数据库名,EXT为扩展名,扩展名有没有都可以。执行命令后,并不会立即生成文件。

2、最重要的命令

.help

进入sqlite命令模式下后,执行.help这个命令,就会显示出所有可用的操作。任何时候忘记了命令,都可以去查查。

到此,先说明两点

一、凡是.help中显示列表中的命令,均不需要分号结尾

二、凡是sql语句,均需要加分号结尾表示该语句结束,然后回车执行

好,继续介绍命令。

3、创建一个数据表

create table tablename(fieldname fieldtype[,…]);

和一般的sql语法差不多,只是写表结构的时候,字段名fieldname要写在字段类型fieldtype前面,同时注意分号作为sql语句结尾。

在成功建表后,在sqlite.exe目录下已经生成了你的数据库文件。如果你不想将文件建在sqlite.exe目录下,可以在创建数据时这样书写,举个例子:

sqite3 D:\test.db

也就是,将数据库文件起名test.db并放在d盘根目录下。

4、关于执行select语句后不显示结果

在.help帮助列表中,有一个.output stdout,这个命令的意思是将结果输出到屏幕上。

如果你确认已经在表中插入数据,select却未显示结果,那么就执行.output stdout。然后再select。

5、.help列表

sqlite> .help

.backup ?DB? FILE Backup DB (default “main”) to FILE 备份数据库到文件
.bail ON|OFF Stop after hitting an error. Default OFF 开启/关闭遇错停止,默认关闭
.databases List names and files of attached databases 显示数据库列表
.dump ?TABLE? … Dump the database in an SQL text format 导出数据到sql文件
If TABLE specified, only dump tables matching LIKE pattern TABLE.
.echo ON|OFF Turn command echo on or off 开启/关闭命令回显
.exit Exit this program 退出sqlite
.explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.With no args, it turns EXPLAIN on. 开启/关闭执行命令后是否显示一些详细信息,建议开启
.header(s) ON|OFF Turn display of headers on or off 开启/关闭显示头部,例如select时的表头
.help Show this message
.import FILE TABLE Import data from FILE into TABLE 将某文件中的数据导入到指定数据表
.indices ?TABLE? Show names of all indices.If TABLE specified, only show indices for tables matching LIKE pattern TABLE.
.load FILE ?ENTRY? Load an extension library
.log FILE|off Turn logging on or off. FILE can be stderr/stdout 开启/关闭日志记录,并可选择日志记录到文件或屏幕
.mode MODE ?TABLE? Set output mode where MODE is one of: 输入模式设置,比如,配合.output fname将数据直接按html格式输出到文件
csv               Comma-separated values
column      Left-aligned columns. (See .width)
html            HTML <table> code
insert         SQL insert statements for TABLE
line              One value per line
tabs             Tab-separated values
tcl                TCL list elements
.nullvalue STRING Print STRING in place of NULL values 显示时在空值处替换成字符串
.output FILENAME Send output to FILENAME 输出到文件
.output stdout Send output to the screen 输出到屏幕
.prompt MAIN CONTINUE Replace the standard prompts
.quit Exit this program
.read FILENAME Execute SQL in FILENAME 执行指定文件中的sql语句
.restore ?DB? FILE Restore content of DB (default “main”) from FILE 从个文件中恢复数据内容
.schema ?TABLE? Show the CREATE statements 显示数据表结构
If TABLE specified, only show tables matching LIKE pattern TABLE.
.separator STRING Change separator used by output mode and .import
.show Show the current values for various settings 显示当前各设置项的设定值
.stats ON|OFF Turn stats on or off
.tables ?TABLE? List names of tables 将当前数据库中的数据表列举
If TABLE specified, only list tables matching LIKE pattern TABLE.
.timeout MS Try opening locked tables for MS milliseconds
.width NUM1 NUM2 … Set column widths for “column” mode 当显示模式为colume时各列的显示宽度
.timer ON|OFF Turn the CPU timer measurement on or off

个人感觉:这个sqlite.exe很简洁,适合数据库导出到文件、输出到文件、从文件导入等操作。对于新手,最好选用其他可视化的工具进行学习使用。这里推荐一个,SQLite Expert Professional,下载页面:http://www.duote.com/soft/7792.html

C++使用SQLite数据库(从下载到具体使用的全过程)

1、下载

http://www.sqlite.org/download.html

找到Source Code中的sqlite-amalgamation-*******.zip,这里的*号指的是版本号。这个压缩包中一般包含有四个文件,其中的sqlite3.h是我们需要用到的。

找到Precompiled Binaries For Windows中的sqlite-dll-win32-x86-*******.zip,这里的*号指的是版本号。这个压缩包中一般包含两个文件:sqlite3.def和sqlite3.dll。

找到Precompiled Binaries For Windows中的sqlite-shell-win32-x86-*******.zip,这里的*号指的是版本号。这个压缩包中一般包含一个文件:sqlite3.exe。

2、利用lib命令得到sqlite3.lib文件

找到VisualStudio的安装路径,我的是D:\Program Files\Microsoft Visual Studio\,用命令行进入以下路径。

D:\Program Files\Microsoft Visual Studio\VC98\Bin>lib /def:sqlite3.def /machine:ix86

上面一行加粗字体部分就是利用lib命令来生成sqlite3.lib文件的。这里注意一点,在执行这个命令前,需要将下载的zip文件中的sqlite3.def和sqlite3.dll解压到D:\Program Files\Microsoft Visual Studio\VC98\Bin\里。

在执行完lib命令后,我们就会发现,在D:\Program Files\Microsoft Visual Studio\VC98\Bin目录下,成功生成了两个文件:sqlite3.lib和sqlite3.exp。

3、将sqlite相关文件拷贝到C++工程目录下

将sqlite3.lib、sqlite3.exe、sqlite3.h文件直接拷贝到工程目录下,或者在工程目录下建立一个专门的目录进行存放,作者是在工程目录下建立了一个名为sqlite3的目录。最后将sqlite3.dll文件拷贝到工程目录下的Debug目录中。

4、生成数据库文件,并创建一个数据表

sqlite数据库是以文件的形式存在的,所以要创建一个数据库就是要创建一个数据库文件。

用命令行进入包含sqlite3.exe的目录,比如我的是D:\sqlite3\sqlite3.exe,然后利用这个sqlite3.exe生成数据库!

在命令行下输入以下命令:sqlite3 test.db

执行完这个命令后,会弹出来几行提示,在D:\sqlite3\下并没有生成任何文件。

接下来,创建一个数据表test_table,这个数据表包含两个int型的字段f1,f2。

在命令行下输入以下命令:create table test_table(f1 int,f2 int)

注意不要在命令后面加分号。这时可以发现,在D:\sqlite3\目录下已经生成了一个test.db文件。

来个命令行模式下的截图:

sqlite3.exe使用方法及命令详解详见本博客的另外一篇原创文章:《sqlite3.exe使用方法及命令详解》

动态调用DLL,加载没有问题,但在调用函数时,出现下面的错误 i386\chkesp.c line:42

动态调用DLL,加载没有问题,但在调用函数时,出现下面的错误

program
module
file:   i386\chkesp.c
line:42

the   value   of   ESP   was   not   properly   saved   acorss   a   function   call.
This   is   usually   a   result   of   calling   a   functino   declared   with
one   calling   convention   with   a   function   pointer   declared   with   a
different   calling   convention

由于DLL由别人提供,不能更改,所以比较困惑。。。。

解决办法:

typedef   int   (*   yourFunc)(yourParam1,yourParam2…);

换成typedef   int   (__stdcal*   tcpinitDLL)(yourParam1,yourParam2…);

这里的__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:
1.参数传递顺序
2.调用堆栈由谁(调用函数或被调用函数)清理

常见的函数调用约定:stdcall cdecl fastcall thiscall naked call

__stdcall表示:
1.参数从右向左压入堆栈
2.函数被调用者修改堆栈
3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸
在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。

【转载】DirectShow 一些常见编译错误的处理

1.LINK : fatal error LNK1181: 无法打开输入文件“largeint.lib”

DXSDK 2005之后不再提供largeint.lib,直接在设置链接库中去掉该项即可。

2.error LNK2001: 无法解析的外部符号 _MEDIATYPE_Audio 或error LNK2001: 无法解析的外部符号 _IID_IAMErrorLog

在链接库中增加 strmiids.lib

3. error LNK2019: 无法解析的外部符号 “public: __thiscall CTransformFilter::CTransformFilter(wchar_t *,struct IUnknown *,struct _GUID const &)” (??0CTransformFilter@@QAE@PA_WPAUIUnknown@@ABU_GUID@@@Z),该符号在函数 “public: __thiscall CVcomVideoFilter::CVcomVideoFilter(void)” (??0CVcomVideoFilter@@QAE@XZ) 中被引用

将工程字符集属性设置由“使用 Unicode 字符集”改为“未设置”

4. error LNK2001: 无法解析的外部符号 _CLSID_YourFilterName

未引入头文件 #include <initguid.h> 放在最前

5.error LNK2001: 无法解析的外部符号 _IID_IMediaSample2

在链接库中增加 strmiids.lib

6.error LNK2005: _DllMain@12 已经在 msvcrtd.lib(dllmain.obj) 中定义

链接器-》忽略所有默认库

7. error C2065: “GUID_NULL”: 未声明的标识

#include <windows.h>

8.!!szObjectName ^ !!wszObjectName
At line 809 of ….\BaseClass\wxdebug.cpp

是因为release版链strmbasd.lib导致的,应该链strmbase.lib

9.fatal error LNK1104: cannot open file ‘..\..\common\wmstub.lib’

需要安装Windows Media Format 9 Series SDK

10.error C2146: syntax error : missing ‘;’ before identifier ‘PVOID64’

在stdafx.h或工程的最前面加上: #define POINTER_64 __ptr64

opencv下载地址与安装方法

http://www.opencv.org.cn下载OpenCV安装程序。(这里给出V2.2下载地址:

http://www.opencv.org.cn/download/OpenCV-2.0.0a-win32.exe)假如要将OpenCV安装到C:\Program Files\OpenCV。(下面附图为OpenCV 1.0rc1的安装界面,OpenCV 1.0安装界面与此基本一致。)在安装时选择"将\OpenCV\bin加入系统变量"(Add\OpenCV\bin to the systerm PATH)。

Image:Opencv-install-step1.png Image:Opencv-install-step2.png Image:Opencv-install-step3.png Image:Opencv-install-step4.png

配置Windows环境变量

检查C:\Program Files\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入。加入后需要注销当前Windows用户(或重启)后重新登陆才生效。(可以在任务管理器里重启explorer.exe)

Image:Path-envirionment-var1.png Image:Path-envirionment-var2.png

配置Visual C++ 6.0

全局设置

菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径:

C:\Program Files\OpenCV\lib

然后选择include files,在下方填入路径:

C:\Program Files\OpenCV\cxcore\include
C:\Program Files\OpenCV\cv\include
C:\Program Files\OpenCV\cvaux\include
C:\Program Files\OpenCV\ml\include
C:\Program Files\OpenCV\otherlibs\highgui
C:\Program Files\OpenCV\otherlibs\cvcam\include

Image:VC-directories-setting.png

然后选择source files,在下方填入路径:

C:\Program Files\OpenCV\cv\src
C:\Program Files\OpenCV\cxcore\src
C:\Program Files\OpenCV\cvaux\src
C:\Program Files\OpenCV\otherlibs\highgui
C:\Program Files\OpenCV\otherlibs\cvcam\src\windows

最后点击”ok”,完成设置。

项目设置

每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上

cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib

如果你不需要这么多lib,你可以只添加你需要的lib。 Image:VC-project-setting.png

opencv下载地址与安装方法

http://www.opencv.org.cn下载OpenCV安装程序。(这里给出V2.2下载地址:http://www.opencv.org.cn/download/OpenCV-2.2.0-win.zip)假如要将OpenCV安装到C:\Program Files\OpenCV。(下面附图为OpenCV 1.0rc1的安装界面,OpenCV 1.0安装界面与此基本一致。)在安装时选择”将\OpenCV\bin加入系统变量”(Add\OpenCV\bin to the systerm PATH)。

Image:Opencv-install-step1.png Image:Opencv-install-step2.png Image:Opencv-install-step3.png Image:Opencv-install-step4.png

配置Windows环境变量

检查C:\Program Files\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入。加入后需要注销当前Windows用户(或重启)后重新登陆才生效。(可以在任务管理器里重启explorer.exe)

Image:Path-envirionment-var1.png Image:Path-envirionment-var2.png

配置Visual C++ 6.0

全局设置

菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径:

C:\Program Files\OpenCV\lib

然后选择include files,在下方填入路径:

C:\Program Files\OpenCV\cxcore\include
C:\Program Files\OpenCV\cv\include
C:\Program Files\OpenCV\cvaux\include
C:\Program Files\OpenCV\ml\include
C:\Program Files\OpenCV\otherlibs\highgui
C:\Program Files\OpenCV\otherlibs\cvcam\include

Image:VC-directories-setting.png

然后选择source files,在下方填入路径:

C:\Program Files\OpenCV\cv\src
C:\Program Files\OpenCV\cxcore\src
C:\Program Files\OpenCV\cvaux\src
C:\Program Files\OpenCV\otherlibs\highgui
C:\Program Files\OpenCV\otherlibs\cvcam\src\windows

最后点击”ok”,完成设置。

项目设置

每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上

cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib

如果你不需要这么多lib,你可以只添加你需要的lib。 Image:VC-project-setting.png

visual assist x key(破解方法及注册机程序下载地址)

Visual Assist X具有强大的编辑特色,提高了生产效率,可以完全集成到您的Microsoft开发环境中,升级了您的IDE,在不改变编程习惯的同时就可以感受到Visual Assist X为您带来的好处。

Visual Assist X是一款非常好的Microsoft Visual Studio 2005和Visual Studio .NET插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、自动更正大小写错误、自动标示错误等,有助于提高开发过程的自动化和开发效率。

安装文件网盘(Dbank)下载地址:http://dl.dbank.com/c0qbfrlz31

破解补丁网盘(Dbank)下载地址:http://dl.dbank.com/c0hx5qm6mg

Latest Build

Build Release type Release date Downloads
Visual Assist X 10.6.1845.0 General release
release notes
2011.03.13 Unified installer for all IDEs

注:该版本支持 VS2010\VS2008\VS2005\VS2003\VS2002\VC6

官方下载地址http://www.wholetomato.com/binaries/VA_X_Setup1845.exe

之前的版本?(Visual Assist X10.6.1822.0)

下载地址:http://dl.dbank.com/c0ewldw30x

使用方法(谢谢20L的同学):

先安装源程序文件,然后将破解补丁程序请放到

WinXP系统:

%USERPROFILE%\Local Settings\Application Data\Microsoft\VisualStudio\10.0\Extensions\Whole Tomato Software\Visual Assist X\10.6.1845.0

Win7系统:

%USERPROFILE%\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\Whole Tomato Software\Visual Assist X\10.6.1845.0

文件夹下执行。

补丁是patch VA_X.dll文件。
这个破解补丁比较傻,不想以前会弹出查找VA_X.dll文件的对话框。如果不是在正确的目录下,则点击Patch2010按钮没有任何反应。

大家如果对VC++编程等还有不明白或者疑惑的地方,在评论里留言或者QQ我哈:363165133 希望能和大家相互学习、交流。

或者参看本博客VC++的其他相关文章:http://renrenstudy.com/topics/cpp/

转载请注明出处 人人学习网 http://www.renrenstudy.com

如何使用C++?

C++很难,难于正确使用。所以当你决定要用它的时候,一定要小心谨慎,一定要清楚你处在什么位置,你真正想要什么。下面是一个简单的导引:

我们需要高效吗?
如果需要,那么
在我们的代码中需要抽象吗(这个问题一定要慎重考虑,因为很难估计使用C++的高水平特性所带来的好处是否超过了正确使用它们的风险;正确的答案取决于你的编程水平训练的有多好,你遵循什么编码标准,以及这种标准加强的有多好,如果需要,那么就使用C++。

我们需要C++类库来减少我们的工作量吗?
如果需要,那么就使用C++,但同时要谨记你在做什么——如果你的代码并不真的需要所有梦幻抽象,那就不要勉强使用它们;不要仅仅因为你写的代码是.cpp,你使用了C++编译器,就使用类或是模板。