DLL噩梦
DLL HELL字面意思是DLL”灾难”,是由于com组件升级引起的程序不能运行的情况。
可能的原因
一是由使用旧版本的DLL替代原来一个新版本的DLL而引起的。这个原因最普遍,是Windows 9X用户通常遇到的DLL错误之一。
二是由新版DLL中的函数无意发生改变而引起。尽管在设计DLL时候应该向下兼容,然而要保证DLL完全向下兼容却是不能的。
三是由新版DLL的安装引入一个新的Bug。
DLL HELL字面意思是DLL”灾难”,是由于com组件升级引起的程序不能运行的情况。
一是由使用旧版本的DLL替代原来一个新版本的DLL而引起的。这个原因最普遍,是Windows 9X用户通常遇到的DLL错误之一。
二是由新版DLL中的函数无意发生改变而引起。尽管在设计DLL时候应该向下兼容,然而要保证DLL完全向下兼容却是不能的。
三是由新版DLL的安装引入一个新的Bug。
有些朋友反映视频看不清楚,下面提供两个视频源文件下载地址,非常清晰:
DBANK网盘下载地址:C语言也能干大事全集
VeryCD(电驴)资源地址:《计算机自学宝典之-九阳神功》(c语言也能干大事aspNET编程开放课程单片机java教程PDF电子书WEB开发eclipse实战C#rupeng软件公开课.net培训)更新第11季.net视频打包更新[压缩包]
注:有些朋友反映在线观看的视频看不清楚,而提供的DBANK下载地址和电驴下载地址下载速度又太慢。如果大家有相似情况,可以在本文下方评论中留下邮箱地址,注明“需要C语言学习视频教程:C语言也能干大事,邮箱地址xxxx@xxx”。我会在看到评论后将视频给大家发送到邮箱。
1、如鹏网的《C语言也能干大事》视频教程,非常推荐,详细介绍见http://www.rupeng.com/forum/thread-2487-1-1.html
如果是教育网用户,可以去东北大学的IPV6分享论坛下载。六维下载地址:http://bt.neu6.edu.cn/viewthread.php?tid=376083
如果是电信或网通用户,百度和电驴上也都能搜的到。
不多作解释,开始介绍。
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
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使用方法及命令详解》
[cc lang=”c++”]char numHex[2] = {0x12,0x34};
int numDec = 0;
numDec = numHex[0]; //存入0x12,存放在了低位
numDec = numDec << 8 | numHex[1]; //将0x12移位,0x34存入低位 cout << numDec << endl;[/cc]
动态调用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,非常常见。
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
从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)。
检查C:\Program Files\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入。加入后需要注销当前Windows用户(或重启)后重新登陆才生效。(可以在任务管理器里重启explorer.exe)
菜单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
然后选择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
从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)。
检查C:\Program Files\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入。加入后需要注销当前Windows用户(或重启)后重新登陆才生效。(可以在任务管理器里重启explorer.exe)
菜单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
然后选择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
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
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++,但同时要谨记你在做什么——如果你的代码并不真的需要所有梦幻抽象,那就不要勉强使用它们;不要仅仅因为你写的代码是.cpp,你使用了C++编译器,就使用类或是模板。